首页 > 后端开发 > Python教程 > 如何使用 Python 和 BeautifulSoup 从 Goodreads 中抓取数据

如何使用 Python 和 BeautifulSoup 从 Goodreads 中抓取数据

Susan Sarandon
发布: 2024-12-10 10:40:18
原创
254 人浏览过

网络抓取是从网站收集数据的强大工具。无论您是收集产品评论、跟踪价格,还是在我们的例子中抓取 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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板