自动化爬虫:requests定时爬取前程无忧最新职位 原创
引言
在互联网招聘行业,前程无忧(51job)作为国内领先的招聘平台之一,汇聚了大量企业招聘信息。对于求职者、猎头或数据分析师来说,实时获取最新的招聘信息至关重要。
手动收集数据效率低下,而通过Python编写自动化爬虫,可以定时爬取前程无忧的最新职位,并存储到数据库或本地文件中,便于后续分析。本文将介绍如何使用Python requests库结合定时任务,实现自动化爬取前程无忧招聘数据。
技术方案概述
requests库:发送HTTP请求,获取网页数据。
BeautifulSoup:解析HTML,提取关键信息。
pandas:数据清洗与存储(CSV/Excel)。
APScheduler:定时任务调度,实现自动化爬取。
代理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. 应对反爬策略
前程无忧可能会检测频繁请求,因此需要:
设置随机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框架提高爬取效率。
通过自动化爬虫,可以高效获取招聘市场动态,适用于求职分析、竞品调研、行业趋势研究等场景。