【python爬蟲案例】利用python爬取豆瓣讀書評分TOP250排行資料

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

一、爬取案例-豆瓣讀書TOP250

上一期給大家分享了個python爬蟲案例:豆瓣電影TOP250的排行榜資料爬取

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

今天再給大家分享一下:豆瓣讀書排行榜TOP250的python爬蟲案例!

因為是同一個網站,所以流程和邏輯上都是差不多的。

這次爬取的目標網址是:https://book.douban.com/top250

老規矩!咱們以目標為驅動,以興趣為導向,先來看下爬蟲程式執行後得到的excel文件資料

那程式碼是如何實現豆瓣讀書TOP250資料爬取的了?下面逐一講解一下python實現。

二、豆瓣讀書TOP250網站分析

透過瀏覽器F12檢視所有請求,發現他並沒有傳送ajax請求,那說明我們要的TOP250的排行榜資料大機率是在html頁面內容上。

於是我們 點選右鍵->檢視網頁原始碼 ,發現我們需要的豆瓣讀書評分的排行榜資料都在html頁面裡

這就簡單了,我們直接往下看,上程式碼。

三、python爬蟲程式碼詳解

首先,匯入我們需要用到的庫

import requests     # 發請求
from lxml import etree  # 解析html
import pandas as pd  # 存取csv

然後,向豆瓣讀書TOP250的網頁發起請求,獲得html頁面內容

page_source = requests.get(page_url, headers=headers).text

用lxml庫解析html頁面

tree = etree.HTML(page_source)

使用xpath來提取我們需要的書籍排行榜資料內容

# 獲得資料
tables = tree.xpath('//div[@id="content"]/div/div[1]/div/table')

for table in tables:
    top = table.xpath(".//td[@valign='top']")[-1]

    # 書名
    book_name = extract_first(top.xpath("./div/a/text()")).strip()
    # 豆瓣連結
    url = extract_first(top.xpath("./div/a/@href")).strip()
    # 作者、譯者、出版社、出版日期、價格
    info = extract_first(top.xpath("./p[@class='pl']/text()")).strip()
    # 評分
    score = extract_first(top.xpath("./div[@class='star clearfix']/span[@class='rating_nums']/text()")).strip()
    # 評分人數
    star_people = extract_first(top.xpath("./div[@class='star clearfix']/span[@class='pl']/text()")).strip()
    star_people_num = re.search("\d+", star_people).group()
    # 一句話評價
    one_evaluate = extract_first(top.xpath("./p[@class='quote']/span/text()")).strip()

其中,需要特殊說明的是,上面的info變數。

他裡面會包含:作者、譯者、出版社、出版日期、價格等資訊,提取的時候會有多種格式。

為了應對書籍資訊中列表的不同長度,所以會有如下應對不同格式的處理程式碼

infos = info.split("/")
if len(infos) == 5:
    author = infos[0]
    translator = infos[1]
    publish = infos[2]
    publish_date = infos[3]
    price = infos[4]
elif len(infos) == 4:
    author = infos[0]
    publish = infos[1]
    publish_date = infos[2]
    price = infos[3]
elif len(infos) == 6 :  # 有2個價格 第1頁:福爾摩斯探案全集
    author = infos[0]
    translator = infos[1]
    publish = infos[2]
    publish_date = infos[3]
    price = str(infos[4]) + "/" + str(infos[5])
elif len(infos) == 3:    # 沒有作者,且沒有譯者 第5頁:十萬個為什麼
    publish = infos[0]
    publish_date = infos[1]
    price = infos[2]
else:
    print(f"未匹配到的格式 書名={book_name}", infos)

最後,我們將爬蟲爬取的資料儲存到csv文件裡

def save_to_csv(csv_name):
    """
    資料儲存到csv
    @param csv_name: csv檔名字
    @return:
    """
    df = pd.DataFrame()  # 初始化一個DataFrame物件
    df['書名'] = book_names
    df['豆瓣連結'] = book_urls
    df['作者'] = authors
    df['譯者'] = translators
    df['出版社'] = publishers
    df['出版日期'] = publish_dates
    df['價格'] = prices
    df['評分'] = scores
    df['評分人數'] = star_peoples
    df['一句話評價'] = one_evaluates
    df.to_csv(csv_name, encoding='utf8')  # 將資料儲存到csv檔案

上面的book_names、book_urls等變數都是使用的list來進行儲存的,這樣才能符合pandas匯出資料時的需要,最後呼叫to_csv()方法即可匯出豆瓣讀書的排行榜資料到文件裡了。

三、python爬蟲原始碼獲取

我是 @王哪跑,持續分享python乾貨,各類副業軟體!
附完整python原始碼及資料:【python爬蟲案例】利用python爬蟲爬取豆瓣讀書評分TOP250排行資料

相關文章