Python爬虫实战:获取51job职位信息,并做数据分析

注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力!

1. 环境准备

python

import requests
from bs4 import BeautifulSoup
import pandas as pd
import re
import matplotlib.pyplot as plt

2. 爬虫核心代码(带反爬策略)

python

def fetch_51job_data(keyword, max_pages=5):jobs = []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','Accept-Language': 'zh-CN,zh;q=0.9'}for page in range(1, max_pages+1):url = f'https://search.51job.com/list/000000,000000,0000,00,9,99,{keyword},2,{page}.html'try:response = requests.get(url, headers=headers, timeout=10)response.encoding = 'gbk'  # 网站编码特殊处理soup = BeautifulSoup(response.text, 'lxml')for item in soup.select('.j_joblist .e'):title = item.select_one('.jname').text.strip()company = item.select_one('.cname').text.strip()desc = item.select_one('.text').text.strip()experience = item.select_one('.exp').text.strip() if item.select_one('.exp') else '不限'salary = item.select_one('.sal').text.strip()jobs.append({'职位名称': title,'公司名称': company,'工作内容': desc,'工作经验': experience,'薪资范围': salary})except Exception as e:print(f'第{page}页抓取失败:', e)# 添加延迟避免被封time.sleep(1.5)return jobs

3. 薪资解析算法

python

def parse_salary(salary_str):"""支持格式示例:- 1.5-2万/月- 20-30万/年- 5-8千/月- 200-300元/天"""pattern = r'(\d+\.?\d*)-(\d+\.?\d*)(万|千|元)/(年|月|日)'match = re.search(pattern, salary_str)if not match: return Nonelow, high, unit, period = match.groups()low, high = float(low), float(high)avg = (low + high) / 2# 转换为万元/年conversion = {('万', '年'): avg,('万', '月'): avg * 12,('千', '月'): avg * 12 * 0.1,('元', '日'): avg * 22 * 12 / 10000}return conversion.get((unit, period), None)

4. 数据存储与清洗

python

# 数据清洗管道
def clean_data(jobs):df = pd.DataFrame(jobs)df['平均年薪'] = df['薪资范围'].apply(parse_salary)df = df.dropna(subset=['平均年薪'])  # 过滤无效数据return df# 保存到CSV
df.to_csv('51job.csv', index=False, encoding='utf-8-sig')

5. 数据分析与可视化

python

def analyze_salary(df):# 薪资TOP10分析top10 = df.sort_values('平均年薪', ascending=False).head(10)# 可视化配置plt.style.use('ggplot')plt.figure(figsize=(12,8))bars = plt.barh(top10['职位名称'], top10['平均年薪'], color='#4BACC6')# 添加数据标签for bar in bars:width = bar.get_width()plt.text(width+0.5, bar.get_y()+0.2, f'{width:.1f}万', va='center')plt.title('高薪职位TOP10(单位:万元/年)', fontsize=14)plt.xlabel('平均年薪', fontsize=12)plt.gca().invert_yaxis()  # 反转Y轴显示排名plt.tight_layout()plt.savefig('salary_top10.png', dpi=300)plt.show()

6. 完整执行流程

python

if __name__ == '__main__':# 数据采集raw_data = fetch_51job_data('python', max_pages=5)# 数据清洗cleaned_df = clean_data(raw_data)# 存储结果cleaned_df.to_csv('51job.csv', index=False, encoding='utf-8-sig')# 数据分析与可视化analyze_salary(cleaned_df)

7. 关键要点扩展

  1. 反爬策略强化

    • 代理IP池:使用requests-ip-rotator库实现自动IP切换

    • 浏览器指纹:通过selenium-wire模拟真实浏览器环境

    • 请求随机化:添加随机延迟(0.5-3秒)和随机User-Agent

  2. 数据质量优化

    • 异常值过滤:设置薪资合理范围(如0.5<薪资<500万/年)

    • 文本清洗:使用jieba分词提取技能要求关键词

    • 地址解析:从工作内容中提取工作地点信息

  3. 分析维度扩展

    python

    # 企业规模与薪资关系
    df['公司规模'] = df['公司名称'].apply(detect_company_size)  # 需自定义企业规模识别函数
    df.boxplot(column='平均年薪', by='公司规模')# 技能需求词云
    from wordcloud import WordCloud
    skills = extract_skills(df['工作内容'])  # 需自定义技能提取函数
    wordcloud = WordCloud().generate(' '.join(skills))
    plt.imshow(wordcloud)

  4. 架构升级思路

    • 使用Scrapy框架实现分布式爬虫

    • 集成Airflow实现定时数据更新

    • 数据存储改用MySQL+Redis缓存

    • 使用Tableau实现动态数据看板

8. 常见问题解决方案

  1. 页面结构变化

    • 定期运行监控脚本检查CSS选择器有效性

    • 使用XPath代替CSS选择器提高容错性

    • 建立元素匹配的备选方案列表

  2. 验证码破解

    • 对接打码平台(如超级鹰)

    • 使用CNN训练验证码识别模型

    • 设置验证码触发后的等待策略

  3. 数据更新机制

    python

    # 增量更新示例
    existing = pd.read_csv('51job.csv')
    new_data = fetch_new_data()
    updated = pd.concat([existing, new_data]).drop_duplicates(subset=['职位名称', '公司名称'], keep='last'
    )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek 又复活了!第三方平台接入DeepSeek R1

目录 1、秘塔搜索 2、硅基流动 3、腾讯元宝&#xff1a;强烈推荐 5 纳米AI 4、其它平台 评论区留言获取&#xff1a;DeepSeek-R1论文中文翻译文档PDF 往期精彩 1、秘塔搜索 https://metaso.cn/ 优点&#xff1a;满血版R1&#xff0c;操作方便缺点&#xff1a;无法关闭…

AN 433:源同步接口的约束与分析

文章目录 简介时钟和数据的关系SDR&#xff08;单数据速率&#xff09;和 DDR&#xff08;双数据速率&#xff09;接口约束默认时序分析行为 源同步输出输出时钟输出时钟约束时钟电路和约束示例 以系统为中心的输出延迟约束输出最大延时输出最小延时 以系统为中心的输出时序例外…

IO流-节点流与处理流

节点流和处理流的区别和联系 1. 节点流使底层流/低级流&#xff0c;是直接与数据源相接 2.处理流(包装流)包装节点流&#xff0c;既可以消除不同节点流的实现差异&#xff0c;也可以提供更方便的处理方法完成输入输出 3.处理流(包装流)对节点流进行包装&#xff0c;使用了修…

国密算法SM1、SM2、SM3和SM4 具体的使用和区别

国密算法是中国自主研发的密码算法&#xff0c;包括SM1、SM2、SM3和SM4&#xff0c;分别用于不同场景。以下是它们的具体使用和区别&#xff1a; SM1 对称加密算法 类型: 对称加密 密钥长度: 128位 使用场景: 用于数据加密和解密&#xff0c;适用于金融、政务等领域。 特点: …

【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

vue2中 computed 计算属性

文章目录 vue2中 computed 计算属性1. 什么是计算属性&#xff1f;2. 基本用法1. 定义计算属性2. 计算属性的缓存特性 3. 计算属性的高级用法1. 计算属性的 Getter 和 Setter 方法2. 计算属性的依赖追踪 4. 计算属性与方法的区别5. 实际应用案例1. 格式化数据2. 计算总价3. 动态…

Elasticsearch:同义词在 RAG 中重要吗?

作者&#xff1a;来自 Elastic Jeffrey Rengifo 及 Toms Mura 探索 RAG 应用程序中 Elasticsearch 同义词的功能。 同义词允许我们使用具有相同含义的不同词语在文档中搜索&#xff0c;以确保用户无论使用什么确切的词语都能找到他们所寻找的内容。你可能会认为&#xff0c;由于…

【devops】 Git仓库如何fork一个私有仓库到自己的私有仓库 | git fork 私有仓库

一、场景说明 场景&#xff1a; 比如我们Codeup的私有仓库下载代码 放入我们的Github私有仓库 且保持2个仓库是可以实现fork的状态&#xff0c;即&#xff1a;Github会可以更新到Codeup的最新代码 二、解决方案 1、先从Codeup下载私有仓库代码 下载代码使用 git clone 命令…

LabVIEW与小众设备集成

在LabVIEW开发中&#xff0c;当面临控制如布鲁克OPUS红外光谱仪这类小众专业设备的需求&#xff0c;而厂家虽然提供了配套软件&#xff0c;但由于系统中还需要控制其他设备且不能使用厂商的软件时&#xff0c;必须依赖特定方法通过LabVIEW实现设备的控制。开发过程中&#xff0…

从 0 开始本地部署 DeepSeek:详细步骤 + 避坑指南 + 构建可视化(安装在D盘)

个人主页&#xff1a;chian-ocean 前言&#xff1a; 随着人工智能技术的迅速发展&#xff0c;大语言模型在各个行业中得到了广泛应用。DeepSeek 作为一个新兴的 AI 公司&#xff0c;凭借其高效的 AI 模型和开源的优势&#xff0c;吸引了越来越多的开发者和企业关注。为了更好地…

强化学习中的“奖励塑形“:机器人控制与游戏AI的关键训练技术(深度优化版)

技术原理&#xff1a;奖励函数的数学重构 核心公式推导 奖励塑形的数学表达&#xff1a; R(s,a,s) R_{env}(s,a,s) \gamma\Phi(s) - \Phi(s)其中&#xff1a; Φ(s): 势能函数&#xff08;人工设计的关键&#xff09;γ: 折扣因子&#xff08;0.9-0.99典型值&#xff09;…

亚冬会绽放“云端”,联通云如何点亮冰城“科技之光”?

科技云报到原创。 35年前&#xff0c;中国第一次承办亚运会&#xff0c;宣传曲《亚洲雄风》红遍大江南北&#xff0c;其中有一句“我们亚洲&#xff0c;云也手握手”。如今回看&#xff0c;这句话仿佛有了更深的寓意&#xff1a;一朵朵科技铸就的“云”&#xff0c;把人和人连…

【C++ 真题】P2920 [USACO08NOV] Time Management S

P2920 [USACO08NOV] Time Management S 题目描述 Ever the maturing businessman, Farmer John realizes that he must manage his time effectively. He has N jobs conveniently numbered 1…N (1 < N < 1,000) to accomplish (like milking the cows, cleaning the …

#用于跟踪和反映数据源对象的变化--useMagical

import {cloneDeep } from lodash-es import {reactive, ref, watchEffect } from vue /*** 神奇函数* @param source 数据源,* @param initKey 固定需要返回的属性* @description 收集数据源中修改的属性,并返回* @version 1.0 仅支持对象* @author sufei* @return { source, …

快速排序

目录 什么是快速排序&#xff1a; 图解&#xff1a; 递归法&#xff1a; 方法一&#xff08;Hoare法&#xff09;&#xff1a; 代码实现&#xff1a; 思路分析&#xff1a; 方法二&#xff08;挖坑法&#xff09;&#xff1a; 代码实现&#xff1a; 思路分析&#xff1a; 非递…

数据结构-链式二叉树

文章目录 一、链式二叉树1.1 链式二叉树的创建1.2 根、左子树、右子树1.3 二叉树的前中后序遍历1.3.1前(先)序遍历1.3.2中序遍历1.3.3后序遍历 1.4 二叉树的节点个数1.5 二叉树的叶子结点个数1.6 第K层节点个数1.7 二叉树的高度1.8 查找指定的值(val)1.9 二叉树的销毁 二、层序…

gitlab无法登录问题

在我第一次安装gitlab的时候发现登录页面是 正常的页面应该是 这种情况的主要原因是不是第一次登录&#xff0c;所以我们要找到原先的密码 解决方式&#xff1a; [rootgitlab ~]# vim /etc/gitlab/initial_root_password# WARNING: This value is valid only in the followin…

Elastic Cloud Serverless 现已在 Microsoft Azure 上提供技术预览版

作者&#xff1a;来自 Elastic Yuvi Gupta Elastic Cloud Serverless 提供了启动和扩展安全性、可观察性和搜索解决方案的最快方法 — 无需管理基础设施。 今天&#xff0c;我们很高兴地宣布 Microsoft Azure 上的 Elastic Cloud Serverless 技术预览版现已在美国东部地区推出。…

AI前端开发:蓬勃发展的机遇与挑战

人工智能&#xff08;AI&#xff09;领域的飞速发展&#xff0c;正深刻地改变着我们的生活方式&#xff0c;也为技术人才&#xff0c;特别是AI代码生成领域的专业人士&#xff0c;带来了前所未有的机遇。而作为AI应用与用户之间桥梁的前端开发&#xff0c;其重要性更是日益凸显…

Spring Boot整合DeepSeek实现AI对话(API调用和本地部署)

本篇文章会分基于DeepSeek开放平台上的API&#xff0c;以及本地私有化部署DeepSeek R1模型两种方式来整合使用。 本地化私有部署可以参考这篇博文 全面认识了解DeepSeek利用ollama在本地部署、使用和体验deepseek-r1大模型 Spring版本选择 根据Spring官网的描述 Spring AI是一…