自动化爬虫:requests定时爬取前程无忧最新职位
2025-05-29 16:51:22
  • 0
  • 0
  • 0

引言

在互联网招聘行业,前程无忧(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框架提高爬取效率。

通过自动化爬虫,可以高效获取招聘市场动态,适用于求职分析、竞品调研、行业趋势研究等场景。

 
最新文章
相关阅读