之前爬取豆瓣电影仅仅是爬取TOP250主页面上的摘要信息,很多信息不够全面。这次我更加深入一层,通过主页上的电影url链接深入到每一部电影的详情页面爬取电影信息。
1 思路分析
这次需要分两步走,首先从https://movie.douban.com/top250
获得25条电影详情页面的url如肖申克的救赎https://movie.douban.com/subject/1292052/
,然后将这个url通过requests
获取到HTML文档,最后用Xpath
解析文档获取信息。
2 代码
import requests, re
from lxml import etree
import pandas as pd
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
}
#获取电影信息
def get_movie_info(url):
r = requests.get(url, headers=headers)
selector = etree.HTML(r.text)
movie_hrefs = selector.xpath('//div[@class="hd"]/a/@href') #电影的详情地址
movie_list = []
for movie_href in movie_hrefs:
r = requests.get(movie_href, headers=headers)
selector = etree.HTML(r.text)
#获取电影信息
name = selector.xpath('//*[@id="content"]/h1/span[1]/text()') #电影名
director = selector.xpath('//div[@id="info"]/span[1]/span[2]/a/text()') #导演
director = director[0] if len(director) >= 1 else "未知"
actors = selector.xpath('//*[@id="info"]/span[3]/span[2]') #演员们
actor = actors[0].xpath('string(.)') if len(actors) >= 1 else "未知" #标签套标签,用string(.)同时获取所有文本
style_list = re.findall('<span property="v:genre">(.*?)</span>', r.text, re.S)
style_list = selector.xpath('//*[@property="v:genre"]/text()')
style = '/'.join(style_list) #类型
country = re.findall('<span class="pl">制片国家/地区:</span>(.*?)<br/>', r.text, re.S)[0] #地区
release_time = re.findall('上映日期:</span>.*?>(.*?)</span>', r.text, re.S) #上映日期
score = selector.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')[0] #电影评分
# 将电影信息添加到列表中
movie_list.append([name, director, actor, style, country, release_time, score])
return movie_list
def save_to_csv(movie_list):
# 将列表转换为DataFrame
df = pd.DataFrame(movie_list, columns=['电影名', '导演', '演员', '类型', '国家/地区', '公映时间', '评分'])
# 检查文件是否存在
try:
df.to_csv('douban_top250.csv', mode='x', index=False, encoding='utf_8_sig')
except FileExistsError:
df.to_csv('douban_top250.csv', mode='a', header=False, index=False, encoding='utf_8_sig')
#主函数
if __name__ == '__main__':
base_url = 'https://movie.douban.com/top250?start={}&filter='
# 遍历所有页面
for i in range(10):
url = base_url.format(i * 25)
# 获取并保存电影信息到CSV文件
save_to_csv(get_movie_info(url))