引言 在互联网招聘行业,前程无忧(51job)作为国内领先的招聘平台之一,汇聚了大量企业招聘信息。对于求职者、猎头或数据分析师来说,实时获取最新的招聘信息至关重要。 手动收集数据效率低下,而通过Python编写自动化爬虫,可以定时爬取前程无忧的最新职位,并存储到数据库或本地文件中,便于后续分析。本文将介绍如何使用Python requests库结合定时任务,实现自动化爬取前程无忧招聘数据。 技术方案概述
- requests库:发送HTTP请求,获取网页数据。
- BeautifulSoup:解析HTML,提取关键信息。
- pandas:数据清洗与存储(CSV/Excel)。
- APScheduler:定时任务调度,实现自动化爬取。
- 代理IP与User-Agent:应对反爬机制。 实现步骤
- 分析前程无忧网页结构 前程无忧的招聘列表页URL通常为: 其中关键参数: ● python:搜索关键词 ● 2,1.html:第2页,每页50条数据 目标数据字段 ● 职位名称 ● 公司名称 ● 工作地点 ● 薪资范围 ● 发布时间 ● 职位详情链接
- 安装依赖库
- 编写爬虫代码 (1) 发送请求并解析HTML import requests from bs4 import BeautifulSoup import pandas as pd from apscheduler.schedulers.blocking import BlockingScheduler import time
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" }
def fetch_jobs(keyword="python", pages=1): base_url = "https://search.51job.com/list/000000,000000,0000,00,9,99,{},2,{}.html" job_list = []
for page in range(1, pages + 1):
url = base_url.format(keyword, page)
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
jobs = soup.find_all('div', class_='j_joblist') # 根据实际HTML结构调整
for job in jobs:
title = job.find('span', class_='jname').text.strip()
company = job.find('a', class_='cname').text.strip()
location = job.find('span', class_='d at').text.strip()
salary = job.find('span', class_='sal').text.strip()
pub_date = job.find('span', class_='time').text.strip()
link = job.find('a', class_='el')['href'].strip()
job_list.append({
"职位名称": title,
"公司名称": company,
"工作地点": location,
"薪资范围": salary,
"发布时间": pub_date,
"详情链接": link
})
time.sleep(2) # 避免请求过快被封
return job_list
(2) 存储数据到CSV def save_to_csv(jobs, filename="51job_jobs.csv"): df = pd.DataFrame(jobs) df.to_csv(filename, index=False, encoding='utf_8_sig') # 防止中文乱码 print(f"数据已保存至 {filename}") (3) 设置定时任务(每天爬取一次) def scheduled_job(): print("开始爬取前程无忧最新职位...") jobs = fetch_jobs(keyword="python", pages=3) # 爬取3页数据 save_to_csv(jobs) print("爬取完成!")
if name == "main": scheduler = BlockingScheduler() scheduler.add_job(scheduled_job, 'interval', days=1) # 每天执行一次 print("定时爬虫已启动,按 Ctrl+C 退出") try: scheduler.start() except KeyboardInterrupt: scheduler.shutdown() 4. 应对反爬策略 前程无忧可能会检测频繁请求,因此需要:
- 设置随机User-Agent(使用fake_useragent库)。
- 使用代理IP(如requests+proxies)。
- 控制请求间隔(time.sleep)。 优化后的请求代码 from fake_useragent import UserAgent import requests from bs4 import BeautifulSoup import pandas as pd from apscheduler.schedulers.blocking import BlockingScheduler import time
代理配置
proxyHost = "www.16yun.cn" proxyPort = "5445" proxyUser = "16QMSOML" proxyPass = "280651"
proxyMeta = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}" proxies = { "http": proxyMeta, "https": proxyMeta, }
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" }
def get_random_ua(): ua = UserAgent() return ua.random
def fetch_jobs(keyword="python", pages=1): base_url = "https://search.51job.com/list/000000,000000,0000,00,9,99,{},2,{}.html" job_list = []
for page in range(1, pages + 1):
url = base_url.format(keyword, page)
try:
# 使用随机User-Agent和代理
headers["User-Agent"] = get_random_ua()
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
response.raise_for_status() # 检查请求是否成功
soup = BeautifulSoup(response.text, 'html.parser')
jobs = soup.find_all('div', class_='j_joblist') # 根据实际HTML结构调整
for job in jobs:
title = job.find('span', class_='jname').text.strip()
company = job.find('a', class_='cname').text.strip()
location = job.find('span', class_='d at').text.strip()
salary = job.find('span', class_='sal').text.strip()
pub_date = job.find('span', class_='time').text.strip()
link = job.find('a', class_='el')['href'].strip()
job_list.append({
"职位名称": title,
"公司名称": company,
"工作地点": location,
"薪资范围": salary,
"发布时间": pub_date,
"详情链接": link
})
time.sleep(2) # 避免请求过快被封
except Exception as e:
print(f"第{page}页请求失败: {e}")
continue
return job_list
def save_to_csv(jobs, filename="51job_jobs.csv"): df = pd.DataFrame(jobs) df.to_csv(filename, index=False, encoding='utf_8_sig') # 防止中文乱码 print(f"数据已保存至 {filename}")
def scheduled_job(): print("开始爬取前程无忧最新职位...") jobs = fetch_jobs(keyword="python", pages=3) # 爬取3页数据 save_to_csv(jobs) print("爬取完成!")
if name == "main": scheduler = BlockingScheduler() scheduler.add_job(scheduled_job, 'interval', days=1) # 每天执行一次 print("定时爬虫已启动,按 Ctrl+C 退出") try: scheduler.start() except KeyboardInterrupt: scheduler.shutdown() 总结 本文介绍了如何使用Python requests + BeautifulSoup + APScheduler构建自动化爬虫,定时爬取前程无忧的最新招聘数据,并存储到CSV文件。 扩展优化方向
- 数据存储到数据库(MySQL/MongoDB)。
- 邮件通知(爬取完成后发送最新职位信息)。
- 多关键词爬取(如Java、数据分析等)。
- 结合Scrapy框架提高爬取效率。 通过自动化爬虫,可以高效获取招聘市场动态,适用于求职分析、竞品调研、行业趋势研究等场景。