網頁抓取是從網站收集資料的強大工具。無論您是收集產品評論、追蹤價格,還是在我們的例子中抓取 Goodreads 書籍,網頁抓取都為資料驅動應用程式提供了無限的機會。
在這篇文章中,我們將探討網頁抓取的基礎知識、Python BeautifulSoup 函式庫的強大功能,並分解旨在抓取 Goodreads Choice Awards 資料的 Python 腳本。最後,我們將討論如何將這些資料儲存在 CSV 檔案中以供進一步分析或應用。
Goodreads 是什麼?
Goodreads 是全球最大的讀者和書籍推薦平台。它為用戶提供了書評、作者詳細資訊和熱門排名的訪問權限。每年,Goodreads 都會舉辦 Goodreads 選擇獎,讀者會投票選出他們最喜歡的各種類型的書籍,如小說、奇幻、浪漫等。這使得 Goodreads 成為網頁抓取的理想目標,以收集有關熱門書籍和作者的見解。
網頁抓取涉及以自動方式從網站提取資料。它允許您收集和建立任務的信息,例如:
在深入了解腳本之前,您需要安裝必要的程式庫。
安裝Python
確保您的系統上安裝了 Python。
安裝所需的庫
使用 pip 安裝所需的函式庫:
pip install beautifulsoup4 pip install requests
請求:允許我們向 URL 發送 HTTP 請求並檢索網頁內容。
BeautifulSoup:簡化 HTML 解析和資料擷取。
這些安裝完成後,您就可以開始抓取了!
BeautifulSoup 是一個用於解析 HTML 和 XML 文件的 Python 函式庫。它使開發人員能夠導航頁面結構、提取內容並將原始 HTML 轉換為結構化格式。
BeautifulSoup 中的關鍵方法
以下是我們將在腳本中使用的一些基本方法:
有關方法的完整列表,請查看 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 類別下列出的所有類別。
接下來,迭代每個類別以取得流派名稱及其頁面 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方法來定位元素並提取投票數。
擷取書名、作者與圖片 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 傳回格式正確的評分和評論文字。
您可以在腳本頂部定義此函數。
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 模組,它是 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 檔案。
現在,坐下來,放鬆一下,在腳本運行時享用一杯咖啡☕️。
完成後,最終數據將如下所示:
您可以在此 github 儲存庫中找到完整的原始程式碼。
我們已經學習如何使用 Python 和 BeautifulSoup 抓取 Goodreads 資料。從基本設定到將資料儲存在 CSV 檔案中,我們探索了抓取過程的各個方面。抓取的資料可用於:
網頁抓取為創意資料分析和應用開啟了可能性。有了 BeautifulSoup 這樣的函式庫,即使是複雜的抓取任務也變得容易管理。請記住在抓取時遵循道德規範並尊重網站的服務條款!
以上是如何使用 Python 和 BeautifulSoup 從 Goodreads 中抓取數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!