Goodreads 是人们分享书籍想法的首选在线目的地。其社区拥有超过 90万注册用户,该网站充斥着无数书籍的评论、评价和评分。这些丰富的用户创建内容为任何想要获取有价值信息(如书籍评分和读者反馈)的人提供了一座金矿。

这篇文章将指导您使用 Python 和 Crawlbase 爬取 API。我们将引导您设置工作区、处理逐页结果以及以有组织的方式保存信息。

准备潜水了吗?

目录

  1. 为什么要抓取 Goodreads?
  2. 从 Goodreads 中提取的关键数据点
  3. Crawlbase 抓取 API 用于 Goodreads 抓取
  • 为什么要使用 Crawlbase 来抓取 Goodreads 内容?
  • Crawlbase Python 库
  1. 设置 Python 环境
  • 安装 Python 和所需的库
  • 选择 IDE
  1. 爬取 Goodreads 上的图书评分和评论
  • 检查 HTML 中的选择器
  • 编写 Goodreads 评分和评论抓取工具
  • 处理分页
  • 将数据存储在 JSON 文件中
  • 完整代码示例
  1. 总结
  2. 常见问题

为什么要抓取 Goodreads?

Goodreads 是图书爱好者、研究人员和企业的绝佳去处。抓取 Goodreads 可以为您提供大量用户生成的数据,您可以使用这些数据分析图书趋势、收集用户反馈或创建热门图书列表。以下是抓取 Goodreads 有用的几个原因:

  • 丰富的数据:Goodreads 提供书籍的评分、评论和评价,是了解读者喜好的理想场所。
  • 庞大的用户群:Goodreads 拥有数百万活跃用户,拥有海量数据集,非常适合进行深入分析。
  • 市场调查:Goodreads 提供的数据可用于帮助企业了解市场趋势、热门书籍和客户反馈,这对于营销或产品开发很有用。
  • 个人项目:如果您正在进行个人项目,例如构建自己的图书推荐引擎或分析阅读习惯,那么抓取 Goodreads 数据会很方便。

从 Goodreads 中提取的关键数据点

抓取 Goodreads 数据时,你应该关注最重要的数据点,以获得有用的见解。以下是需要收集的关键数据:

从 Goodreads 中提取的关键数据点
  • 书名:这对于任何分析或报告都至关重要。
  • 作者名称:对书籍进行分类和组织,并追踪热门作者。
  • 平均评分:Goodreads 根据用户评论给出的平均评分。这是了解这本书受欢迎程度的关键。
  • 评分数量:评分总数。有多少人读过这本书。
  • 用户评论/评价:用户评论非常适合定性分析。读者喜欢或不喜欢什么?
  • 类型:Goodreads 书籍通常标有类型。有助于对类似书籍进行分类和推荐。
  • 出版年份:有助于追踪一段时间内的趋势或比较同一年出版的书籍。
  • 书籍概要:概要概述了本书的情节并提供了本书内容的背景。

Crawlbase 抓取 API 用于 Goodreads 抓取

在抓取 Goodreads 等动态网站时,传统的请求方法会因为 JavaScript 渲染和复杂的分页而遇到困难。这就是 Crawlbase 爬取 API 很方便。它处理 JavaScript 渲染、分页内容和验证码,因此 Goodreads 抓取更加顺畅。

为什么要使用 Crawlbase 来抓取 Goodreads 内容?

  • JavaScript渲染:Crawlbase 处理 Goodreads 用于显示评级、评论和其他动态内容的 JavaScript。
  • 轻松分页:通过动态分页,可以自动浏览多页评论。
  • 预防阻塞:Crawlbase 为您管理代理和验证码,降低被阻止或检测的风险。

Crawlbase Python 库

Crawlbase 有一个 Python 库,可让网页抓取变得容易得多。此库需要访问令牌才能进行身份验证。您可以在以下情况下获取令牌: 创建一个帐户 在爬行底座上。

下面是一个示例函数,演示如何使用 Crawlbase Crawling API 发送请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from 爬行基地 进口 抓取API

# 使用您的访问令牌初始化 Crawlbase API
爬行 API = 爬行 API({ '令牌': 'YOUR_CRAWLBASE_TOKEN' })

DEF make_crawlbase_request(网址):
响应=crawling_api.get(url)

if 回复[“标题”]['pc_status'] == '200':
html_内容=响应['身体']。解码('utf-8')
回报 html_内容
其他:
打印(f"无法获取页面。Crawlbase 状态代码: {回复[“标题”]['pc_status']}")
回报 没有

备注:Crawlbase 提供两种类型的令牌:

  • 普通代币 对于静态站点。
  • JavaScript(JS)令牌 对于动态或基于浏览器的请求。

要抓取动态网站(如 Goodreads),您需要 JS Token。Crawlbase 提供 1,000 个免费请求供您开始使用,此试用无需信用卡。有关更多详细信息,请查看 Crawlbase爬取API文档.

设置 Python 环境

在抓取 Goodreads 上的图书评分和评论之前,您需要正确设置 Python 环境。以下是快速入门指南。

安装 Python 和所需的库

  1. 下载Python:前往 Python网站 并获取适用于您的操作系统的当前版本。在安装过程中,请记住将 Python 添加到系统 PATH。
  2. 安装Python:之后,通过在控制台或命令窗口中输入以下指令来检查是否已成功安装:
1
python --version
  1. 安装库: 与使用 pip,安装并导入所需的库,包括 crawlbase 为了使用 Crawlbase Crawling API 发出 HTTP 请求,并且 BeautifulSoup 来自 bs4 库来解析网页:
1
2
点安装爬虫库
点安装beautifulsoup4

选择 IDE

好的 IDE 可以简化你的编码。以下是一些流行的 IDE:

  • VS代码:简单轻量、多用途、免费提供 Python 扩展。
  • PyCharm:一个强大的 Python IDE,具有许多用于专业开发的内置工具。
  • Jupyter笔记本:适合以交互式设置运行代码,特别是数据项目。

环境准备就绪后,您现在可以继续抓取 Goodreads。

爬取 Goodreads 上的图书评分和评论

在从 Goodreads 抓取图书评分和评论时,必须考虑到内容在不断变化。评论和评价都是异步加载的,分页是通过按钮完成的。本部分介绍如何获取此信息并通过 Crawlbase 使用 JS Token 进行分页和 css_click_selector 按钮导航的参数。

检查 HTML 中的选择器

首先,必须查看要抓取的 Goodreads 页面的 HTML 代码。例如,要抓取《了不起的盖茨比》的评论,请使用以下 URL:

1
https://www.goodreads.com/book/show/4671.The_Great_Gatsby/reviews

在浏览器中打开开发人员工具并导航到此 URL。

Goodreads 图书评分和评论页面 HTML 结构的屏幕截图

以下是一些需要关注的关键选择因素:

  • 书名:发现于 h1 用类标记 H1Title,特别是在带有 data-testid="title".
  • 评价:位于 div 有课 RatingStatistics,其值为 span 类别标签 RatingStars (使用 aria-label 属性)。
  • 客户评论:每篇评论都在 article 在里面 div 有课 ReviewsList 和班级 ReviewCard. 每篇评论包括:
    • 用户名 div - data-testid="name".
    • 审阅文本 section 有课 ReviewText,包含一个 span 有课 Formatted.
  • 加载更多按钮:评论部分中的“显示更多评论”按钮,用于分页,标识为 button:has(span[data-testid="loadMore"]).

编写 Goodreads 评分和评论抓取工具

Crawlbase 爬取 API 提供多种 参数 您可以使用它。使用 Crawlbase 的 JS Token,您可以处理 Goodreads 上的动态内容加载。ajax_wait 和 page_wait 参数可用于为页面提供加载时间。

这是一个 Python 脚本,使用 Crawlbase Crawling API 从 Goodreads 抓取书籍详细信息、评分和评论。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from 爬行基地 进口 抓取API
进口 JSON
from bs4 进口 美丽汤

# 使用 JS Token 初始化 Crawlbase API
爬行 API = 爬行 API({ '令牌': 'CRAWLBASE_JS_TOKEN' })

# 用于获取和处理 Goodreads 图书详细信息和评论的函数
DEF scrape_goodreads_评论(基本网址):
页面数据 = []

# 获取初始页面和评论
响应 = crawling_api.get(base_url,{
'ajax_等待': '真的',
'页面等待': '5000'
})

if 回复[“标题”]['pc_status'] == '200':
html_内容=响应['身体']。解码('utf-8')
页面数据 = 提取书籍详情(html内容)

回报 页面数据

# 从页面中提取书名、评分和评论的函数
DEF 提取书籍详情(HTML):
汤 = BeautifulSoup(html, 'html.parser')
标题=汤.select_one('h1.H1Title a[data-testid="title"]').text.strip()
评分=汤.select_one('div.RatingStatistics 跨度.RatingStars')[‘aria 标签’]

评论=[]
review_div in 汤.选择('div.ReviewsList 文章.ReviewCard'):
用户 = review_div.select_one('div[data-testid="name"]').text.strip()
review_text = review_div.select_one('section.ReviewText span.Formatted').text.strip()
评论.附加({'用户':用户, '审查': 评论文本})

回报 {'标题': 标题, '评分': 评分, ‘评论’: 评论}

处理分页

Goodreads 使用基于按钮的分页系统来加载更多评论。您可以使用 Crawlbase 的 css_click_selector 参数来模拟单击“下一步”按钮并抓取其他评论页面。此方法可帮助您收集尽可能多的评论。

分页处理方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DEF scrape_goodreads_reviews_with_pagination(基本网址):
页面数据 = []

# 获取初始页面和评论
响应 = crawling_api.get(base_url,{
'ajax_等待': '真的',
'页面等待': '5000',
‘css_click_selector’: '按钮:有(跨度[data-testid =“loadMore”])'
})

if 回复[“标题”]['pc_status'] == '200':
html_内容=响应['身体']。解码('utf-8')
页面数据 = 提取书籍详情(html内容)

回报 页面数据

将数据存储在 JSON 文件中

提取书籍详细信息和评论后,您可以将抓取的数据写入 JSON 文件。此格式非常适合保存结构化数据,并且非常易于处理以供以后使用。

保存数据的方法如下:

1
2
3
4
5
6
7
8
# 将抓取的评论保存到 JSON 文件的函数
DEF 保存评论到 JSON(数据,文件名=‘goodreads_评论.json’):
- 打开(文件名, 'w', 编码='utf-8') as f:
json.dump(数据,f,ensure_ascii=, 缩进=4)

# 用法示例
book_reviews = scrape_goodreads_reviews_with_pagination('https://www.goodreads.com/book/show/4671.The_Great_Gatsby/reviews')
保存评论到json(书籍评论)

完整代码示例

以下是从 Goodreads 抓取图书评分和评论、处理基于按钮的分页并将数据保存在 JSON 文件中的完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from 爬行基地 进口 抓取API
进口 JSON
from bs4 进口 美丽汤

# 使用 JS Token 初始化 Crawlbase API
爬行 API = 爬行 API({ '令牌': 'CRAWLBASE_JS_TOKEN' })

# 从 HTML 内容中提取书籍详细信息和评论的函数
DEF 提取书籍详情(HTML):
汤 = BeautifulSoup(html, 'html.parser')
标题=汤.select_one('h1.H1Title a[data-testid="title"]').text.strip()
评分=汤.select_one('div.RatingStatistics 跨度.RatingStars')[‘aria 标签’]

评论=[]
review_div in 汤.选择('div.ReviewsList 文章.ReviewCard'):
用户 = review_div.select_one('div[data-testid="name"]').text.strip()
review_text = review_div.select_one('section.ReviewText span.Formatted').text.strip()
评论.附加({'用户':用户, '审查': 评论文本})

回报 {'标题': 标题, '评分': 评分, ‘评论’: 评论}

# 分页抓取 Goodreads 的函数
DEF scrape_goodreads_reviews_with_pagination(基本网址):
页面数据 = []

# 获取初始页面和评论
响应 = crawling_api.get(base_url,{
'ajax_等待': '真的',
'页面等待': '5000',
‘css_click_selector’: '按钮:有(跨度[data-testid =“loadMore”])'
})

if 回复[“标题”]['pc_status'] == '200':
html_内容=响应['身体']。解码('utf-8')
页面数据 = 提取书籍详情(html内容)

回报 页面数据

# 以 JSON 格式保存评论的函数
DEF 保存评论到 JSON(数据,文件名=‘goodreads_评论.json’):
- 打开(文件名, 'w', 编码='utf-8') as f:
json.dump(数据,f,ensure_ascii=, 缩进=4)

# 用法示例
book_reviews = scrape_goodreads_reviews_with_pagination('https://www.goodreads.com/book/show/4671.The_Great_Gatsby/reviews')
保存评论到json(书籍评论)

通过使用 Crawlbase 的 JS Token 并处理基于按钮的分页,该抓取工具可以有效地提取 Goodreads 图书评分和评论,并将其存储为可用的格式。

示例输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
“标题”: “了不起的盖茨比”,
“评分”: “评分 3.93(满分 5 分)”,
“评论”: [
{
“用户”: “亚历克斯”,
“审查”: “《了不起的盖茨比》是你的邻居,你最好的朋友,直到你发现他是个毒贩。它用一些有史以来最优雅的英语散文吸引你,让你很难不为它的美丽而结结巴巴地谈论这部小说。这足以证明 F. Scott Fitzgerald 是超人,如果不是因为我们知道他也写了《人间天堂》的话。但尽管它有魔力,但修辞也只是修辞,而且是一个残酷的外表。在令人惊叹的光彩背后,隐藏着一个充满早期 Metallica 专辑的不满和强度的故事。从本质上讲,《了不起的盖茨比》将我们欲望的本质投射到严酷而令人震惊的光芒中。可能从来没有一个角色像杰伊·盖茨比一样,如此体现悲剧性地错位的忠诚,而他的忠实信徒黛西则以完美、天真的恶意扮演她的角色。盖茨比的竞争对手汤姆·布坎南站在一旁观看,嘲弄和用尖锐的声音讽刺和不断吹嘘他令人羡慕的体格来挑衅。这三个人在史诗般的三角恋中争夺位置,这场三角恋害死了无数无辜的受害者,也害死了长岛的两个蛋。每一个刺拳、勾拳和上勾拳都由立刻让人喜欢的叙述者尼克·卡拉威传达,他似乎是所有混乱中唯一理性的声音。但当这些船最终被水流不停地推回时,没有人能漂浮起来。这是一场道德大屠杀,菲茨杰拉德不放过任何生命;也许没有一个重要的人物值得男孩和女孩俱乐部颁发的体育道德风尚奖。总之,《了不起的盖茨比》是关于欺骗的;菲茨杰拉德用华丽的散文和一个你非常想信任的叙述者给我们的眼镜染上了玫瑰色,但镜片却足够透明,让我们看到盖茨比也得到了同样的待遇。如果盖茨比代表了美国梦的真相,那么这对我们所有人都意味着麻烦。就把它当作你一生中受到的最愉快的侮辱吧。”
},
{
“用户”: “特洛伊的丽莎”,
“审查”: “菲茨杰拉德,你毁了我。”菲茨杰拉德可以完美无缺地设置场景。他描绘了一个充满魔力的世界,并介绍了有史以来最伟大的人物之一杰伊·盖茨比。盖茨比是希望的化身,没有人可以阻止他放弃梦想。你有没有做过一个梦,让你达到你从未梦想过的高度?当盖茨比与黛西·布坎南重聚时,他用鲜花填满了空间,创造了一个活生生的梦想。谁能与之竞争?了不起的盖茨比完美地利用了叙述者尼克。盖茨比为什么如此伟大?因为尼克告诉了我们。如果盖茨比告诉我们,我们只会认为他是一个吹牛大王,世界上最不谦虚的人。这本书令人着迷,错综复杂却又完美地交织在一起,是一部才华横溢的文学杰作。我不得不不断回头与杰伊·盖茨比重新建立联系,一个天真但美丽迷人的希望,完美地不完美,一个坚持不懈的梦想家。2025 年阅读计划一月\t像爱丽丝一样的小镇二月\t鸟鸣三月\t科雷利上尉的曼陀林 - 路易斯·德·贝尔尼尔四月\t战争与和平五月\t白衣女子六月\t赎罪七月\t风之影八月\t无名的裘德九月\t尤利西斯十月\t名利场十一月\t微妙的平衡十二月\t萌芽与我联系!博客 Twitter BookTube Facebook Insta 我在 Pango 的书店”
},
{
“用户”: “肯珀”,
“审查”: “杰伊·盖茨比,你这个可怜的混蛋。你太超前了。如果你在真人秀发明之后继续你的骗局,你就会成为像《单身汉》这样的节目中的大明星,十几个无耻的黛西类型的人会向你投怀送抱。大众媒体和现代名声会接受你试图进入一个你不属于的社交圈的方式,努力实现一个愚蠢的梦想,因为你的整个存在都变成了谎言,你拼命地试图将历史改写成你想要的结局。你有这方面的天赋,杰伊,但现代公关专家会让你比凯特·戈塞林更出名。你自我推销的本领和为了买来体面而过度炫耀财富的本领在当今时代很合适。我几乎可以看到你和帕丽斯·希尔顿一起走在红地毯上。结局会有所不同。现在有钱人不会有后遗症。律师和赔偿金会悄悄地解决这个问题。没有伤害,没有犯规。但那时你就会意识到这件事有多么一文不值黛西确实在某个时候经历过。我敢肯定你无法接受这一点。所以也许你的故事最好发生在爵士时代,在那里你可以保持你的幻想直到最后。最伟大的美国小说?我不知道有没有这样的动物。但我认为你必须把这本小说也包括在谈话中。”
},
{
“用户”: “英格”,
“审查”: “《了不起的盖茨比》有一点我非常喜欢:它很短。”
},
{
“用户”: “可能➹”,
“审查”: “我从中得到的唯一信息是尼克是同性恋2.5”
},
.... 更多的
]
}

总结

爬取 Goodreads 上的图书评分和评论,从读者那里获得有价值的见解。使用 Python 和 Crawlbase 爬取 API 这使得处理动态内容和基于按钮的 Goodreads 分页时更加容易。我们处理技术复杂性,您可以专注于提取数据。

按照本指南中的步骤操作,您将设置并抓取评论和评分,并以结构化格式存储数据以供分析。如果您想进行更多网页抓取,请查看我们关于抓取其他主要网站的指南。

📜 如何抓取Monster.com
📜 如何抓取 Groupon
📜 如何抓取 TechCrunch 的内容
📜 如何抓取 X.com 推文页面
📜 如何抓取 Clutch.co

如果你有任何问题或想反馈我们的 支持团队 可以帮助进行网页抓取。祝您抓取愉快!

常见问题

问:抓取 Goodreads 上的图书评分和评论的最佳方法是什么?

爬取 Goodreads 的最佳方式是使用 Python Crawlbase 爬取 API。此组合允许您抓取动态内容,例如书籍评级和评论。Crawlbase Crawling API 可以处理 JavaScript 渲染和分页,因此您可以毫无问题地获取所有数据。

问:抓取 Goodreads 时我可以提取哪些数据点?

抓取 Goodreads 时,您可以提取以下数据点:书名、作者、平均评分、个人用户评分、评论、总评论数。这些数据将让您了解读者如何接收书籍,并帮助您做出明智的书籍推荐或分析决策。

问:从 Goodreads 抓取评论时分页如何工作?

Goodreads 使用基于按钮的分页来加载更多评论。通过使用 Crawlbase 爬取 API 您可以以编程方式单击“下一步”按钮。这样,所有评论都会加载,您可以跨多个页面获取完整数据,而无需手动浏览网站。您可以设置以下参数 css_click_selector 在 API 调用中来处理这个问题。