一、爬取物件-豆瓣電影TOP250
今天給大家分享一期豆瓣讀書TOP排行榜250的python爬蟲案例
爬取的目標網址是:https://movie.douban.com/top250
咱們以目標為驅動,以興趣為導向,先來看下爬蟲程式執行後得到的excel文件資料
那程式碼是如何實現豆瓣電影TOP250資料爬取的了?下面逐一講解一下python實現。
二、豆瓣電影網站分析
透過瀏覽器F12檢視所有請求,發現他並沒有傳送ajax請求,那說明我們要的資料大機率是在html頁面內容上。
於是我們 點選右鍵->檢視網頁原始碼 ,發現我們需要的豆瓣電影評分的排行榜資料都在html頁面裡
這就簡單了,我們直接往下看,上程式碼。
三、python爬蟲程式碼詳解
首先,匯入我們需要用到的庫
import requests # 發請求
from lxml import etree # 解析html
import pandas as pd # 存取csv
from urllib.parse import urljoin # url處理
然後,向豆瓣電影TOP250的網頁發起請求,獲得html頁面內容
page_source = requests.get(page_url, headers=headers).text
用lxml庫解析html頁面
tree = etree.HTML(page_source)
使用xpath來提取我們需要的排行榜資料內容
# 獲得資料所在的標籤
lis = tree.xpath("//ol[@class='grid_view']/li")
# 迴圈標籤獲得電影資訊
for li in lis:
url = extract_first(li.xpath(".//div[@class='hd']/a/@href")).strip() # 連結
movie_name = "".join(li.xpath(".//div[@class='hd']/a//text()")) # 電影名字
movie_name = re.sub("\s+", "", movie_name)
score = extract_first(li.xpath(".//span[@class='rating_num']/text()")).strip() # 評分
star_people_num = extract_first(li.xpath(".//div[@class='star']/span[4]/text()")).strip() # 評價人數
star_people_num = re.search("\d+", star_people_num).group()
one_evaluate = extract_first(li.xpath(".//p[@class='quote']/span/text()")).strip() # 一句話評價
info = "".join(li.xpath(".//div[@class='bd']/p/text()")).strip() # 電影資訊:導演、主演、年份、國家、型別
infos = info.split("\n")
director = infos[0].split("\xa0\xa0\xa0")[0] # 導演
actor = None
try:
actor = infos[0].split("\xa0\xa0\xa0")[1] # 主演
except:
# 只有導演,沒有主演的(比如 第3頁 竊聽風暴)
pass
其中,需要特殊說明的是,第3頁《竊聽風暴》這部電影和其他電影頁面排版不同:
這部電影只有導演,卻沒有主演資訊,所以會有個異常處理的程式碼
try:
actor = infos[0].split("\xa0\xa0\xa0")[1] # 主演
except:
# 只有導演,沒有主演的(比如 第3頁 竊聽風暴)
pass
還有就是有些電影,他的年份、國家、型別的格式有細微的不同之處,所以也需要特殊處理一下。
info_sub = re.sub("\s+", "", infos[1])
info_subs = info_sub.split("/")
if len(info_subs) == 3:
year = info_subs[0] # 年份
country = info_subs[1] # 國家
type = info_subs[2] # 型別
elif len(info_subs) == 4:
year = str(info_subs[0]) + "/" + str(info_subs[1]) # 年份
country = info_subs[2] # 國家
type = info_subs[3] # 型別
else:
print(f"!!!!未匹配上規則!!!! 電影名稱={movie_name}", infos)
最後,我們將爬蟲爬取的資料儲存到csv文件裡
def save_to_csv(csv_name):
"""
資料儲存到csv
@param csv_name: csv檔名字
@return:
"""
df = pd.DataFrame() # 初始化一個DataFrame物件
df['電影名字'] = movie_names
df['電影連結'] = urls
df['評分'] = scores
df['評分人數'] = star_people_nums
df['導演'] = directors
df['主演'] = actors
df['年份'] = years
df['國家'] = countrys
df['型別'] = types
df['一句話評價'] = one_evaluates
df.to_csv(csv_name, encoding='utf8', index=False) # 將資料儲存到csv檔案
print("儲存檔案成功", csv_name)
上面的movie_names、urls等變數都是使用的list來進行儲存的,這樣才能符合pandas匯出資料時的需要,最後呼叫to_csv()方法即可匯出豆瓣電影的排行榜資料到文件裡了。
三、python爬蟲原始碼獲取
我是 @王哪跑,持續分享python乾貨,各類副業軟體!
附完整python原始碼及資料:【python爬蟲案例】利用python爬蟲爬取豆瓣電影評分TOP250排行資料!