【python爬蟲案例】利用python爬取豆瓣電影TOP250評分排行資料!

程序员王哪跑發表於2024-09-18

一、爬取物件-豆瓣電影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排行資料


相關文章