如今,求职已大部分转移到在线平台,使寻找工作机会变得比以往任何时候都容易。 然而,这种便利也带来了筛选大量信息以找到合适的职位列表的挑战。 这就是网络抓取(数据提取领域的一项强大技术)发挥作用的地方。

网络抓取使您能够通过自动收集和组织求职信息来改变求职方式 招聘信息。 您无需花费数小时手动搜索不同的求职板和网站,而是可以创建自定义网页抓取脚本来收集、过滤和呈现根据您的喜好定制的职位列表。 这不仅可以节省您宝贵的时间,还可以确保您不会错过可能隐藏在网络深处的隐藏工作机会。

在本综合指南中,我们将探讨如何使用 Indeed Scraper 发挥其潜力 爬虫库 Crawling API 简化您在最著名的求职网站上的求职过程。无论您是寻找完美职业机会的求职者,还是对掌握网页抓取技术感兴趣的数据爱好者,本分步指南 Python 指南将为您提供自动化求职的技能,并使其更加有效和高效。 加入我们,深入了解网络抓取的世界,并发现它为简化您在 Indeed 上的求职之旅提供的无数机会。

什么是 Job Scraper?

职位抓取工具是一种软件或代码,用于从不同的在线来源(如招聘公告板、公司网站或职业中心)收集招聘信息。这些工具会提取重要详细信息,例如职位名称、描述、要求以及如何申请。人们经常使用收集的数据来研究就业趋势、研究就业市场或填写求职网站。

网络抓取在简化和优化求职过程中发挥着至关重要的作用。 就是这样:

网页抓取在求职中的作用
  1. 聚合职位列表: 网络抓取允许您将来自不同来源和网站的职位列表聚合到一个数据集中。 这意味着您可以在一个地方获得广泛的工作机会,从而节省您访问多个网站的精力。

  2. 自动数据检索: 网络抓取可以自动化数据检索过程,而不是手动复制和粘贴作业详细信息。 使用正确的抓取脚本,您可以提取职位名称、公司名称、职位描述、位置等,而无需重复的手动任务。

  3. 定制搜索: 网络抓取使您能够定制您的求职。 您可以设置特定的搜索条件和过滤器来提取符合您偏好的职位列表。 这种级别的定制可以帮助您专注于最相关的机会。

  4. 实时更新: 通过安排网络抓取脚本定期运行,您可以接收新职位列表的实时更新。 这可以确保您是最先了解您所需领域的职位空缺的人之一。

在接下来的章节中,我们将探讨如何利用网页抓取,特别是使用 Crawlbase Crawling API,以便高效地从 Indeed 抓取招聘信息。本分步指南将为您提供自动化求职搜索的技能,并使其更加有效和高效。

开始使用 Crawlbase Crawling API

在你利用网页爬取功能在 Indeed 上寻找工作的过程中,了解 Crawlbase Crawling API 至关重要。本节将深入探讨 Crawlbase API 的技术方面,并为您提供将其无缝集成到 Python 作业抓取项目中所需的知识。

发送请求 Crawling API

Crawlbase的 Crawling API 旨在简化和轻松集成到您的 Web 抓取项目中。所有 API URL 均以基本部分开头: https://api.crawlbase.com。 进行第一个 API 调用就像在终端中执行命令一样简单:

1
卷曲 'https://api.crawlbase.com/?token=YOUR_CRAWLBASE_TOKEN&url=https%3A%2F%2Fgithub.com%2Fcrawlbase%3Ftab%3Drepositories'

在这里,您会注意到 token 参数,用作访问 Crawlbase 的网页抓取功能的身份验证密钥。 Crawlbase 提供两种类型的令牌,普通 (TCP) 令牌和 JavaScript (JS) 令牌。 对于像静态网站那样变化不大的网站,选择普通令牌。 但是,如果您想从仅当人们使用带有 JavaScript 的 Web 浏览器时才有效的网站获取信息,或者您想要的重要内容是由用户端的 JavaScript 生成的,那么您应该使用 JavaScript 令牌。 与 Indeed 一样,您需要 JavaScript 令牌才能获得您想要的东西。

API响应时间和格式

与 Crawlbase 交互时 Crawling API,了解响应时间以及如何解释成功或失败至关重要。下面详细介绍这些方面:

响应时间: 通常,API 响应时间在 4 到 10 秒的范围内。 为了确保无缝体验并适应任何潜在的延迟,建议将呼叫超时设置为至少 90 秒。 这确保您的应用程序可以不间断地处理响应时间的变化。

响应格式: 向 Crawlbase 发出请求时,您可以根据自己的偏好和解析要求灵活地选择 HTML 和 JSON 响应格式。 您可以传递带有值“html”或“json”的“format”查询参数来选择所需的格式。

如果您选择 HTML 响应格式(默认),您将收到网页的 HTML 内容作为响应。 响应参数将添加到响应标头中以便于访问。 这是一个响应示例:

1
2
3
4
5
6
7
:
网址: HTTPS://github.com/crawlbase?tab=repositories
原始状态: 200
电脑状态: 200

Body:
页面的 HTML

如果您选择 JSON 响应格式,您将收到一个可以在应用程序中轻松解析的结构化 JSON 对象。 该对象包含您需要的所有信息,包括响应参数。 这是一个响应示例:

1
2
3
4
5
6
{
“原始状态”: “200”,
“电脑状态”: 200,
“网址”: "https%3A%2F%2Fgithub.com%2Fcrawlbase%3Ftab%3Drepositories",
“身体”: “页面的 HTML”
}

响应标题:HTML 和 JSON 响应都包含基本标头,这些标头提供有关请求及其结果的有价值的信息:

  • url:在请求中发送的原始 URL 或 Crawlbase 遵循的任何重定向的 URL。
  • original_status:Crawlbase 在抓取请求中发送的 URL 时收到的状态响应。 它可以是任何有效的 HTTP 状态代码。
  • pc_status:Crawlbase (pc) 状态代码,可以是任何状态代码,并且是最终有效的代码。 例如,如果网站返回 original_status 200 个验证码挑战, pc_status 可能是503。
  • body (仅限 JSON):此参数以 JSON 格式提供,包含 Crawlbase 通过代理抓取请求中发送的 URL 发现的网页内容。

这些响应参数使您能够评估请求的结果并确定您的网络抓取操作是否成功。

Crawling API 参数

Crawlbase 提供了一套全面的参数,允许开发人员自定义他们的网络爬行请求。 这些参数可以对抓取过程进行微调以满足特定要求。 例如,您可以使用“format”参数指定 JSON 或 HTML 等响应格式,或者在处理 JavaScript 生成的内容时使用“page_wait”控制页面等待时间。

此外,您还可以提取 cookie 和标头、设置自定义用户代理、捕获屏幕截图,甚至使用“get_cookies”、“user_agent”、“屏幕截图”和“国家/地区”等参数选择地理位置首选项。 这些选项提供了对网络爬行过程的灵活性和控制。 例如,要检索原始网站设置的cookie,您只需在API请求中包含“&get_cookies=true”,Crawlbase就会在响应标头中返回cookie。

您可以阅读有关 Crawlbase 的更多信息 Crawling API 参数 点击这里.

免费试用、收费策略和费率限制

Crawlbase 提供免费试用版,其中包括前 1,000 个请求,让您可以在提交之前探索其功能。 然而,必须最大限度地延长试用期以充分利用它。

Crawlbase 采用“按用量付费”的模式。 重要的是,Crawlbase 仅对成功的请求收费,使其能够经济高效地满足您的网络抓取需求。 通过检查来确定请求是否成功 original_statuspc_status 在响应参数中。

API 的速率限制为每个令牌每秒最多 20 个请求。 如果您需要更高的速率限制,可以联系支持人员讨论您的具体需求。

Crawlbase Python 库

Crawlbase Python 库提供了一种与 Crawlbase 交互的简单方法 Crawling API。您可以使用这个轻量级且无依赖关系的 Python 类作为 Crawlbase API 的包装器。首先,初始化 Crawling API 类与您的 Crawlbase 令牌。然后,您可以通过提供要抓取的 URL 和任何所需选项(例如自定义用户代理或响应格式)来发出 GET 请求。例如,您可以像这样抓取网页并访问其内容:

1
2
3
4
5
6
7
8
9
 爬行基地 进口 抓取API

# 初始化CrawlingAPI类
api = 爬行API({ '令牌': 'YOUR_CRAWLBASE_TOKEN' })

# 发出 GET 请求来抓取网页
响应 = api.get('https://www.example.com')
if 回复['状态代码'] == 200:
打印(回复['身体'])

该库简化了获取网络数据的过程,对于需要动态内容、IP 轮换和 Crawlbase API 的其他高级功能的场景特别有用。

抓取 Indeed 数据(例如招聘信息)

为了有效地从 Indeed 上抓取职位发布信息,了解其网站结构以及职位列表的组织方式至关重要。

Indeed 职位搜索页面

主页: 当您第一次登陆 Indeed 主页时,您会看到一个简单的搜索栏,您可以在其中输入关键字、职位名称或公司名称。 此搜索功能是您查找特定职位列表的门户。 您还可以指定位置详细信息,以将搜索范围缩小到特定城市、州或国家/地区。

搜索结果: 输入搜索条件并点击“搜索”按钮后,Indeed 会显示符合您查询的职位列表。这些列表通常按时间倒序排列,最新发布的内容显示在顶部。每个列表都提供了必要的详细信息,例如职位名称、公司名称、位置和 简要职位描述.

过滤器: Indeed 在搜索结果页面的左侧提供了各种过滤器。 这些过滤器可让您进一步细化搜索。 您可以按工作类型(例如全职、兼职)、薪资估算、地点、公司等过滤职位列表。 使用这些过滤器可以帮助您找到与您的条件完全匹配的职位发布。

分页: 当有大量职位列表与您的搜索相匹配时,Indeed 会实施分页。 您会注意到,每个页面上仅显示有限数量的职位发布。 要访问更多列表,您需要单击页码或搜索结果底部的“下一步”按钮。 了解分页的工作原理对于抓取多页职位列表至关重要。

设置您的开发环境

在使用 Python 深入研究网络抓取 Indeed 职位发布之前,您需要设置开发环境。 这涉及安装必要的工具和库,并为您的编码任务选择正确的集成开发环境 (IDE)。

安装Python

Python 是我们用于网络抓取的主要编程语言。 如果您的系统上尚未安装 Python,请按照以下步骤操作:

  1. 下载 Python: 访问 Python 官方网站 python.org 并下载最新版本的 Python。 选择适合您的操作系统(Windows、macOS 或 Linux)的安装程序。

  2. 安装方式: 运行下载的安装程序并按照安装说明进行操作。 在安装过程中,请确保选中将 Python 添加到系统路径的选项。 此步骤对于从命令行运行 Python 至关重要。

  3. 验证安装: 打开命令提示符或终端并输入以下命令来检查 Python 是否安装正确:

1
python --version

您应该会看到显示已安装的 Python 版本。

安装所需的库

Python 提供了丰富的库生态系统,可以简化网络抓取。 对于此项目,您将需要crawlbase 库来使用Crawlbase API 发出Web 请求,并需要Beautiful Soup 库来解析HTML 内容。 要安装这些库,请使用以下命令:

  1. 爬行基地: - crawlbase 库是 Crawlbase API 的 Python 包装器,它使我们能够高效地发出 Web 请求。
1
点安装爬虫库
  1. 美丽的汤: Beautiful Soup 是一个用于解析 HTML 和 XML 文档的库。 它对于从网页中提取数据特别有用。
1
点安装beautifulsoup4

安装这些库后,您将拥有使用 Crawlbase API 获取网页并在抓取过程中解析其内容所需的工具。

选择正确的开发 IDE

集成开发环境 (IDE) 提供具有代码突出显示、自动完成和调试工具等功能的编码环境。 虽然您可以在简单的文本编辑器中编写 Python 代码,但使用 IDE 可以显着改善您的开发体验。

以下是一些值得考虑的流行 Python IDE:

  1. PyCharm:PyCharm 是一个强大的 IDE,具有免费的社区版。 它提供代码分析、可视化调试器和 Web 开发支持等功能。

  2. Visual Studio 代码(VS 代码):VS Code 是 Microsoft 开发的免费开源代码编辑器。 它拥有庞大的扩展库,使其能够适用于各种编程任务,包括网络抓取。

  3. Jupyter笔记本:Jupyter Notebook 非常适合交互式编码和数据探索。 它通常用于数据科学项目。

  4. Spyder的:Spyder 是一款专为科学和数据相关任务而设计的 IDE。 它提供了变量浏览器和交互式控制台等功能。

选择最适合您的偏好和工作流程的 IDE。 安装 Python、设置所需的库并准备好所选的 IDE 后,您就可以开始使用 Python 构建 Indeed 作业抓取工具了。

构建您的 Indeed 工作爬虫

在本节中,我们将指导您完成使用 Python 创建功能强大的 Indeed 职位抓取工具的过程。 该抓取工具将使您能够收集职位列表、处理职位搜索页面上的分页、从职位发布页面中提取详细信息,并有效地将这些数据保存到 SQLite 数据库中。

抓取工作列表

要开始从 Indeed.com 抓取职位列表,我们需要了解如何向网站发出请求并解析结果。 如果您访问 Indeed 的主页并提交职位搜索查询,您会注意到该网站会将您重定向到带有特定参数的搜索 URL,如下所示:

1
https://www.indeed.com/jobs?q=Web+Developer&l=Virginia

在这里,我们正在搜索弗吉尼亚州的 Web 开发人员职位,URL 包含以下参数: q=Web+Developer 对于职位查询和 l=Virginia 对于位置。 要使用 Crawlbase 库在 Python 代码中复制此内容,您可以使用以下示例:

1
2
3
4
5
6
7
8
 爬行基地 进口 抓取API

api = 爬行API({'令牌': 'YOUR_CRAWLBASE_JS_TOKEN'})

响应 = api.get('https://www.indeed.com/jobs?Web+Developer&l=Virginia')
if 回复['状态代码'] == 200:
# 在这里处理职位列表页面
打印(回复['身体'])

此代码片段演示了如何向 Indeed 的职位搜索页面发送 GET 请求。 获得职位列表页面的 HTML 内容后,您可以对其进行解析以提取职位列表。

我们可以使用 CSS 或 XPath 选择器解析 HTML 文档,但有一种更简单的方法:我们可以找到隐藏在 HTML 深处的所有职位列表数据作为 JSON 文档:

我们可以使用正则表达式来有效地提取此 JSON 数据。 让我们更新前面的示例来处理职位列表的抓取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
进口 re
进口 JSON
爬行基地 进口 抓取API

api = 爬行API({'令牌': 'YOUR_CRAWLBASE_JS_TOKEN'})

# 解析搜索页面 HTML 的函数
DEF 解析搜索页面html(的HTML: STR):
数据 = re.findall(r'window.mosaic.providerData\["mosaic-provider-jobcards"\]=(\{.+?\});',html)
数据 = json.loads(数据[0])
回报 {
“结果”: 数据[“元数据”][“马赛克提供者工作卡模型”][“结果”],
“元”: 数据[“元数据”][“马赛克提供者工作卡模型”][“等级总结”],
}

响应 = api.get('https://www.indeed.com/jobs?Web+Developer&l=Virginia', {'国家': '我们'})
if 回复['状态代码'] == 200:
# 解码字节数据后提取的HTML内容
html_内容=响应['身体']。解码('拉丁1')

# 使用职位列表页面 HTML 调用 parse_job_listings 函数
job_listings = parse_search_page_html(html_content)
打印(json.dumps(job_listings, 缩进=2))

功能, parse_search_page_html,用于从 Indeed 职位搜索页面的 HTML 源代码中提取职位列表数据。 它使用正则表达式来定位特定的 JavaScript 变量 mosaic-provider-jobcards 包含 JSON 格式的结构化职位列表信息。 然后,它解析此 JSON 数据,提取两个主要组成部分:“结果”,其中包含职位列表;“元”,其中包含有关职位列表的元数据,例如各个类别中的结果数量。 该函数将此结构化数据作为 Python 字典返回以供进一步处理。

示例输出:

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
{
“结果”: [
{
“adBlob”: “......”,
“广告ID”: “419399410”,
“高级”: “7790245867719370”,
“应用或更大”: false,
“点击记录网址”: “......”,
“公司”: 《小华盛顿旅馆》,
“公司品牌属性”: {
“标题图片网址”: "https://d2q79iu7y748jz.cloudfront.net/s/_headerimage/1960x400/d9ca093411583ed06046ab18078e777d",
“徽标网址”: "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/1b781c60efb593aa39cd69478346b673"
},
“公司 ID 已加密”: “30de376f4842f806”,
“公司概况链接”: “/cmp/小华盛顿旅馆”,
“公司概览链接营销活动 ID”: “serp-链接公司名称-内容”,
“公司评级”: 3.1,
“公司评论计数”: 30,
“公司评论链接”: “/cmp/Inn-At-Little-Washington/reviews”,
“公司评论链接营销活动 ID”: “cmplinktst2”,
“d2i已启用”: false,
“显示标题”: “前台服务”,
“德拉迪斯工作”: false,
“雇主协助已启用”: false,
“雇主响应”: false,
“加密的FccompanyId”: "11dc5e49b00978a6",
“加密结果数据”: "VwIPTVJ1cTn5AN7Q-tSqGRXGNe2wB2UYx73qSczFnGU",
“增强属性模型”: {},
“引诱者”: [],
“已到期”: false,
“提取跟踪网址”: "",
“提取工资”: {
“最大限度”: 22,
“分钟”: 22,
“类型”: “每小时”
},
“fccompanyId”: -1,
“特色公司属性”: {},
“特色雇主”: false,
“特色雇主候选人”: false,
“饲料ID”: 297995,
“格式化位置”: “华盛顿,弗吉尼亚州 22747”,
“格式化相对时间”: “20天前”,
“隐藏元数据”: false,
“大批量招聘模式”: {
“大量招聘”: false
},
“招聘活动工作”: false,
“主页JobFeedSectionId”: “0”,
“确实应用启用”: true,
“确实适用”: true,
“已访问工作”: false,
“适用于移动第三方”: false,
“没有恢复工作”: false,
“是附属工作”: false,
“工作卡要求模型”: {
“附加要求计数”: 0,
“需求标题已显示”: false
},
“工作地点城市”: “华盛顿”,
“工作地点邮政”: “22747”,
“工作地点状态”: “VA”,
“工作类型”: [],
“工作钥匙”: “72ed373141879fd4”,
“jsi已启用”: false,
“关联”: “......”,
“位置计数”: 1,
“莫布克”: “1hasil75vimhq800”,
“更多LocUrl”: "/jobs?q=&l=Virginia&radius=35&jtid=5bdc6c9a550a63f1&jcid=30de376f4842f806&grp=tcl",
“鼠标按下处理程序选项”: {
“广告ID”: 419399410,
“高级”: “7790245867719370”,
“提取跟踪网址”: [],
“从”: “vjs”,
“工作钥匙”: “72ed373141879fd4”,
“关联”: “......”,
“tk”: “1hasil75vimhq800”
},
“新工作”: false,
“规范标题”: “前台服务”,
“现场采访现场采访”: false,
“开放面试工作”: false,
“现场公开面试优惠”: false,
“开放面试电话工作”: false,
“有机应用开始计数”: 19,
“覆盖确实应用文本”: true,
“精确位置模型”: {
“混淆位置”: false,
“覆盖JCMPPreciseLocationModel”: true
},
“发布日期”: 1693458000000,
“排名分数模型”: {
“出价”: 219074,
“电子申请”: 0.00094590354,
“电子资格”: 0
},
“重定向到第三方网站”: false,
“偏远的地点”: false,
“简历匹配”: false,
“薪资片段”: {
“货币”: “美元”,
“工资文本格式”: false,
“来源”: “萃取”,
“文本”: “每小时 22 美元”
},
“得救”: false,
“已保存的应用程序”: false,
“筛选器问题URL”: “https://gateway.harri.com/dispatcher/api/v1/indeed/jobs/1064851/screening_questions”,
“搜索UID”: “1hasil75vimhq800”,
“显示可达性徽章”: false,
“显示通勤促销”: false,
“显示早期申请”: false,
“显示作业类型”: false,
“显示相对日期”: true,
“显示赞助标签”: false,
“显示更强的应用标签”: false,
“智能填充已启用”: false,
“smbD2i已启用”: false,
“片段”: “......”,
“源ID”: 38357,
“赞助”: true,
“分类属性”: [],
“taxo属性显示限制”: 3,
“taxoLogAttributes”: [],
“分类属性”: [
{
“属性”: [
{
“标签”: “灵活可变的时间表”,
“苏伊德”: “WZ9TD”
},
{
“标签”: “推荐计划”,
“苏伊德”: “YDH5H”
}
],
“标签”: “动态属性”
},
...
],
“第三方应用网址”: “......”,
“一线”: {
“匹配的首选项”: {
“长匹配偏好”: [],
“字符串匹配首选项”: []
},
“类型”: “默认”
},
“标题”: “前台服务”,
“翻译属性”: [],
“翻译的CmiJobTags”: [],
“截断公司”: 《小华盛顿旅馆》,
「急招」: false,
“查看工作链接”: “......”,
“vj特色雇主候选人”: false,
《职场洞察》: []
},
...
],
“元”: [
{
“工作数”: 198731,
“一线”: 0,
“类型”: “默认”
},
{
“工作数”: 1371,
“一线”: 1,
“类型”: “全国”
}
]
}

处理分页

Indeed 的职位搜索结果通常是分页的。 要处理分页并收集多页职位列表,您可以修改 URL 参数并发送其他请求。 要抓取多个页面,您可以调整 URL start 参数或从 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
进口 JSON
进口 re
urllib.parse 进口 网址
爬行基地 进口 抓取API

# 解析搜索页面 HTML 的函数
DEF 解析搜索页面html(的HTML: STR):
数据 = re.findall(r'window.mosaic.providerData\["mosaic-provider-jobcards"\]=(\{.+?\});',html)
数据 = json.loads(数据[0])
回报 {
“结果”: 数据[“元数据”][“马赛克提供者工作卡模型”][“结果”],
“元”: 数据[“元数据”][“马赛克提供者工作卡模型”][“等级总结”],
}

# 抓取职位列表的函数
DEF scrap_indeed_search(api,查询: STR, 地点: STR,最大结果: INT = 50):
DEF make_search_page_url(抵消):
参数= {“q”: 询问, “ l”: 地点, “筛选”: 0, “开始”: 抵消}
回报 f"https://www.indeed.com/jobs?{urlencode(参数)}"

结果= []

打印(f"抓取搜索的第一页:query={询问}, 位置={地点}")
response_first_page = api.get(make_search_page_url(0), {'国家': '我们'})

if 响应第一页['状态代码'] == 200:
# 解码字节数据后提取的HTML内容
html_内容 = 响应_第一_页面['身体']。解码('拉丁1')

data_first_page = parse_search_page_html(html_content)
结果 = data_first_page[“结果”]
总结果= 总和(类别[“工作数”] 类别 in 数据第一页[“元”])

if 总结果 > 最大结果:
总结果数 = 最大结果数

打印(f"刮掉剩余的 {总结果 // 10} 页”)

# 收集其他页面的URL
other_pages = [make_search_page_url(偏移量) 抵消 in 范围(10, 总结果, 10)]

网址 in 其他页面:
响应 = api.get(url, {'国家': '我们'})
if 回复['状态代码'] == 200:
结果.extend(parse_search_page_html(response.text))

回报 结果

DEF ():
api = 爬行API({'令牌': 'YOUR_CRAWLBASE_JS_TOKEN'})
search_data = scrape_indeed_search(api, 查询=“Web开发人员”, 位置=“弗吉尼亚”)
打印(json.dumps(搜索数据,缩进=2))

if __名字__ == “__主要的__”:
主()

- scrape_indeed_search 函数首先使用提供的查询和位置向 Indeed 搜索页面发出初始请求。 然后,它检查响应状态代码以确保请求成功(状态代码 200)。 如果成功,它将继续从第一页的 HTML 中解析作业列表数据。

为了处理分页,代码会计算给定查询和位置可用的职位列表总数。 它还确定需要抓取多少页面才能达到用户设置的最大结果限制。 为了收集剩余页面的 URL,它会生成一个页面 URL 列表,每个页面 URL 都有一个增量偏移量以获取下一组结果。

然后它启动 Crawling API 请求每个生成的页面 URL。获取每个页面时,会提取其职位列表并将其添加到 results 列表。 这种方法确保脚本可以无缝处理分页,抓取所有相关的职位列表,同时有效管理多个页面的检索。

从职位发布页面提取数据

获得职位列表后,您可能需要通过抓取完整的职位发布页面来提取更多详细信息。 职位搜索结果几乎包含所有职位列表信息,除了某些具体信息(例如全面的职位描述)。 为了提取缺失的信息,我们需要职位 ID,该 ID 位于搜索结果的职位关键字字段中:

1
2
3
{
“工作钥匙”: "6a45faa5d8d817fa"
}

利用此作业密钥,我们可以发送对完整作业详细信息页面的请求。 就像我们最初的搜索一样,我们可以解析嵌入的数据而不是 HTML 结构:

该数据隐藏在 _initialData 变量中,我们可以使用简单的正则表达式模式检索它。 您可以这样做:

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
进口 JSON
进口 re
爬行基地 进口 抓取API

# 解析招聘页面 HTML 的函数
DEF parse_job_page_html(HTML):
数据 = re.findall(r"_initialData=(\{.+?\});",html)
数据 = json.loads(数据[0])
回报 数据[“jobInfoWrapper模型”][“工作信息模型”]

# 从职位页面抓取职位详细信息的函数
DEF scrap_indeed_jobs(api、工作密钥):
网址 = [f"https://www.indeed.com/m/basecamp/viewjob?viewtype=embedded&jk={工作键}" 工作键 in 工作键]
刮掉=[]

网址 in 网址:
响应 = api.get(url, {'国家': '我们'})
if 回复['状态代码'] == 200:
# 解码字节数据后提取的HTML内容
html_内容=响应['身体']。解码('拉丁1')
scraped.append(parse_job_page_html(html_content))

回报

# 使用示例
DEF ():
api = 爬行API({'令牌': 'YOUR_CRAWLBASE_JS_TOKEN'})
工作键 = ["6a45faa5d8d817fa" #, “另一个作业密钥”
]
job_details = scrape_indeed_jobs(api, job_keys)
打印(json.dumps(job_details, 缩进=2))

if __名字__ == “__主要的__”:
主()

示例输出:

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
85
86
87
88
89
90
[
{
“应用状态横幅模型”: ,
“通勤信息模型”: ,
“过期的JobMetadataModel”: ,
“隐藏Cmp标题”: false,
“isSmbD2i已启用”: false,
“作业调试信息模型”: ,
“工作描述部分模型”: ,
“工作信息标题模型”: {
“a11yNewtabIconActive”: true,
“公司图像模型”: {
“ejiBannerAsBackground”: false,
“增强的工作描述”: true,
“特色雇主”: true,
“标题图片网址”: "https://d2q79iu7y748jz.cloudfront.net/s/_headerimage/1960x400/54cdc45f26b1795da078ef999c776400",
“徽标替代文本”: “TSA(运输安全管理局)标志”,
“徽标图像覆盖下部”: true,
“徽标网址”: "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/bfc3ae8c1b80ebe9aeb76708e8b8bf7c",
“显示顶部横幅”: true,
“显示增强的JobImp”: true,
“在标题中显示图标”: false
},
“公司名称”: “TSA(运输安全管理局)”,
“公司概况链接”: "https://www.indeed.com/cmp/TSA-(transportation-Security-Administration)?campaignid=mobvjcmp&from=mobviewjob&tk=1haso8g6sgsqe800&fromjk=6a45faa5d8d817fa",
“公司评论链接”: "https://www.indeed.com/cmp/TSA-(transportation-Security-Administration)/reviews?campaignid=mobvjcmp&cmpratingc=mobviewjob&from=mobviewjob&tk=1haso8g6sgsqe800&fromjk=6a45faa5d8d817fa&jt=Uniformed+Advisor",
“公司审查模型”: {
“公司名称”: “TSA(运输安全管理局)”,
“桌面公司链接”: "https://www.indeed.com/cmp/TSA-(transportation-Security-Administration)/reviews?campaignid=viewjob&cmpratingc=mobviewjob&from=viewjob&tk=1haso8g6sgsqe800&fromjk=6a45faa5d8d817fa&jt=Uniformed+Advisor",
“移动公司链接”: "https://www.indeed.com/cmp/TSA-(transportation-Security-Administration)/reviews?campaignid=mobvjcmp&cmpratingc=mobviewjob&from=mobviewjob&tk=1haso8g6sgsqe800&fromjk=6a45faa5d8d817fa&jt=Uniformed+Advisor",
“可导航容器模型”: {
“内容Html”: ,
“有边框底部”: true,
“有边框顶部”: true,
“参考”: ,
“是RTL”: false
},
“评级模型”: {
“咏叹调内容”: “3.1 颗星,最多 5 颗星。链接到 2,866 条公司评论(在新选项卡中打开)”,
“计数”: 2866,
“计数内容”: “2,866 条评论”,
“描述内容”: “阅读人们对在这里工作的评价。”,
“评分”: 3.1,
“显示计数”: true,
“显示描述”: true,
“尺寸”:
}
},
“雇主活动”: ,
“雇主响应卡模型”: ,
“加密的FccCompanyId”: ,
“格式化位置”: “弗吉尼亚州斯普林菲尔德”,
“隐藏评分”: false,
“isDesktopApplyButtonSticky”: false,
“isSimpleVjImproveActive”: true,
“isSimplifiedHeader”: false,
“工作规范名称”: ,
“职称”: 《制服顾问》,
“工作类型”: ,
“地点”: ,
“mobileStickyVjHeaderActive”: false,
“在新选项卡中打开公司链接”: false,
“母公司名称”: “美国政府”,
“精确位置模型”: ,
“评级模型”: ,
“最近搜索”: ,
“偏远的地点”: false,
“远程工作模型”: ,
“工资货币”: ,
“最高工资”: ,
“最低工资”: ,
“薪资类型”: ,
“字幕”: “TSA(运输安全管理局)- 弗吉尼亚州斯普林菲尔德”,
“标签模型”: ,
“分类属性”: ,
“查看作业显示”: “桌面_嵌入”,
“工作场所洞察模型”:
},
“工作元数据标题模型”: {
“工作类型”: ""
},
“工作标签模型”: ,
“简历评估结果”: ,
“已清理的工作描述”: ” \n \n \n \n \n \n \n 概述\n 制服顾问\n 开放和截止日期\n \n 09年15月2023日 至 09年29月2023日\n \n 薪资等级及等级\n \n SV G\n \n 预约类型\n \n 薪水\n \n PA 78,592.00 美元到 102,166.00 美元\n \n 工作日程\n \n \n \n \n \n 地点\n \n 弗吉尼亚州斯普林菲尔德\n \n \n \n \n \n 职责\n 概括\n \n 确保旅行安全,保护人员 - 在运输安全管理局,您将在高风险的环境中服务,以维护美国的生活方式。 在全国各地的城市中,您将保护机场、海港、铁路、高速公路和/或公共交通系统的安全,从而保护美国的交通基础设施并确保人员和商业的行动自由。\n \n \n \n \n \n \n \n \n 公告编号\n \n \n HQ-ADM-187977-12128183\n \n \n 控制编号\n \n \n 749335900\n \n \n \n \n \n \n ”,
“筛选器需求模型”: ,
“显示过期标题”: false,
“标签模型”: ,
“查看作业显示”: “桌面_嵌入”
}
]

将数据保存到 SQLite 数据库中

要存储提取的作业数据,您可以使用 SQLite 数据库。 下面是一个示例代码,说明如何创建数据库、创建职位发布表并向其中插入数据。

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
进口 JSON
进口 re
进口 sqlite3
爬行基地 进口 抓取API

# 初始化SQLite数据库的函数
DEF 初始化数据库():
conn = sqlite3.connect('indeed_jobs.db')
光标 = conn.cursor()
游标.执行('''
如果不存在则创建表作业 (
职位名称文本,
公司文本,
位置文本,
工作描述文本
)
''')
conn.commit()
回报 康涅狄格州, 光标

# 将作业详细信息保存到 SQLite 数据库的函数
DEF 保存到数据库(光标、作业):
游标.执行('''
INSERT INTO 职位(职位名称、公司、地点、职位描述)
值 (?, ?, ?, ?)
''', (工作[“职称”], 工作[“公司”], 工作[“地点”], 工作[“职位描述”]))
光标.connection.commit()

# 解析招聘页面 HTML 的函数
DEF parse_job_page_html(HTML):
数据 = re.findall(r"_initialData=(\{.+?\});",html)
数据 = json.loads(数据[0])
工作信息 = 数据[“jobInfoWrapper模型”][“工作信息模型”]
回报 {
“职称”: 工作信息[“工作信息标题模型”][“职称”],
“公司”: 工作信息[“工作信息标题模型”][“公司名称”],
“地点”: 工作信息[“工作信息标题模型”][“格式化位置”],
“职位描述”: 工作信息.get(“已清理的工作描述”, "")
}

# 从作业页面抓取作业详细信息并将其保存到数据库的函数
DEF 刮并保存(api、job_key、光标):
网址= f"https://www.indeed.com/m/basecamp/viewjob?viewtype=embedded&jk={工作键}"
响应 = api.get(url, {'国家': '我们'})
if 回复['状态代码'] == 200:
# 解码字节数据后提取的HTML内容
html_内容=响应['身体']。解码('拉丁1')

# 解析 HTML
工作 = parse_job_page_html(html_content)

# 将作业详细信息保存到数据库
save_to_database(光标,作业)

打印(f"为作业密钥保存的作业详细信息: {工作键}")

# 使用示例
DEF ():
# 初始化数据库
conn,游标=initialize_database()

api = 爬行API({'令牌': 'YOUR_CRAWLBASE_JS_TOKEN'})
工作键 = ["6a45faa5d8d817fa", “另一个作业键”]

# 抓取并保存每个作业键的作业详细信息
任务 = [scrape_and_save(api, job_key, 光标) 工作键 in 工作键]

# 关闭数据库连接
conn.close()

if __名字__ == “__主要的__”:
主()

该代码首先初始化数据库结构,创建一个名为“jobs”的表来存储职位名称、公司名称、位置和职位描述等信息。 这 initialize_database 函数初始化 SQLite 数据库并返回连接和游标。 这 save_to_database 函数负责将作业详细信息插入到该表中。

实际的网页抓取过程发生在 scrape_and_save 函数,它采用职位键(每个职位发布的唯一标识符)和 SQLite 游标作为输入。 该函数构造特定职位发布的 URL,向 Indeed 网站发送 HTTP 请求,检索职位页面的 HTML 内容,然后使用 parse_job_page_html 功能。 然后使用以下命令将解析后的数据(包括职位名称、公司名称、位置和职位描述)保存到 SQLite 数据库中: save_to_database 功能。

- main 函数负责协调整个过程。它初始化数据库连接并 Crawling API 实例,定义要抓取的作业键列表,并为每个作业键运行抓取和保存任务。一旦所有作业详细信息都被抓取并存储,数据库连接就会关闭。

通过遵循这些详细步骤,您可以使用 Python 构建全面的 Indeed 职位抓取工具、抓取职位列表、处理分页、从职位发布页面提取数据,并将数据保存到 SQLite 数据库中以供进一步分析或使用。

使用 Python 和 Crawlbase 优化你的 Indeed Scraper

在线平台是求职者的首选,为他们提供许多唾手可得的机会。然而,这种便利伴随着筛选海量信息的艰巨任务。网络抓取改变了数据收集方式,重塑了我们的求职策略。

通过使用网络抓取,我们可以彻底改变我们寻找工作的方式。 它自动化了从各个门户收集和排序职位列表的繁琐过程。 您不再需要花费无数时间手动搜索不同的招聘网站。 通过定制的网页抓取脚本,您可以轻松收集、分类和显示符合您偏好的职位空缺。 这样可以节省时间,并确保不会漏掉任何潜在的工作机会,无论多么晦涩难懂。

我们的综合指南重点介绍了通过 Crawlbase 进行网页抓取的功能 Crawling API,重点介绍其在知名招聘网站 Indeed 上的应用。无论您是在寻找理想的职业匹配,还是热衷于掌握抓取技术的技术爱好者,本 Python 指南都提供了自动化和优化求职搜索的工具。与我们一起探索网络抓取如何简化和优化您在 Indeed 上寻找完美工作的旅程。

常见问题

确实有可能抓取吗?

您可以从 Indeed 抓取招聘信息,但这违反了他们的规则。Indeed 会尝试阻止抓取,并使用 CAPTCHA 之类的技术以及限制您访问其网站的频率来防止自动抓取。如果您违反这些规则,您可能会面临法律麻烦或您的 IP 地址被封锁。Indeed 不会抓取信息,而是提供 API 或其他方式让获准的合作伙伴获取数据,这是一种更光明正大的方式来访问他们拥有的数据。

如何从 Indeed 抓取线索?

如果您选择从 Indeed 收集招聘信息或潜在客户(尽管有风险),请按照以下基本步骤操作:

  1. 选择您的目标 URL:确定您想要从 Indeed 上的哪些职位列表或搜索页面收集数据。
  2. 查看网站的构建方式:使用浏览器的开发人员工具查找包含职位名称、描述、公司名称和位置的 HTML 标签。3. 创建一个程序来收集数据:使用 Python 等编码语言以及 BeautifulSoup 和 Scrapy 等工具从这些 HTML 标签中提取信息。
  3. 处理 CAPTCHA 和限制:想办法绕过 CAPTCHA 并减慢您的请求速度,以便网站不会阻止您。
  4. 保留信息:将您收集的信息保存到数据库或 CSV 文件中,以便以后使用。

最好的工作抓取工具是哪一个?

最佳职位抓取工具取决于您的特定需求,例如您定位的平台和数据收集的规模。作为全面可靠的解决方案,Crawlbase 是职位抓取的首选之一。

爬虫库 Crawling API 提供以下创新功能:

  1. 多功能参数选项: Crawlbase 提供了丰富的参数集,允许开发人员精确定制他们的 API 请求。 “format”、“user_agent”、“page_wait”等参数支持自定义以满足特定的抓取需求。
  2. 响应格式控制: 开发人员可以根据自己的喜好和数据处理要求在 JSON 和 HTML 响应格式之间进行选择。 这种灵活性简化了数据提取和操作。
  3. Cookie 和标头处理: 通过使用“get_cookies”和“get_headers”等参数从原始网站检索 cookie 和标头,开发人员可以访问对于某些网络抓取任务可能至关重要的有价值的信息。
  4. 动态内容处理: Crawlbase 擅长处理动态内容,使其适合抓取 JavaScript 渲染的页面。 “page_wait”和“ajax_wait”等参数使开发人员能够确保 API 捕获完全呈现的内容,即使加载需要时间或包含 AJAX 请求也是如此。
  5. IP轮播: Crawlbase 提供轮换 IP 地址的功能,提供匿名性并降低被网站阻止的风险。 该功能保证了网页爬取任务更高的成功率。
  6. 地理位置选项: 开发人员可以使用“country”参数为地理定位请求指定一个国家/地区。 这对于需要来自特定地理区域的数据的场景特别有用。
  7. Tor 网络支持: 对于通过 Tor 网络爬行洋葱网站,可以启用“tor_network”参数,从而增强隐私性和对暗网内容的访问。
  8. 屏幕截图: 该API可以通过“screenshot”参数捕获网页的屏幕截图,为爬取的数据提供可视化上下文。
  9. 使用抓取器抓取数据: Crawlbase 提供了利用预定义数据抓取器的选项,简化了从网页中提取特定信息的过程。 这简化了常见用例的数据检索。
  10. 异步抓取: 在需要异步抓取的情况下,API 支持“async”参数。开发人员会收到一个请求标识符 (RID),用于从云存储中检索抓取的数据。
  11. 自动解析: “autoparse”参数通过以 JSON 格式返回解析信息来简化数据提取,从而减少对 HTML 内容进行大量后处理的需要。