嘿!想要从 Indeed 上抓取职位列表吗?您来对地方了。
Indeed 是网络上最大的职位搜索引擎之一,拥有超过 250千万 每月独立访客数。这是关于职位发布、薪资、公司简介等的海量数据。
不幸的是,Indeed 的 API 并没有完全公开所有这些数据。这就是网络抓取的用武之地。
在本指南中,我将逐步引导您了解如何使用 Python 抓取 Indeed。我将分享您可以使用的代码片段,以及准确抓取并避免被阻止的提示。
我还将介绍如何自动每天、每周或每月运行抓取。这样您就可以自动保持职位列表数据最新!
最后,您将像专业人士一样抓取 Indeed 职位发布。让我们深入挖掘吧!
为什么要抓取 Indeed 职位列表?
在我们开始接触一些 Python 代码之前,让我们先讨论一下 为什么 您可能首先想从 Indeed 上抓取数据。
这里只是一些想法:
市场调查 – 分析职位发布趋势,以确定需求不断增长的技能或职位。确实有数据 百万 所有行业的职位空缺。
竞争情报 – 查看公司为类似职位提供的薪资和福利。在对您自己的薪酬方案进行基准测试时很有用。
职位搜索引擎 – 使用过滤到特定关键字或位置的 Indeed 数据构建自定义招聘板。
招聘工具 – 跟踪与候选人技能相匹配的新职位空缺,以发现相关工作。
简历分析 – 从职位描述中提取关键词和技能,以提供改进简历和求职信的建议。
这些只是几个例子 - 有了丰富的职位发布结构化数据,可能性是无限的!
现在让我们看看如何使用网络抓取来实际提取该数据。
刮取确实合法吗?
在深入编码之前,我想快速了解一下网络抓取的合法性。我知道有些人对此有所顾虑。
简短的回答是:从 Indeed 上抓取公共数据是 完全合法 在大多数情况下,只要遵循一些基本规则即可:
仅访问公共页面 - 不要尝试抓取私人用户数据或登录信息。
不要因过于激进的抓取而导致 Indeed 的服务器超载。遵循礼貌的爬行习惯。
遵守 Indeed 的服务条款。他们没有明确禁止网络抓取。
避免逐字复制大量文本摘录,以尊重版权。转述就可以了。
请勿重新发布抓取的任何私人、个人或敏感数据。
如果您遵循这些常识性准则,则在大多数国家/地区,法律都允许通过 Indeed 网络抓取公共职位列表数据。
当然,鉴于法律各不相同,如果您有任何疑虑,我仍然建议您咨询律师。但只要您保持道德,您就可以充满信心地刮刮 Indeed!
好吧,让我们深入研究有趣的东西 - 实际代码!
使用 Python 抓取 Indeed 列表
当抓取像 Indeed 这样的大型网站时,Python 是一个不错的选择,这要归功于像 要求, 美丽的汤 和 硒.
我将引导您完成一个脚本:
提取与关键字和位置搜索匹配的职位列表
解析职位、薪资和描述等详细信息
自动分页以获取多个页面上的所有列表
让我们开始吧!
导入库
我们将使用 要求 获取页面, 美丽的汤 用于解析, 时间 节流阀,以及 熊猫 存储数据:
import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
Requests 和 BeautifulSoup 都是你的 真 需要。但 Pandas 有助于管理数据,而 Time 则限制请求。
定义搜索参数
首先,让我们定义我们想要的职位列表。指定关键字、位置和其他过滤器:
keywords = "Remote Software Engineer"
location = "United States"
salary_min = 100000
其目标是美国的高薪远程软件工作。调整到您想要的标准。
获取搜索结果页面
设置参数后,我们将请求 URL,并传递关键字和位置:
BASE_URL = "https://www.indeed.com/jobs?"
params = {
‘q‘: keywords,
‘l‘: location,
‘minSalary‘: salary_min,
‘remotejob‘: ‘remote‘ # Filter remote jobs
}
print(f‘Fetching job listings for {keywords} in {location}...‘)
res = requests.get(BASE_URL, params=params)
res.raise_for_status() # Raise exception for 4xx/5xx
这将执行初始搜索查询,并按我们的关键字和参数进行过滤。
使用 BeautifulSoup 解析结果
接下来我们将解析搜索结果页面的 HTML 以提取高级列表数据:
soup = BeautifulSoup(res.text, ‘html.parser‘)
listings = [] # List to store listings
for div in soup.find_all(‘div‘, class_=‘job_seen_beacon‘):
title = div.find(‘h2‘).text.strip()
company = div.find(‘span‘, class_=‘companyName‘).text.strip()
location = div.find(‘div‘, class_=‘companyLocation‘).text.strip()
# Append listing data
listings.append({
‘title‘: title,
‘company‘: company,
‘location‘: location
})
我们在这里找到每个列表 div
,抓住标题和公司等关键字段,然后存储在我们的 listings
名单。
处理分页
Indeed 将结果拆分到多个页面。我们需要遍历每个:
# Track page number
current_page = 0
while True:
# Increment page
current_page += 1
print(f‘Scraping page {current_page}...‘)
# Build URL for next page
next_page_url = BASE_URL + f‘&start={current_page*10}‘
# Fetch page HTML
res = requests.get(next_page_url, params=params)
# Parse HTML
soup = BeautifulSoup(res.text, ‘html.parser‘)
# Return if last page
if not soup.find(‘a‘, {‘aria-label‘: ‘Next‘}):
print(‘Reached last page!‘)
break
# Extract listings
for div in soup.find_all(...):
# Extract listing data
# Sleep to throttle requests
time.sleep(3)
print(f‘Scraped {len(listings)} listings‘)
在这里,我们不断增加页码,获取下一页,提取列表,然后循环直到到达最后一页。
添加一个短 time.sleep()
节流阀有助于避免压垮 Indeed 的服务器。
抓取列表详细信息
到目前为止,我们已经提取了头衔和公司等高级数据。为了获取薪资和描述等详细信息,我们将抓取每个列表 URL:
from selenium import webdriver
driver = webdriver.Chrome()
# Loop through listings
for listing in listings:
print(f‘Getting details for {listing["title"]}‘)
# Load listing URL
url = listing[‘url‘]
driver.get(url)
# Extract key fields
desc = driver.find_element_by_id(‘jobDescriptionText‘).text
salary = driver.find_element_by_class_name(‘salary-snippet‘).text
listing[‘desc‘] = desc
listing[‘salary‘] = salary
# Sleep to throttle
time.sleep(2)
driver.quit()
这里,Selenium 提供了一个完整的浏览器来呈现 JavaScript 密集型页面。我们加载每个 URL,并提取其他字段,例如描述和薪水。
专业提示: 考虑使用 代理服务 大规模使用 Selenium 时避免 IP 阻塞。
就是这样!通过这些步骤,您可以自动从 Indeed 中抓取数千个职位列表。
最终结果是结构化的工作数据,您可以分析或导出到 Excel 等工具。接下来我们看几个例子。
您可以使用抓取的 Indeed 数据做什么?
既然我们可以抓取 Indeed 列表,那么我们实际上可以用这些数据做什么呢?
这里只是一些想法:
导出至 Excel 进行分析
df = pandas.DataFrame(listings)
df.to_excel(‘indeed_listings.xlsx‘, index=False)
Pandas 可以轻松地将结果导出到 Excel。这可以实现强大的过滤、数据透视表和公式。
您可以分析不同地点、薪资、技能等方面的趋势。
建立求职数据库
import sqlite3
# Connect to SQLite database
conn = sqlite3.connect(‘jobs.db‘)
# Create table
conn.execute(‘‘‘
CREATE TABLE jobs (
title TEXT,
company TEXT,
description TEXT,
salary REAL
);
‘‘‘)
# Insert listings into database
for listing in listings:
conn.execute("""
INSERT INTO jobs VALUES (
?, ?, ?, ?
)""", (listing[‘title‘], listing[‘company‘],
listing[‘desc‘], listing[‘salary‘]))
conn.commit()
conn.close()
SQLite 提供了一个简单的数据库来存储定制搜索的列表。与 Flask 集成来构建您自己的工作板!
通过电子邮件将相关列表发送给候选人
import smtplib
from email.message import EmailMessage
# Connect to SMTP server
smtp = smtplib.SMTP(‘smtp.domain.com‘)
for listing in listings:
# Check if listing matches candidate skills
if match:
msg = EmailMessage()
msg[‘Subject‘] = f‘New job for you - {listing["title"]}‘
msg[‘From‘] = ‘[email protected]‘
msg[‘To‘] = ‘[email protected]‘
msg.set_content(listing[‘desc‘])
# Send listing to candidate
smtp.send_message(msg)
smtp.quit()
Python 可以轻松地自动通过电子邮件向候选人发送与其技能和兴趣相匹配的新列表。
这只是一个小样本 - 拥有数百万个列表的数据,可能性是无限的!
现在让我们看看自动运行这个抓取工具。
安排每日确实抓取
虽然实时抓取 Indeed 很有用,但更有价值的是设置 自动、预定的刮擦 让您的数据保持最新。
以下是按固定循环计划运行抓取工具的两个不错的选择:
cron作业
自动化 Python 脚本的一个简单方法是 cron,它是一个标准的 Linux 实用程序。
添加如下条目以每天上午 8 点运行:
0 8 * * * python /home/user/indeedScraper.py
您可以安排复杂的重复。但 cron 缺乏如果抓取失败的报告。
抓取平台
为了更强大的调度和自动化,我建议使用专用的抓取平台,例如 Scrapy or 阿皮菲.
它们提供浏览器和代理自动化来处理验证码、块和 JavaScript。它们内置了简单的 cron 作业调度。
您还可以获得电子邮件警报、性能分析和集成选项。他们确实解决了自动化带来的麻烦!
这是一个快速比较:
cron作业 | 抓取平台 | |
---|---|---|
定价 | Free | 付费计划 |
代理和无头浏览器 | 需要自定义代码 | 包含的功能 |
调度 | 基本复发 | 高级选项 |
监控和警报 | 不包含 | 电子邮件和仪表板 |
结果存储 | 手工处理 | 内置存储和导出 |
对于像 Indeed 这样的大型复杂网站,我建议使用专用平台。当大规模抓取时,额外的可靠性和功能是值得的。
让我们回顾一下
在本指南中,您了解到:
为什么 抓取 Indeed 对于市场研究、求职和招聘工具很有用。
如何 提取清单 通过模仿 Python 中的搜索查询。
最佳实践 例如限制请求和使用代理来避免阻塞。
如何 解析细节 例如列表页面中的工资和描述。
自动化选项 像 cron 和专用的抓取平台一样,可以让您的数据保持最新。
上面的代码示例应该为您提供一个模板来开始抓取您自己的 Indeed 数据。请随意根据您的用例进行调整和构建!
请记住尊重 Indeed 的服务条款,避免过于激进的抓取,并遵循良好的网络抓取规范,以遵守法律。
我希望本指南能让您全面了解如何使用 Python 有效地抓取 Indeed。通过自动化这些步骤,您可以利用 Indeed 令人难以置信的职位列表数据宝库。
如果您还有其他问题,请告诉我! 我总是很乐意更多地讨论网络抓取最佳实践。
祝您的 Indeed 抓取项目一切顺利!