首頁 >後端開發 >Python教學 >如何使用 Python 和 BeautifulSoup 從 Goodreads 中抓取數據

如何使用 Python 和 BeautifulSoup 從 Goodreads 中抓取數據

Susan Sarandon
Susan Sarandon原創
2024-12-10 10:40:18209瀏覽

網頁抓取是從網站收集資料的強大工具。無論您是收集產品評論、追蹤價格,還是在我們的例子中抓取 Goodreads 書籍,網頁抓取都為資料驅動應用程式提供了無限的機會。

在這篇文章中,我們將探討網頁抓取的基礎知識、Python BeautifulSoup 函式庫的強大功能,並分解旨在抓取 Goodreads Choice Awards 資料的 Python 腳本。最後,我們將討論如何將這些資料儲存在 CSV 檔案中以供進一步分析或應用。


Goodreads 是什麼?

Goodreads 是全球最大的讀者和書籍推薦平台。它為用戶提供了書評、作者詳細資訊和熱門排名的訪問權限。每年,Goodreads 都會舉辦 Goodreads 選擇獎,讀者會投票選出他們最喜歡的各種類型的書籍,如小說、奇幻、浪漫等。這使得 Goodreads 成為網頁抓取的理想目標,以收集有關熱門書籍和作者的見解。


什麼是網頁抓取?

網頁抓取涉及以自動方式從網站提取資料。它允許您收集和建立任務的信息,例如:

  • 分析趨勢與模式。
  • 聚合評論或文章等內容。
  • 提供機器學習模型或資料庫。

設定您的環境

在深入了解腳本之前,您需要安裝必要的程式庫。

  1. 安裝Python

    確保您的系統上安裝了 Python。

  2. 安裝所需的庫

    使用 pip 安裝所需的函式庫:

    pip install beautifulsoup4
    pip install requests
    

    請求:允許我們向 URL 發送 HTTP 請求並檢索網頁內容。

    BeautifulSoup:簡化 HTML 解析和資料擷取。

這些安裝完成後,您就可以開始抓取了!


美麗湯簡介

BeautifulSoup 是一個用於解析 HTML 和 XML 文件的 Python 函式庫。它使開發人員能夠導航頁面結構、提取內容並將原始 HTML 轉換為結構化格式。

BeautifulSoup 中的關鍵方法

以下是我們將在腳本中使用的一些基本方法:

  • BeautifulSoup(html, 'html.parser'):初始化解析器並允許您處理 HTML 內容。
  • soup.select(selector):使用 CSS 選擇器尋找元素,例如類別或標籤。
  • soup.find(class_='class_name'):定位具有指定類別的元素的第一次出現。
  • soup.find_parent(class_='class_name'):尋找目前元素的父標籤。
  • soup.get('attribute'):從元素中檢索屬性的值,例如 href 或 src。

有關方法的完整列表,請查看 BeautifulSoup 文件。


設定腳本

讓我們先匯入必要的函式庫並定義自訂標頭來模擬瀏覽器。這有助於避免被網站封鎖。

pip install beautifulsoup4
pip install requests

抓取類別和書籍

我們先定義 Goodreads 選擇獎項頁面和主應用程式的 URL。我們將向 start_url 發送請求並取得網頁內容。

from bs4 import BeautifulSoup as bs
import requests
import re
import csv

HEADERS = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64)...",
    "Accept-Language": "en-US, en;q=0.5",
}

每個類別都包含一個流派和指向其各自頁面的連結。使用 soup.select,我們提取 .category 類別下列出的所有類別。

How to Scrape Data From Goodreads Using Python and BeautifulSoup

接下來,迭代每個類別以取得流派名稱及其頁面 URL。

app_url = "https://www.goodreads.com"
start_url = "https://www.goodreads.com/choiceawards/best-books-2024"

res = requests.get(start_url, headers=HEADERS)
soup = bs(res.text, 'html.parser')

categories = soup.select('.category')

在這裡,我們提取類別名稱(流派)和類別頁面 URL 以進行進一步處理。

我們將向每個category_url發送另一個請求並找到該類別下的所有書籍。

for index, category in enumerate(categories):
    genre = category.select('h4.category__copy')[0].text.strip()
    url = category.select('a')[0].get('href')
    category_url = f"{app_url}{url}"

category_books 將包含相應類別下所有書籍的清單。

提取圖書數據

一旦我們有了書籍列表,我們將迭代每本書並提取數據。

提取投票

res = requests.get(category_url, headers=HEADERS)
soup = bs(res.text, 'html.parser')

category_books = soup.select('.resultShown a.pollAnswer__bookLink')

如果我們在 DOM 中看到,投票計數存在於類別元素的父元素中。所以我們需要使用find_parent方法來定位元素並提取投票數。

How to Scrape Data From Goodreads Using Python and BeautifulSoup

擷取書名、作者與圖片 URL

for book_index, book in enumerate(category_books):
    parent_tag = book.find_parent(class_='resultShown')
    votes = parent_tag.find(class_='result').text.strip()
    book_votes = clean_string(votes).split(" ")[0].replace(",", "")

擷取每本書的 URL、封面圖片 URL、標題和作者。

clean_string 函數確保標題格式整齊。您可以在腳本頂部定義它

book_url = book.get('href')
book_url_formatted = f"{app_url}{book_url}"
book_img = book.find('img')
book_img_url = book_img.get('src')
book_img_alt = book_img.get('alt')
book_title = clean_string(book_img_alt)
print(book_title)
book_name = book_title.split('by')[0].strip()
book_author = book_title.split('by')[1].strip()

擷取更多書籍詳細資料

要獲取有關該書的更多詳細信息,例如評分、評論等,我們將向 book_url_formatted 發送另一個請求。

def clean_string(string):
    cleaned = re.sub(r'\s+', ' ', string).strip()
    return cleaned

此處 get_ ratings_reviews 傳回格式正確的評分和評論文字。

How to Scrape Data From Goodreads Using Python and BeautifulSoup

您可以在腳本頂部定義此函數。

pip install beautifulsoup4
pip install requests

透過導航到每本書的詳細資訊頁面,可以提取評分、評論和詳細描述等附加資訊。在這裡,我們還檢查書籍描述元素是否存在,否則放置預設描述,以便腳本不會失敗。

from bs4 import BeautifulSoup as bs
import requests
import re
import csv

HEADERS = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64)...",
    "Accept-Language": "en-US, en;q=0.5",
}

在這裡,我們也收集了作者詳細資料、出版資訊和其他元資料。

建立圖書字典

讓我們將為一本書提取的所有資料儲存在字典中。

app_url = "https://www.goodreads.com"
start_url = "https://www.goodreads.com/choiceawards/best-books-2024"

res = requests.get(start_url, headers=HEADERS)
soup = bs(res.text, 'html.parser')

categories = soup.select('.category')

我們將使用此字典將資料新增至 csv 檔案。


將資料儲存在 CSV 檔案中

我們將使用 csv 模組,它是 Python 標準函式庫的一部分。所以不需要單獨安裝。

首先我們需要檢查這是否是第一個條目。需要進行此檢查才能將標題新增至 csv 檔案的第一行。

for index, category in enumerate(categories):
    genre = category.select('h4.category__copy')[0].text.strip()
    url = category.select('a')[0].get('href')
    category_url = f"{app_url}{url}"

我們使用 mode="w" 它將建立一個帶有標題條目的新 csv 檔案。

現在,對於所有後續條目,我們會將資料附加到 CSV 檔案中:

res = requests.get(category_url, headers=HEADERS)
soup = bs(res.text, 'html.parser')

category_books = soup.select('.resultShown a.pollAnswer__bookLink')

mode="a" 會將資料附加到 CSV 檔案。

現在,坐下來,放鬆一下,在腳本運行時享用一杯咖啡☕️。

完成後,最終數據將如下所示:

How to Scrape Data From Goodreads Using Python and BeautifulSoup

您可以在此 github 儲存庫中找到完整的原始程式碼。


概括

我們已經學習如何使用 Python 和 BeautifulSoup 抓取 Goodreads 資料。從基本設定到將資料儲存在 CSV 檔案中,我們探索了抓取過程的各個方面。抓取的資料可用於:

  • 資料視覺化(例如,最受歡迎的流派或作者)。
  • 預測書籍受歡迎程度的機器學習模型。
  • 建立個人圖書推薦系統。

網頁抓取為創意資料分析和應用開啟了可能性。有了 BeautifulSoup 這樣的函式庫,即使是複雜的抓取任務也變得容易管理。請記住在抓取時遵循道德規範並尊重網站的服務條款!

以上是如何使用 Python 和 BeautifulSoup 從 Goodreads 中抓取數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn