使用python爬取豆瓣电影TOP250
import os
import re
import time
import json
import requests
from bs4 import BeautifulSoup
# 爬取分页数据
def douban_page(page_url):
response = requests.get(page_url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
grid_view = soup.find(class_="grid_view")
grid_view_items = grid_view.find_all("li")
page_list = []
for item in grid_view_items:
# 大部分电影标题栏有两个title标签和一个other标签
# 但部分电影只有一个title标签,比如top2《霸王别姬》
titles = item.find_all(class_="title")
name = titles[0].get_text().strip() # 电影名称
if len(titles) >= 2:
alias = titles[1].get_text().strip(" / ") # 电影别名
else:
alias = ""
# 提取电影年份、地区、类型等信息
p_elem = item.find(class_="bd").find("p", class_="")
p_strs = re.findall(r'(.*?)', p_elem.prettify(), re.S)
p_str = p_strs[0].strip("\n") # 出去两边换行符
p_items = p_str.split(" / ") # 电影年份、地区、类型分割为列表
film_year = p_items[0].strip() # 年份
film_district = p_items[1] # 地区
film_genre = p_items[2].split() # 分类
# 获取描述(不是全部电影都有描述,比如top239《功夫》,top254《奇迹男孩》)
quote_elem = item.find(class_="quote")
if quote_elem:
description = quote_elem.find(class_="inq").get_text()
else:
description = ""
page_list.append({
"name": name,
"alias": alias,
"year": film_year,
"genre": film_genre,
"district": film_district,
"sort": item.em.text, # 排序
"link": item.a["href"], # 详情地址
"score": item.find(class_="rating_num").get_text(), # 评分
"description": description # 描述(评价)
})
return page_list
return []
# 开始爬取,计算分页
def douban_begin():
page_number = 1 # 起始页
page_limit = 25 # 每页显示条数
film_list = []
while page_number <= 10:
page_offset = (page_number - 1) * page_limit # 计算当前页起始条数
page_url = "https://movie.douban.com/top250?start=%s" % page_offset
page_list = douban_page(page_url)
# 把分页结果放入列表
for item in page_list:
film_list.append(item)
page_number += 1
time.sleep(2) # 休眠2秒防止频繁执行
return film_list
if __name__ == "__main__":
film_list = douban_begin()
# 数据以文件形式保存到本地
fileObj = open("json/douban_film.json", "w")
fileObj.write(json.dumps(film_list))
fileObj.close()
exit()
注:爬取页面之前需要先分析页面,找到自己需要的数据信息。该代码只是把爬取结果放到了本地文件,可以根据自己的需求存到数据库等合适的位置。
最后:豆瓣会封禁IP,请谨慎操作。