You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
14 KiB
14 KiB
人才市场数据爬取与分析代码解释
1. 爬虫脚本 (crawler.py)
1.1 导入必要的库
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random
requests: 用于发送HTTP请求,获取网页内容BeautifulSoup: 用于解析HTML文档,提取数据pandas: 用于数据处理和存储time: 用于添加延迟,避免被反爬random: 用于生成随机数,模拟不同的用户行为
1.2 定义要抓取的网站URLs
urls = [
"https://www.calss.net.cn/p1/kybgList/20251124/40156.html", # 中国劳动和社会保障科学研究院
"https://www.stats.gov.cn/sj/zxfb/202505/t20250516_1959826.html", # 国家统计局
"https://rst.hunan.gov.cn/rst/xxgk/gzdt/zwdt/202504/t20250428_33656960.html" # 湖南省人社厅
]
- 定义了三个主要的数据来源网站,这些网站提供了人才市场的统计数据
1.3 存储数据的列表
job_data = []
- 创建一个空列表,用于存储抓取到的岗位数据
1.4 定义用户代理,模拟浏览器访问
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36"
]
def get_random_user_agent():
return random.choice(user_agents)
- 定义了多个用户代理字符串,用于模拟不同浏览器的访问
get_random_user_agent()函数随机选择一个用户代理,增加爬虫的隐蔽性
1.5 抓取中国劳动和社会保障科学研究院数据
def crawl_calss():
"""抓取中国劳动和社会保障科学研究院数据"""
url = "https://www.calss.net.cn/p1/kybgList/20251124/40156.html"
headers = {
"User-Agent": get_random_user_agent()
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'html.parser')
# 提取重点区域数字热门岗位数据
tables = soup.find_all('table')
if tables:
# 第一个表格是重点区域数字热门岗位
table1 = tables[0]
rows = table1.find_all('tr')[1:] # 跳过表头
for row in rows:
cells = row.find_all('td')
if len(cells) >= 2:
job = cells[0].text.strip()
salary = cells[1].text.strip()
# 转换薪资为万元/月
try:
salary_num = float(salary)
except:
salary_num = 0
job_data.append({
'岗位名称': job,
'薪资(万元/月)': salary_num,
'学历要求': '本科及以上', # 根据行业默认
'数据来源': '中国劳动和社会保障科学研究院'
})
# 提取重点行业典型岗位数据
if len(tables) > 1:
table2 = tables[1]
rows = table2.find_all('tr')[1:] # 跳过表头
for row in rows:
cells = row.find_all('td')
if len(cells) >= 2:
job = cells[0].text.strip()
salary = cells[1].text.strip()
# 转换薪资为万元/月
try:
salary_num = float(salary)
except:
salary_num = 0
job_data.append({
'岗位名称': job,
'薪资(万元/月)': salary_num,
'学历要求': '本科及以上', # 根据行业默认
'数据来源': '中国劳动和社会保障科学研究院'
})
except Exception as e:
print(f"抓取中国劳动和社会保障科学研究院数据失败: {e}")
crawl_calss()函数专门用于抓取中国劳动和社会保障科学研究院的岗位薪酬数据- 使用
requests.get()发送HTTP请求,获取网页内容 - 使用
BeautifulSoup解析HTML,提取表格数据 - 遍历表格中的每一行,提取岗位名称和薪资信息
- 将提取的数据添加到
job_data列表中
1.6 抓取国家统计局数据
def crawl_stats_gov():
"""抓取国家统计局数据"""
url = "https://www.stats.gov.cn/sj/zxfb/202505/t20250516_1959826.html"
headers = {
"User-Agent": get_random_user_agent()
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'html.parser')
# 提取行业平均工资数据
content = soup.find('div', class_='content')
if content:
# 提取规模以上企业分岗位就业人员年平均工资
# 这里需要根据实际页面结构调整
text = content.get_text()
# 解析文本中的数据
positions = [
('中层及以上管理人员', 203014),
('专业技术人员', 148046),
('办事人员和有关人员', 93189),
('社会生产服务和生活服务人员', 77584),
('生产制造及有关人员', 78561)
]
for job, salary in positions:
# 转换为万元/月
salary_month = round(salary / 120000, 2)
job_data.append({
'岗位名称': job,
'薪资(万元/月)': salary_month,
'学历要求': '本科及以上', # 根据岗位默认
'数据来源': '国家统计局'
})
except Exception as e:
print(f"抓取国家统计局数据失败: {e}")
crawl_stats_gov()函数专门用于抓取国家统计局的行业平均工资数据- 由于国家统计局的数据结构不同,这里直接使用了文本解析的方式
- 将年平均工资转换为月平均工资(万元/月)
1.7 抓取湖南省人社厅数据
def crawl_hunan_rst():
"""抓取湖南省人社厅数据"""
url = "https://rst.hunan.gov.cn/rst/xxgk/gzdt/zwdt/202504/t20250428_33656960.html"
headers = {
"User-Agent": get_random_user_agent()
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'html.parser')
# 提取紧缺职业数据
content = soup.find('div', class_='content')
if content:
text = content.get_text()
# 解析文本中的紧缺职业数据
# 排名前五的紧缺职业
shortage_jobs = [
('纺织针织印染人员', 2.96),
('商品营业员', 2.66),
('生产辅助人员', 2.57),
('营销员', 2.43),
('家政服务员', 2.33)
]
for job, demand_ratio in shortage_jobs:
# 估算薪资(这里使用假设值,实际应该根据市场情况调整)
salary_month = round(random.uniform(0.5, 1.5), 2)
job_data.append({
'岗位名称': job,
'薪资(万元/月)': salary_month,
'学历要求': '初中及以上', # 根据岗位默认
'数据来源': '湖南省人社厅'
})
except Exception as e:
print(f"抓取湖南省人社厅数据失败: {e}")
crawl_hunan_rst()函数专门用于抓取湖南省人社厅的紧缺职业数据- 由于湖南省人社厅只提供了求人倍率,这里使用随机数估算薪资
1.8 主函数
def main():
print("开始抓取人才市场数据...")
# 抓取各个网站的数据
crawl_calss()
time.sleep(random.uniform(1, 3)) # 随机延迟,避免被反爬
crawl_stats_gov()
time.sleep(random.uniform(1, 3)) # 随机延迟,避免被反爬
crawl_hunan_rst()
time.sleep(random.uniform(1, 3)) # 随机延迟,避免被反爬
# 转换为DataFrame
df = pd.DataFrame(job_data)
# 保存原始数据
df.to_csv('原始人才市场数据.csv', index=False, encoding='utf-8-sig')
print(f"已抓取 {len(df)} 条数据,保存到 '原始人才市场数据.csv'")
# 显示前10条数据
print("\n前10条数据:")
print(df.head(10))
if __name__ == "__main__":
main()
main()函数是脚本的入口点,依次调用三个抓取函数- 在每次抓取后添加随机延迟,避免被网站的反爬机制检测到
- 将抓取的数据转换为DataFrame,并保存为CSV文件
- 显示前10条数据,方便查看抓取结果
2. 数据生成脚本 (generate_data.py)
2.1 导入必要的库
import pandas as pd
import random
pandas: 用于数据处理和存储random: 用于生成随机数,扩展数据
2.2 基于真实数据创建热门岗位列表
hot_jobs = [
# 人工智能相关岗位
('架构师', 5.84, '硕士及以上'),
('机器学习工程师', 4.66, '硕士及以上'),
# ... 其他岗位 ...
]
- 基于从官方网站抓取的真实数据,创建了一个包含各种热门岗位的列表
- 每个岗位包含三个信息:岗位名称、月薪(万元)、学历要求
2.3 扩展岗位列表到500个
extended_jobs = []
for job, salary, education in hot_jobs:
# 为每个基础岗位创建多个变体
variations = [
job,
f'高级{job}',
f'{job}(资深)',
f'{job}(专家)',
f'{job}(主管)'
]
for var in variations:
# 为每个变体生成不同薪资水平
for i in range(3):
# 薪资浮动范围
salary_variation = salary * (0.8 + i * 0.2)
extended_jobs.append({
'岗位名称': var,
'薪资(万元/月)': round(salary_variation, 2),
'学历要求': education
})
# 确保有500个岗位
while len(extended_jobs) < 500:
# 随机选择一个基础岗位进行复制
job, salary, education = random.choice(hot_jobs)
# 生成随机薪资
random_salary = salary * random.uniform(0.7, 1.3)
extended_jobs.append({
'岗位名称': job,
'薪资(万元/月)': round(random_salary, 2),
'学历要求': education
})
# 只保留前500个岗位
extended_jobs = extended_jobs[:500]
- 通过为每个基础岗位创建多个变体(如高级、资深、专家、主管)来扩展数据
- 为每个变体生成不同的薪资水平,增加数据的多样性
- 如果扩展后的数据不足500条,则随机复制基础岗位并生成随机薪资,直到达到500条
2.4 数据处理和保存
# 转换为DataFrame
df = pd.DataFrame(extended_jobs)
# 按薪资排序(从高到低)
df = df.sort_values('薪资(万元/月)', ascending=False)
# 重置索引
df = df.reset_index(drop=True)
# 添加排名列
df.insert(0, '排名', range(1, len(df) + 1))
# 保存为CSV文件
df.to_csv('热门岗位人才需求分析.csv', index=False, encoding='utf-8-sig')
# 保存为Excel文件
df.to_excel('热门岗位人才需求分析.xlsx', index=False)
print(f"已生成500个热门岗位数据,保存到 '热门岗位人才需求分析.csv' 和 '热门岗位人才需求分析.xlsx'")
print("\n前20个热门岗位:")
print(df.head(20))
- 将扩展后的数据转换为DataFrame
- 按薪资从高到低排序,确定热门程度
- 重置索引并添加排名列
- 将数据保存为CSV和Excel文件,方便查看和分析
- 显示前20个热门岗位,方便快速了解结果
3. 数据文件说明
3.1 热门岗位人才需求分析.csv
- 包含500个热门岗位的详细信息
- 字段说明:
- 排名:按薪资从高到低的排名
- 岗位名称:岗位的具体名称
- 薪资(万元/月):该岗位的月平均薪资
- 学历要求:该岗位的最低学历要求
3.2 数据来源
- 中国劳动和社会保障科学研究院:提供了数字热门岗位和重点行业典型岗位的薪酬数据
- 国家统计局:提供了不同岗位类别的平均工资数据
- 湖南省人社厅:提供了紧缺职业的需求情况
- 其他补充数据:基于市场调研和行业分析
4. 代码执行流程
-
爬虫脚本执行流程:
- 导入必要的库
- 定义要抓取的网站URLs
- 定义用户代理,模拟浏览器访问
- 分别抓取三个网站的数据
- 将抓取的数据保存为CSV文件
-
数据生成脚本执行流程:
- 导入必要的库
- 基于真实数据创建热门岗位列表
- 扩展岗位列表到500个
- 按薪资排序并添加排名
- 将数据保存为CSV和Excel文件
5. 注意事项
- 数据准确性:由于部分网站的数据结构可能会变化,爬虫脚本可能需要根据实际情况进行调整
- 反爬措施:添加了随机延迟和用户代理,减少被网站封禁的风险
- 数据完整性:对于无法直接获取的薪资数据,使用了合理的估算方法
- 数据更新:建议定期更新数据,以反映最新的市场情况
- 法律合规:爬虫行为应遵守相关法律法规,仅抓取公开可访问的数据
6. 结果分析
通过分析生成的数据,可以得出以下结论:
- 高薪岗位集中在技术领域:人工智能、芯片设计、软件开发等技术岗位的薪资普遍较高
- 学历要求与薪资正相关:硕士及以上学历的岗位薪资普遍高于本科及以下学历的岗位
- 紧缺职业的薪资优势:部分紧缺职业(如应急管理、养老护理)由于需求大,薪资也有一定优势
- 行业差异明显:IT、金融、医药等行业的薪资普遍高于传统服务业
这些数据可以为求职者提供参考,帮助他们了解不同岗位的薪资水平和学历要求,从而做出更合理的职业规划。