自动化爬虫:requests定时爬取前程无忧最新职位

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 自动化爬虫:requests定时爬取前程无忧最新职位

引言
在互联网招聘行业,前程无忧(51job)作为国内领先的招聘平台之一,汇聚了大量企业招聘信息。对于求职者、猎头或数据分析师来说,实时获取最新的招聘信息至关重要。
手动收集数据效率低下,而通过Python编写自动化爬虫,可以定时爬取前程无忧的最新职位,并存储到数据库或本地文件中,便于后续分析。本文将介绍如何使用Python requests库结合定时任务,实现自动化爬取前程无忧招聘数据。
技术方案概述

  1. requests库:发送HTTP请求,获取网页数据。
  2. BeautifulSoup:解析HTML,提取关键信息。
  3. pandas:数据清洗与存储(CSV/Excel)。
  4. APScheduler:定时任务调度,实现自动化爬取。
  5. 代理IP与User-Agent:应对反爬机制。
    实现步骤
  6. 分析前程无忧网页结构
    前程无忧的招聘列表页URL通常为:
    其中关键参数:
    ● python:搜索关键词
    ● 2,1.html:第2页,每页50条数据
    目标数据字段
    ● 职位名称
    ● 公司名称
    ● 工作地点
    ● 薪资范围
    ● 发布时间
    ● 职位详情链接
  7. 安装依赖库
  8. 编写爬虫代码
    (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框架提高爬取效率。
    通过自动化爬虫,可以高效获取招聘市场动态,适用于求职分析、竞品调研、行业趋势研究等场景
相关文章
|
存储 设计模式 测试技术
怎么基于Pytest+Requests+Allure实现接口自动化测试?
该文介绍了一个基于Python的自动化测试框架,主要由pytest、requests和allure构成,采用关键字驱动模式。项目结构分为六层:工具层(api_keyword)封装了如get、post的请求;参数层(params)存储公共参数;用例层(case)包含测试用例;数据驱动层(data_driver)处理数据;数据层(data)提供数据;逻辑层(logic)实现用例逻辑。代码示例展示了如何使用allure装饰器增强测试报告,以及如何使用yaml文件进行数据驱动。
530 0
|
1月前
|
数据采集 Python
如何通过requests和time模块限制爬虫请求速率?
如何通过requests和time模块限制爬虫请求速率?
|
1月前
|
数据采集 Python
解决requests爬虫IP连接初始问题的方案。
通过上述技艺,爬虫程序的调试和优化将变得十分高效,最妙的是,这些技术诀窍不仅可以帮你避开网络世界里的雷区,更能让你在数据抓取的战场上游刃有余。
37 0
|
12月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
194 4
|
7月前
|
JSON 数据可视化 测试技术
python+requests接口自动化框架的实现
通过以上步骤,我们构建了一个基本的Python+Requests接口自动化测试框架。这个框架具有良好的扩展性,可以根据实际需求进行功能扩展和优化。它不仅能提高测试效率,还能保证接口的稳定性和可靠性,为软件质量提供有力保障。
319 7
|
8月前
|
数据采集 JSON 测试技术
Python爬虫神器requests库的使用
在现代编程中,网络请求是必不可少的部分。本文详细介绍 Python 的 requests 库,一个功能强大且易用的 HTTP 请求库。内容涵盖安装、基本功能(如发送 GET 和 POST 请求、设置请求头、处理响应)、高级功能(如会话管理和文件上传)以及实际应用场景。通过本文,你将全面掌握 requests 库的使用方法。🚀🌟
1410 7
|
10月前
|
数据采集 Python
Flask获取post,get参数,以及 爬虫 requests的get,post参数详解
Flask获取post,get参数,以及 爬虫 requests的get,post参数详解
|
10月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
182 3
|
10月前
|
数据采集 API 开发者
🚀告别网络爬虫小白!urllib与requests联手,Python网络请求实战全攻略
在网络的广阔世界里,Python凭借其简洁的语法和强大的库支持,成为开发网络爬虫的首选语言。本文将通过实战案例,带你探索urllib和requests两大神器的魅力。urllib作为Python内置库,虽API稍显繁琐,但有助于理解HTTP请求本质;requests则简化了请求流程,使开发者更专注于业务逻辑。从基本的网页内容抓取到处理Cookies与Session,我们将逐一剖析,助你从爬虫新手成长为高手。
129 1
|
10月前
|
数据采集 测试技术 API
在BrowserStack上进行自动化爬虫测试的终极指南
随着互联网的发展,数据价值日益凸显,爬虫技术成为提取网页信息的关键工具。然而,不同环境下的测试与运行挑战重重,特别是在多浏览器、多平台上保证爬虫的稳定性和兼容性尤为困难。BrowserStack作为领先的跨浏览器测试平台,提供了强大的工具和服务。本文将详细介绍如何在BrowserStack上进行自动化爬虫测试,并结合代理IP技术提升爬虫的隐蔽性和成功率。通过具体步骤和案例分析,展示如何利用Selenium、自定义用户代理和Cookie设置来应对反爬虫机制。本指南旨在为开发者提供实用模板,帮助其在多变的测试环境中构建高效的爬虫系统。
339 1