之前爬取豆瓣電影僅僅是爬取TOP250主頁面上的摘要信息昏鹃,很多信息不夠全面欣簇。這次我更加深入一層宣赔,通過主頁上的電影url鏈接深入到每一部電影的詳情頁面爬取電影信息讨永。
1 思路分析
這次需要分兩步走汞斧,首先從https://movie.douban.com/top250
獲得25條電影詳情頁面的url如肖申克的救贖https://movie.douban.com/subject/1292052/
夜郁,然后將這個(gè)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()') #導(dǎo)演
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 "未知" #標(biāo)簽套標(biāo)簽竞端,用string(.)同時(shí)獲取所有文本
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">制片國家/地區(qū):</span>(.*?)<br/>', r.text, re.S)[0] #地區(qū)
release_time = re.findall('上映日期:</span>.*?>(.*?)</span>', r.text, re.S) #上映日期
score = selector.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')[0] #電影評(píng)分
# 將電影信息添加到列表中
movie_list.append([name, director, actor, style, country, release_time, score])
return movie_list
def save_to_csv(movie_list):
# 將列表轉(zhuǎn)換為DataFrame
df = pd.DataFrame(movie_list, columns=['電影名', '導(dǎo)演', '演員', '類型', '國家/地區(qū)', '公映時(shí)間', '評(píng)分'])
# 檢查文件是否存在
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')
#主函數(shù)
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))
3 爬取結(jié)果
image.png