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

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

在本综合指南中,我们将探索如何利用网络抓取的潜力 Crawlbase 爬取 API 简化您在最著名的职位列表网站之一 Indeed 上的职位搜索流程。 无论您是寻找完美职业机会的求职者,还是有兴趣掌握网络抓取技术的数据爱好者,这一步一步 蟒蛇 指南将为您提供自动化求职的技能,并使其更加有效和高效。 加入我们,深入了解网络抓取的世界,并发现它为简化您在 Indeed 上的求职之旅提供的无数机会。

目录

  1. 入门
  • 什么是网页抓取?
  • 网页抓取在求职中的作用
  1. Crawlbase 爬网 API 入门
  • Crawlbase 抓取 API 的主要优点
  • 使用爬行 API 发送请求
  • API响应时间和格式
  • 爬取API参数
  • 免费试用、收费策略和费率限制
  • Crawlbase Python 库
  1. 了解 Indeed 网站
  • 浏览 Indeed 职位列表
  • 探索 Indeed 的职位发布
  1. 设置您的开发环境
  • 安装Python
  • 安装所需的库
  • 选择正确的开发 IDE
  1. 构建您的 Indeed 工作爬虫
  • 抓取工作列表
  • 处理职位搜索页面分页
  • 从职位发布页面提取数据
  • 将数据保存到 SQLite 数据库中
  1. 结论
  2. 常见问题解答

2.开始治疗

网络抓取是一种从网站提取数据的高效方法,它是一项可以极大增强您的求职过程的技能。 在本节中,我们将从深入研究基础知识开始。 首先,我们将探讨网络抓取在求职中的作用,重点介绍它如何帮助您访问、过滤和组织 Indeed 等网站的职位列表。

什么是网页抓取?

网页抓取,通常称为网页采集或网页数据提取,是一种用于从网站中提取信息的技术。 它涉及自动从网页检索数据,然后可以出于各种目的保存、处理和分析这些数据。 网络抓取是数据收集领域的一个有价值的工具,因为它允许您将网站上的非结构化数据转换为更易于使用的结构化数据集。

网页抓取是使用专门的软件工具、Python 等编程语言来实现的,有时还需要借助 API(应用程序编程接口)。 通过向网站发送 HTTP 请求,您可以检索其 HTML 或 XML 内容,对其进行解析以提取所需的数据,然后存储该数据以供分析、研究或其他应用程序使用。

网页抓取在求职中的作用

传统的求职方法通常需要访问多个招聘网站、公司网站和招聘平台来查找相关的职位列表。 这个过程可能非常耗时且令人难以承受,尤其是当您在不同地点和行业寻找机会时。

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

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

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

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

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

在以下部分中,我们将探讨如何利用网络抓取(特别是使用 Crawlbase 抓取 API)来高效地从 Indeed 抓取职位信息。 本分步指南将为您提供自动化求职的技能,并使其更加有效和高效。

2. Crawlbase爬取API入门

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

Crawlbase 抓取 API 的主要优点

Crawlbase 爬行 API 提供了一系列关键优势,使开发人员能够有效收集 Web 数据并处理爬行过程的各个方面。 以下是一些显着的优点:

  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 内容进行大量后处理的需要。

综上所述,Crawlbase 的 Crawling API 是一款强大的网页抓取和数据提取工具,提供了广泛的参数和功能,可以满足不同的抓取需求。 无论您需要访问动态内容、处理 cookie 和标头、轮换 IP 地址还是提取特定数据,Crawlbase 都提供了使网络爬行高效且有效的工具和功能。

使用爬行 API 发送请求

Crawlbase 的爬行 API 旨在简单且易于集成到您的网络抓取项目中。 所有 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 爬网 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 发现的网页内容。

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

爬取API参数

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

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

您可以阅读有关 Crawlbase 抓取 API 参数的更多信息 此处.

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

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

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

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

Crawlbase Python 库

Crawlbase Python 库提供了一种与 Crawlbase 爬行 API 交互的简单方法。 您可以使用这个轻量级且无依赖项的 Python 类作为 Crawlbase API 的包装器。 首先,使用您的 Crawlbase 令牌初始化 Crawling API 类。 然后,您可以通过提供要抓取的 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 的其他高级功能的场景特别有用。

3. 了解 Indeed 网站

Indeed 是求职行业的巨头,拥有来自世界各地不同雇主的数百万个职位发布。 要成功从 Indeed 上抓取职位数据,了解网站的结构以及职位发布的组织方式至关重要。

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

Indeed 职位搜索页面

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

搜索结果: 输入搜索条件并点击“搜索”按钮后,Indeed 会显示与您的查询匹配的职位列表列表。 这些列表通常按时间倒序排列,最新的帖子显示在顶部。 每个列表都提供了重要的详细信息,例如职位名称、公司名称、地点和简短的职位描述。

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

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

探索 Indeed 的职位发布

找到您感兴趣的职位列表后,单击它即可进入完整的职位发布页面。 您可以期待找到以下内容:

Indeed 职位发布页面

招聘详细信息: 职位发布页面提供有关职位机会的全面详细信息。 这包括职位名称、公司名称、地点、职位类型(例如全职、兼职)以及详细的职位描述。 您还可以找到有关申请截止日期以及如何申请的信息。

公司信息: Indeed 通常包含有关招聘公司的信息,例如其规模、行业和地点。 如果您想根据特定公司或行业过滤职位列表,这可能很有价值。

工资信息: Indeed 上的一些职位发布包含预估薪资范围。 这可以帮助您快速找到符合您薪资期望的职位。

申请流程: Indeed 提供有关如何申请该职位的信息。 这可能涉及通过 Indeed 提交简历或访问公司网站直接申请。

类似职位: 在职位发布的底部,Indeed 会建议您可能感兴趣的类似职位列表。 如果您正在同一领域探索多个机会,这可能会很有用。

了解 Indeed 如何构建其网站并呈现职位列表对于有效的网络抓取至关重要。 有了这些知识,您将能够更好地浏览网站、抓取职位数据并提取职位搜索或分析所需的信息。

4. 设置你的开发环境

在使用 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 作业抓取工具了。

5. 构建您的 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 都有一个增量偏移量以获取下一组结果。

然后它对每个生成的页面 URL 发起 Crawling API 请求。 获取每个页面时,会提取其职位列表并将其添加到 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 函数协调整个过程。 它初始化数据库连接和爬行API实例,定义要抓取的作业键列表,并为每个作业键运行抓取和保存任务。 一旦所有作业详细信息都被抓取并存储,数据库连接就会关闭。

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

6。 结论

在线平台站在求职者的最前沿,为他们提供了许多触手可及的机会。 然而,这种轻松伴随着筛选海量信息的艰巨任务。 输入网络抓取:数据收集的游戏规则改变者,重塑我们的求职策略。

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

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

7。 经常问的问题

问:什么是网络抓取,它对求职者有何好处?

网页抓取,也称为网页数据提取,是从网站自动提取信息的过程。 对于求职者来说,网络抓取是一个强大的工具,可以简化求职过程。 它允许用户聚合来自各种来源的职位列表、自动化数据检索、定制搜索以及接收职位机会的实时更新。 通过节省时间并提供对各种职位发布的访问,网络抓取显着提高了求职的效率和效果。

问:为什么我应该使用 Crawlbase Crawling API 在 Indeed 上进行网页抓取?

Crawlbase 抓取 API 为 Indeed 上的网页抓取提供了多项优势。 它提供了多功能参数选项、对响应格式(JSON 或 HTML)的控制、cookie 和标头处理、动态内容支持、匿名 IP 轮换、地理位置选项、对暗网抓取的 Tor 网络支持、屏幕截图捕获,甚至是预定义的数据抓取器。 此外,Crawlbase 采用“按使用量付费”的模式,使其能够满足网络抓取需求的成本效益。

问:在 Indeed 上抓取职位列表时如何处理分页?

Indeed 的职位搜索结果通常是分页的,这意味着您需要浏览多个页面才能访问所有职位列表。 为了有效地处理分页,您可以调整 URL 参数(例如“start”参数)来获取下一组结果。 或者,您可以从搜索结果页面的 HTML 源代码中提取分页信息。 通过实施这些技术,您可以从多个页面无缝地抓取和收集职位列表。

问:从 Indeed 的职位发布页面提取职位详细信息的最佳方式是什么?

要从 Indeed 上的职位发布页面提取全面的职位详细信息,您可以首先识别职位关键字,通常可以在搜索结果的“职位关键字”字段中找到。 使用此键,您可以向完整的作业详细信息页面发出请求。 您可以通过定位“_initialData”变量中存储的嵌入数据来有效地提取作业详细信息,而不是解析 HTML 结构。 可以使用正则表达式检索此数据。 获得后,您可以解析 JSON 数据以访问特定于职位的信息,例如职位描述、公司详细信息和应用说明。