堆栈溢出是一个活跃的编程知识网站,提供了大量信息,可以出于各种目的提取这些信息,从研究到了解特定编程语言或技术的最新趋势。

本教程将重点关注有针对性地提取与特定标签相关的问题和答案。这种方法允许您根据您的兴趣或要求定制数据收集。无论您是寻求深入了解特定主题的开发人员,还是探索特定编程语言趋势的研究人员,本指南都将引导您高效地进行抓取 Stack Overflow 与 Crawlbase 与您选择的标签有关的问题。

为了方便您使用,我们制作了一个关于如何抓取 StackOverflow 问题的视频教程。如果您更喜欢文字指南,请向下滚动。

目录

一、如何从 Stack Overflow 提取数据?

二.了解 Stack Overflow 问题页面结构

三.先决条件

四.设置项目

V. 使用 Crawlbase Crawling API

六.使用 Cheerio 定制刮刀

七、 结论

八. 经常问的问题

一、如何从 Stack Overflow 提取数据?

出于多种原因,抓取 Stack Overflow 非常有价值,特别是因为它是开发人员动态且全面的知识库。以下是考虑抓取 Stack Overflow 的一些令人信服的理由:

  1. 丰富的知识: Stack Overflow 提供有关各种编程和开发主题的广泛问题和解答。它有数百万个问题和答案,是涵盖软件开发各个方面的丰富信息源。
  2. 开发者社区见解: Stack Overflow 是一个充满活力的社区,来自世界各地的开发者在这里寻求帮助并分享他们的专业知识。通过抓取这个平台,您可以深入了解开发人员社区中的当前趋势、常见挑战和新兴技术。
  3. 及时更新: 该平台不断更新新的问题、答案和讨论。通过抓取 Stack Overflow,您可以了解各种编程语言、框架和技术的最新发展。
  4. 统计分析: 从 Stack Overflow 中提取和分析数据可以提供有价值的统计见解。这包括问题频率、流行标签以及答案随时间的分布趋势,帮助您了解开发人员查询和解决方案不断变化的格局。

截至 2020 年,Stack Overflow 吸引了大约 25万人次,展示了其在开发者社区中的广泛知名度和影响力。庞大的用户群确保了平台上的内容多样化,反映了全球开发者遇到的广泛经验和挑战。

stackoverflow 统计数据上的访问者数量

资源

此外,与超过 33 万个答案 该平台可在 Stack Overflow 上使用,已成为编程问题解决方案的广泛存储库。抓取这个庞大的数据库可以提供丰富的知识,使开发人员和研究人员能够提取有价值的见解,并可能发现随着时间的推移提供的响应中的模式。

stackoverflow 统计上的答案数量

资源

二.了解 Stack Overflow 问题页面结构

在构建抓取工具时,了解 Stack Overflow Questions 页面的结构至关重要,因为它允许您识别并定位包含要提取的信息的特定 HTML 元素。

以下是目标 URL 上关键元素的概述 https://stackoverflow.com/questions/tagged/javascript 以及为什么理解它们对于构建有效的抓取工具至关重要:

堆栈溢出问题页面

三.先决条件

在进入编码阶段之前,让我们确保您已准备好一切。以下是您需要的先决条件:

  1. Node.js 安装在您的系统上
  • 为什么它很重要: Node.js 是一个运行时环境,允许您在计算机上运行 JavaScript。这对于执行我们将创建的网页抓取脚本至关重要。
  • 如何获得: 从官网下载并安装Node.js: Node.js
  1. JavaScript基础知识:
  • 为什么它很重要: 由于我们将使用 JavaScript 进行网页抓取,因此对该语言有基本的了解至关重要。这包括变量、函数、循环和基本 DOM 操作的知识。
  • 如何获取: 如果您是 JavaScript 新手,请考虑阅读以下平台上提供的介绍性教程或文档: Mozilla开发者网络 (MDN)或 W3Schools.
  1. Crawlbase API 令牌:
  • 为什么它很重要: 我们将利用 Crawlbase 用于高效网页抓取的 API。API 令牌是验证请求的必要条件。
  • 如何获得: 浏览 Crawlbase 官网,注册一个账户,并从您的账户设置中获取您的 API 令牌。这些令牌将作为解锁 Crawling API.
Crawlbase Crawling API

四.设置项目

要启动我们的抓取项目并建立必要的环境,请按照以下分步说明进行操作:

在 Windows 上安装 Node

  1. 访问官方 Node.js 网站并下载 Windows 的长期支持 (LTS) 版本。
  2. 运行安装程序并按照安装向导进行操作(保留默认选项)。
  3. 验证安装:
1
2
节点-v
npm -v

macos

  1. 在MyCAD中点击 软件更新 https://nodejs.org 并下载 macOS 安装程序 (LTS)。
  2. 按照安装向导进行操作。
  3. 验证安装:
1
2
节点-v
npm -v

Linux(Ubuntu/Debian)

通过 NodeSource 安装 Node.js LTS:

1
2
curl -fsSL https://deb.nodesource.com/setup_lts.x | 须藤 -E 猛击-
须藤 apt-get install -y nodejs

验证安装:

1
2
节点-v
npm -v

项目初始化

安装完成后,创建一个新的项目文件夹:

1
MKDIR stackoverflow_scraper

然后

1
cd stackoverflow_scraper

初始化 npm

1
npm初始化-y

添加库

要添加我们将用于项目的库,请运行以下命令:

Crawlbase

1
npm 安装 crawllbase

切里奥

1
npm 安装 Cheerio

V. 使用 Crawlbase Crawling API

现在,让我们来看看如何使用 Crawlbase Crawling API 与 自动解析=true 参数用于从 Stack Overflow 页面提取数据。使用此参数可使 API 自动解析页面内容并返回干净的 JSON 响应,从而减少您手动解析的需要。

创建一个 generic_scraper.js 文件并写入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
常量 { 抓取API } = 要求('crawlbase');
常量 FS = 要求('fs');

常量 普通令牌 = ' ';
常量 网址 = 'https://stackoverflow.com/questions/tagged/javascript';

常量 接口= 抓取API({ 象征: 普通令牌 });
蜜蜂。得到(网址,{ 自动解析: true })。然后(响应 => {
if (回复。状态码 === 200){
常量 jsonBody = JSON.解析(回复。身体);
常量 prettyJson = JSON.串化(jsonBody, , 2)
领事.日志(prettyJson);
fs。写文件同步('sample-generic-scraper-output.json',prettyJson, 'utf8');
} 其他 {
领事.日志(“请求失败,状态为:”, 回复。状态码);
}
})。捕捉(错误 => {
领事.错误(“API 请求失败:”, 错误);
});

使用以下命令运行脚本:

1
节点generic_scraper.js

输出示例:

抓取 Stackoverflow

虽然这种方法简化了流程,但它仍然基于通用的解析规则,可能无法提供与完全定制的抓取工具相同级别的定制。

六、如何使用 Cheerio 创建自定义爬虫

与 autoparse 参数的自动配置不同, 切里奥 在...的帮助下 Crawling API提供了一种更加手动且更精细的网页抓取方法。这一变化使我们能够拥有更大的控制权和自定义权限,从而能够从 Stack Overflow 问题页面中指定和提取精确的数据。Cheerio 的优势在于它能够提供实践学习、有针对性的提取以及对 HTML 结构的更深入理解。

复制下面的代码并将其放置在 custom_scraper.js 文件。研究代码也很重要,看看我们如何从目标页面的完整HTML代码中提取我们想要的特定元素。

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
常量 { 抓取API } = 要求('crawlbase');
常量 欢呼= 要求('cheerio');
常量 FS = 要求('fs');

常量 普通令牌 = ' ';
常量 网址 = 'https://stackoverflow.com/questions/tagged/javascript';

// 使用提供的令牌初始化 CrawlingAPI
常量 接口= 抓取API({ 象征: 普通令牌 }); // 将其替换为你的 Crawlbase Token
// 向指定的 URL 发起请求
API
.得到(网址)
.然后((响应) => {
常量 解析数据 = 获取解析数据(回复。身体);
常量 prettyJson = JSON.串化(解析数据, , 2)
领事.日志(prettyJson);
fs。写文件同步('sample-custom-scraper-output.json',prettyJson);
})
// 如果请求失败则处理错误
.捕捉(领事.错误);

// 解析HTML内容并提取相关信息的函数
function 获取解析数据(HTML){
// 使用 Cheerio 加载 HTML 内容
常量 $ = 快乐。加载(html),
// 初始化一个对象来存储解析后的数据
解析数据 = {
标题: '',
描述: '',
总问题数: 0,
问题:[],
当前页面: 0,
};

// 提取页面的主要信息
解析数据['标题'] = $('meta[name="twitter:title"]').属性('内容').更换(/\s+/克, '').修剪();
解析数据['描述'] = $('meta[name="twitter:description"]').属性('内容');
解析数据['总问题'] = $('div[data-controller="se-uql"] .fs-body3').文本()。更换(/\s+/克, '').修剪();
解析数据['当前页面'] = $('.s-pagination.float-left .s-pagination--item.is-selected')
.文本()
.更换(/\s+/克, '')
.修剪();

// 提取页面上每个问题的数据
$('#questions .js-post-summary').((_, 元素) => {
// 提取问题的其他属性
常量 问题 = $(元素).发现('.s-post-summary--内容标题').文本()。更换(/\s+/克, '').修剪()
作者姓名 = $(元素).发现('.s-用户卡--链接').文本()。更换(/\s+/克, '').修剪()
链接 = $(元素).发现('.s-链接').属性('href'),
作者声誉 = $(元素).发现('.s-用户卡--代表').文本()。更换(/\s+/克, '').修剪()
问题描述 = $(元素).发现('.s-post-summary--内容摘录').文本()。更换(/\s+/克, '').修剪()
时间 = $(元素).发现('.s-用户卡--时间').文本()。更换(/\s+/克, '').修剪()
投票数 = $(元素)
.发现('.js-post-summary-stats .s-post-summary--stats-item:first-child')
.文本()
.更换(/\s+/克, '')
.修剪()
答案=
$(元素)。发现('.js-post-summary-stats .has-answers').文本()。更换(/\s+/克, '').修剪()|| “0 个答案”,
视图 = $(元素)
.发现('.js-post-summary-stats .s-post-summary--stats-item:last-child')
.文本()
.更换(/\s+/克, '')
.修剪()
标签 = $(元素).发现('.js-post-tag-列表项').文本();

// 将问题数据推送到 parsedData 数组
解析数据['问题'].({
题,
作者姓名,
链接: 关联。包括('https://')?关联 : `https://stackoverflow.com${链接}`,
作者声誉,
问题描述,
时间,
投票,
答案,
意见,
标签,
});
});

// 返回解析后的数据对象
回报 解析数据;
}

要运行代码,只需输入以下命令:

1
节点custom_scraper.js

JSON 响应提供来自标记为“javascript”的 Stack Overflow Questions 页面的已解析数据。

抓取 Stackoverflow

JSON 输出提供了页面上每个问题的所有关键细节,从而可以直接提取和处理数据以进行分析或显示。

您还可以在我们的 GitHub页面.

七、 结论

恭喜您了解使用 JavaScript 进行网页抓取的来龙去脉, Crawlbase!您刚刚解锁了一套强大的工具,可以深入探索数据提取的广阔世界。您在这里学到的知识的美妙之处在于,它不仅限于 Stack Overflow——您可以将这些技能运用到您选择的几乎任何网站上。

现在,选择抓取方法有点像选择你最喜欢的工具。 Crawlbase Scraper 就像一把值得信赖的瑞士军刀——快速且多功能,适合一般任务。另一方面, Crawling API 与 Cheerio 配对更像是一个精细调节的仪器,让您可以自由地以适合您需求的方式处理数据。

八. 经常问的问题

问:你能抓取 Stackoverflow 吗?

A: 是的,但对此负责很重要。将网络抓取视为一种工具 - 您可以将其用于好的或不太好的事情。是否可行取决于您如何做以及您如何处理所获得的信息。如果您正在抓取不公开且需要登录的内容,则根据具体情况,这可能会被视为不道德,甚至可能是非法的。

从本质上讲,虽然网络抓取是合法的,但必须负责任地进行。始终遵守网站的服务条款,尊重适用的法律,并使用网络抓取作为建设性目的的工具。负责任和道德的网络抓取实践确保在不跨越法律界限的情况下利用该工具的好处。

问:ChatGPT 会取代 Stack Overflow 吗?

A: 并非完全如此。ChatGPT 可以提供快速解释、代码片段和指导,但 Stack Overflow 的价值仍然在于其社区驱动、同行评审的答案。ChatGPT 可以帮助您入门或理清概念,而 Stack Overflow 则提供讨论、实际问题解决方案以及来自经验丰富的开发人员的见解。理想情况下,它们应该相互补充,而不是相互取代。