引言
在互联网招聘行业,前程无忧(51job)作为国内领先的招聘平台之一,汇聚了大量企业招聘信息。对于求职者、猎头或数据分析师来说,实时获取最新的招聘信息至关重要。
手动收集数据效率低下,而通过Python编写自动化爬虫,可以定时爬取前程无忧的最新职位,并存储到数据库或本地文件中,便于后续分析。本文将介绍如何使用Python requests库结合定时任务,实现自动化爬取前程无忧招聘数据。
技术方案概述
1. requests库:发送HTTP请求,获取网页数据。
2. BeautifulSoup:解析HTML,提取关键信息。
3. pandas:数据清洗与存储(CSV/Excel)。
4. APScheduler:定时任务调度,实现自动化爬取。
5. 代理IP与User-Agent:应对反爬机制。
实现步骤
1. 分析前程无忧网页结构
前程无忧的招聘列表页URL通常为:
其中关键参数:
● python:搜索关键词
● 2,1.html:第2页,每页50条数据
目标数据字段
● 职位名称
● 公司名称
● 工作地点
● 薪资范围
● 发布时间
● 职位详情链接
2. 安装依赖库
3. 编写爬虫代码
(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. 应对反爬策略
前程无忧可能会检测频繁请求,因此需要:
1. 设置随机User-Agent(使用fake_useragent库)。
2. 使用代理IP(如requests+proxies)。
3. 控制请求间隔(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文件。
扩展优化方向
1. 数据存储到数据库(MySQL/MongoDB)。
2. 邮件通知(爬取完成后发送最新职位信息)。
3. 多关键词爬取(如Java、数据分析等)。
4. 结合Scrapy框架提高爬取效率。
通过自动化爬虫,可以高效获取招聘市场动态,适用于求职分析、竞品调研、行业趋势研究等场景。