python如何爬取前程无忧招聘数据
这篇文章主要介绍"python如何爬取前程无忧招聘数据",在日常操作中,相信很多人在python如何爬取前程无忧招聘数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"python如何爬取前程无忧招聘数据"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1. 爬取数据
目标url:
https://www.51job.com/
在前程无忧网输入关键字python,搜索有关的岗位数据。翻页查看这些招聘岗位信息,可以发现url翻页的规律。
检查网页源代码,可以找到想要提取的数据。
部分爬虫代码如下,完整见文末下载
async def parse(self, text): # 正则匹配提取数据 try: job_name = re.findall('"job_name":"(.*?)",', text) # 职位 company_name = re.findall('"company_name":"(.*?)",', text) # 公司名称 salary = re.findall('"providesalary_text":"(.*?)",', text) salary = [i.replace('\\', '') for i in salary] # 薪酬 去掉 \ 符号 city = re.findall('"workarea_text":"(.*?)",', text) # 城市 job_welfare = re.findall('"jobwelf":"(.*?)",', text) # 职位福利 attribute_text = re.findall('"attribute_text":(.*?),"companysize_text"', text) attribute_text = ['|'.join(eval(i)) for i in attribute_text] companysize = re.findall('"companysize_text":"(.*?)",', text) # 公司规模 category = re.findall('"companyind_text":"(.*?)",', text) category = [i.replace('\\', '') for i in category] # 公司所属行业 去掉 \ 符号 datas = pd.DataFrame({'company_name': company_name, 'job_name': job_name, 'companysize': companysize, 'city': city, 'salary': salary, 'attribute_text': attribute_text, 'category': category, 'job_welfare': job_welfare}) datas.to_csv('job_info.csv', mode='a+', index=False, header=True) logging.info({'company_name': company_name, 'job_name': job_name, 'company_size': companysize, 'city': city, 'salary': salary, 'attribute_text': attribute_text, 'category': category, 'job_welfare': job_welfare}) except Exception as e: print(e)
运行效果如下:
爬取了200页的招聘数据,共10000条招聘信息,用时49.919s。
2. 数据查看和预处理
import pandas as pddf = pd.read_csv('job_info.csv')# 异步爬虫爬取数据时 datas.to_csv('job_info.csv', mode='a+', index=False, header=True) 删除多的列名df1 = df[df['salary'] != 'salary']# 查看前10行df1.head(10)
# city那一列数据 处理为城市# 按 - 分割 expand=True 0那一列重新赋值给df['city']df1['city'] = df1['city'].str.split('-', expand=True)[0]df1.head(10)
# 经验要求 学历要求 有的话是在attribute_text列里df['attribute_text'].str.split('|', expand=True)
df1['experience'] = df1['attribute_text'].str.split('|', expand=True)[1]df1['education'] = df1['attribute_text'].str.split('|', expand=True)[2]df1
保存为已清洗数据
df1.to_csv('已清洗数据.csv', index=False)
查看索引、数据类型和内存信息
df2 = pd.read_csv('已清洗数据.csv')df2.info()
3. 数据分析与可视化
(1) 柱形图展示招聘岗位数最多的城市Top10
代码如下:
import pandas as pdimport randomimport matplotlib.pyplot as pltimport matplotlib as mpldf = pd.read_csv('已清洗数据.csv')# 有些是异地招聘 过滤掉data = df[df['city'] != '异地招聘']['city'].value_counts()city = list(data.index)[:10] # 城市nums = list(data.values)[:10] # 岗位数print(city)print(nums)colors = ['#FF0000', '#0000CD', '#00BFFF', '#008000', '#FF1493', '#FFD700', '#FF4500', '#00FA9A', '#191970', '#9932CC']random.shuffle(colors)# 设置大小 像素plt.figure(figsize=(9, 6), dpi=100)# 设置中文显示mpl.rcParams['font.family'] = 'SimHei'# 绘制柱形图 设置柱条的宽度和颜色# color参数 每根柱条配置不同颜色plt.bar(city, nums, width=0.5, color=colors)# 添加描述信息plt.title('招聘岗位数最多的城市Top10', fontsize=16)plt.xlabel('城市', fontsize=12)plt.ylabel('岗位数', fontsize=12)# 展示图片plt.show()
运行效果如下:
['上海', '深圳', '广州', '北京', '杭州', '成都', '武汉', '南京', '苏州', '长沙'][2015, 1359, 999, 674, 550, 466, 457, 444, 320, 211]
上海、深圳、广州、北京提供了很多岗位,杭州、成都、武汉、南京等城市的招聘岗位数量也比较可观。
(2) 计算岗位数据的薪酬,处理为多少K/月,划分薪酬区间,统计薪酬分布情况,饼图展示。
代码如下:
# 设置中文显示mpl.rcParams['font.family'] = 'SimHei'# 设置大小 像素plt.figure(figsize=(9, 6), dpi=100)plt.axes(aspect='equal') # 保证饼图是个正圆explodes = [0, 0, 0, 0.1, 0.2, 0.3, 0.4, 0.5]plt.pie(nums, pctdistance=0.75, shadow=True, colors=colors, autopct='%.2f%%', explode=explodes, startangle=15, labeldistance=1.1, )# 设置图例 调节图例位置plt.legend(part_interval, bbox_to_anchor=(1.0, 1.0))plt.title('招聘岗位的薪酬分布', fontsize=15)plt.show()
运行效果如下:
招聘岗位给的薪酬在5K-10K和10K-15K区间所占的比例较大,也有一定比例的50K以上的高薪资岗位。
(3) 查看招聘岗位对学历的要求的情况,水平柱形图可视化。
mport pandas as pdimport matplotlib.pyplot as pltimport matplotlib as mpldf = pd.read_csv(r'已清洗数据.csv')['education']data = df.value_counts()labels = ['大专', '本科', '硕士', '博士']nums = [data[i] for i in labels]print(labels)print(nums)colors = ['cyan', 'red', 'yellow', 'blue']# 设置中文显示mpl.rcParams['font.family'] = 'SimHei'# 设置显示风格plt.style.use('ggplot')# 设置大小 像素plt.figure(figsize=(8, 6), dpi=100)# 绘制水平柱状图 plt.barh(labels, nums, height=0.36, color=colors)plt.title('招聘岗位对学历的要求', fontsize=16)plt.xlabel('岗位数量', fontsize=12)plt.show()
运行效果如下:
['大专', '本科', '硕士', '博士'][2052, 6513, 761, 45]
(4) 查看招聘岗位对工作经验的要求的情况,水平柱形图可视化。
由于得到的工作经验列里的数据并不规范,统计时需做特殊处理
代码如下:
# 设置中文显示mpl.rcParams['font.family'] = 'SimHei'# 设置显示风格plt.style.use('ggplot')# 设置大小 像素plt.figure(figsize=(9, 6), dpi=100)# 绘制水平柱状图plt.barh(labels, nums, height=0.5, color=colors)plt.title('招聘岗位对工作经验的要求', fontsize=16)plt.xlabel('岗位数量', fontsize=12)plt.show()
运行效果如下:
3-4年经验 33612年经验 21141年经验 14715-7年经验 1338在校生\/应届生 661无需经验 417本科 1828-9年经验 10510年以上经验 64硕士 59招1人 57招若干人 57招2人 42大专 30招3人 14博士 11招5人 9招4人 5招10人 2招7人 1Name: experience, dtype: int64['无需经验', '1年经验', '2年经验', '3-4年经验', '5-7年经验', '8-9年经验', '10年以上经验'][1260, 1530, 2114, 3372, 1338, 105, 64]
【】#### (5) 查看招聘公司所属行业的分布情况,词云展示。
代码如下:
import pandas as pdimport collectionsfrom wordcloud import WordCloudimport matplotlib.pyplot as pltdf = pd.read_csv(r'已清洗数据.csv')['category']data = list(df.values)word_list = []for i in data: x = i.split('/') for j in x: word_list.append(j)word_counts = collections.Counter(word_list)# 绘制词云my_cloud = WordCloud( background_color='white', # 设置背景颜色 默认是black width=900, height=500, font_path='simhei.ttf', # 设置字体 显示中文 max_font_size=120, # 设置字体最大值 min_font_size=15, # 设置子图最小值 random_state=60 # 设置随机生成状态,即多少种配色方案).generate_from_frequencies(word_counts)# 显示生成的词云图片plt.imshow(my_cloud, interpolation='bilinear')# 显示设置词云图中无坐标轴plt.axis('off')plt.show()
运行效果如下:
到此,关于"python如何爬取前程无忧招聘数据"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!