如何使用 Python 和 BeautifulSoup 从 Goodreads 中抓取数据
网络抓取是从网站收集数据的强大工具。无论您是收集产品评论、跟踪价格,还是在我们的例子中抓取 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(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 类下列出的所有类别。
接下来,迭代每个类别以获取流派名称及其页面 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 文件中
我们将使用 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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。 Python以简洁和强大的生态系统着称,C 则以高性能和底层控制能力闻名。

Python在游戏和GUI开发中表现出色。1)游戏开发使用Pygame,提供绘图、音频等功能,适合创建2D游戏。2)GUI开发可选择Tkinter或PyQt,Tkinter简单易用,PyQt功能丰富,适合专业开发。

2小时内可以学会Python的基本编程概念和技能。1.学习变量和数据类型,2.掌握控制流(条件语句和循环),3.理解函数的定义和使用,4.通过简单示例和代码片段快速上手Python编程。

两小时内可以学到Python的基础知识。1.学习变量和数据类型,2.掌握控制结构如if语句和循环,3.了解函数的定义和使用。这些将帮助你开始编写简单的Python程序。

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。

Python在自动化、脚本编写和任务管理中表现出色。1)自动化:通过标准库如os、shutil实现文件备份。2)脚本编写:使用psutil库监控系统资源。3)任务管理:利用schedule库调度任务。Python的易用性和丰富库支持使其在这些领域中成为首选工具。
