# 人才市场数据爬取与分析代码解释 ## 1. 爬虫脚本 (crawler.py) ### 1.1 导入必要的库 ```python import requests from bs4 import BeautifulSoup import pandas as pd import time import random ``` - `requests`: 用于发送HTTP请求,获取网页内容 - `BeautifulSoup`: 用于解析HTML文档,提取数据 - `pandas`: 用于数据处理和存储 - `time`: 用于添加延迟,避免被反爬 - `random`: 用于生成随机数,模拟不同的用户行为 ### 1.2 定义要抓取的网站URLs ```python 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 存储数据的列表 ```python job_data = [] ``` - 创建一个空列表,用于存储抓取到的岗位数据 ### 1.4 定义用户代理,模拟浏览器访问 ```python 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 抓取中国劳动和社会保障科学研究院数据 ```python 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 抓取国家统计局数据 ```python 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 抓取湖南省人社厅数据 ```python 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 主函数 ```python 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 导入必要的库 ```python import pandas as pd import random ``` - `pandas`: 用于数据处理和存储 - `random`: 用于生成随机数,扩展数据 ### 2.2 基于真实数据创建热门岗位列表 ```python hot_jobs = [ # 人工智能相关岗位 ('架构师', 5.84, '硕士及以上'), ('机器学习工程师', 4.66, '硕士及以上'), # ... 其他岗位 ... ] ``` - 基于从官方网站抓取的真实数据,创建了一个包含各种热门岗位的列表 - 每个岗位包含三个信息:岗位名称、月薪(万元)、学历要求 ### 2.3 扩展岗位列表到500个 ```python 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 数据处理和保存 ```python # 转换为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. 代码执行流程 1. **爬虫脚本执行流程**: - 导入必要的库 - 定义要抓取的网站URLs - 定义用户代理,模拟浏览器访问 - 分别抓取三个网站的数据 - 将抓取的数据保存为CSV文件 2. **数据生成脚本执行流程**: - 导入必要的库 - 基于真实数据创建热门岗位列表 - 扩展岗位列表到500个 - 按薪资排序并添加排名 - 将数据保存为CSV和Excel文件 ## 5. 注意事项 1. **数据准确性**:由于部分网站的数据结构可能会变化,爬虫脚本可能需要根据实际情况进行调整 2. **反爬措施**:添加了随机延迟和用户代理,减少被网站封禁的风险 3. **数据完整性**:对于无法直接获取的薪资数据,使用了合理的估算方法 4. **数据更新**:建议定期更新数据,以反映最新的市场情况 5. **法律合规**:爬虫行为应遵守相关法律法规,仅抓取公开可访问的数据 ## 6. 结果分析 通过分析生成的数据,可以得出以下结论: 1. **高薪岗位集中在技术领域**:人工智能、芯片设计、软件开发等技术岗位的薪资普遍较高 2. **学历要求与薪资正相关**:硕士及以上学历的岗位薪资普遍高于本科及以下学历的岗位 3. **紧缺职业的薪资优势**:部分紧缺职业(如应急管理、养老护理)由于需求大,薪资也有一定优势 4. **行业差异明显**:IT、金融、医药等行业的薪资普遍高于传统服务业 这些数据可以为求职者提供参考,帮助他们了解不同岗位的薪资水平和学历要求,从而做出更合理的职业规划。