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