Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python爬虫:爬取拉勾网职位并分析

Python爬虫:爬取拉勾网职位并分析

作者头像
数据科学社区
发布于 2018-07-30 07:05:24
发布于 2018-07-30 07:05:24
1.6K00
代码可运行
举报
文章被收录于专栏:大数据杂谈大数据杂谈
运行总次数:0
代码可运行

作者:闲庭信步 原文链接: https://blog.csdn.net/danspace1/article/details/80197106 如需转载,请联系原作者。

0. 前言

本文从拉勾网爬取深圳市数据分析的职位信息,并以CSV格式保存至电脑,之后进行数据清洗,生成词云,进行描述统计和回归分析,最终得出结论。

1. 用到的软件包

Python版本: Python3.6

requests:下载网页

math:向上取整

time:暂停进程

pandas:数据分析并保存为csv文件

matplotlib:画图

statsmodels:统计建模

wordcloud、scipy、jieba:生成中文词云

pylab:设置画图能显示中文

2. 解析网页

打开Chrome,在拉勾网搜索深圳市的“数据分析”职位,使用检查功能查看网页源代码,发现拉勾网有反爬虫机制,职位信息并不在源代码里,而是保存在JSON的文件里,因此我们直接下载JSON,并使用字典方法直接读取数据。

抓取网页时,需要加上头部信息,才能获取所需的数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_json(url,num):  
   '''''从网页获取JSON,使用POST请求,加上头部信息'''  
   my_headers = {  
           'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',  
            'Host':'www.lagou.com',  
           'Referer':'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=',  
            'X-Anit-Forge-Code':'0',  
           'X-Anit-Forge-Token': 'None',  
           'X-Requested-With':'XMLHttpRequest'  
           }  

   my_data = {  
           'first': 'true',  
           'pn':num,  
           'kd':'数据分析'}  

   res = requests.post(url, headers = my_headers, data = my_data)  
   res.raise_for_status()  
   res.encoding = 'utf-8'  
   # 得到包含职位信息的字典  
   page = res.json()  
   return page

在搜索结果的第一页,我们可以从JSON里读取总职位数,按照每页15个职位,获得要爬取的页数。再使用循环按页爬取,将职位信息汇总,输出为CSV格式。

程序运行如图:

抓取结果如图:

3. 数据清洗

数据清洗占数据分析工作量的大头。在拉勾网搜索深圳市的“数据分析”职位,结果得到369个职位。查看职位名称时,发现有4个实习岗位。由于我们研究的是全职岗位,所以先将实习岗位剔除。由于工作经验和工资都是字符串形式的区间,我们先用正则表达式提取数值,输出列表形式。工作经验取均值,工资取区间的四分位数值,比较接近现实。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 数据清洗,剔除实习岗位  
df.drop(df[df['职位名称'].str.contains('实习')].index, inplace=True)  
# print(df.describe())  

# 由于CSV文件内的数据是字符串形式,先用正则表达式将字符串转化为列表,再取区间的均值  
pattern = '\d+'  
df['工作年限'] = df['工作经验'].str.findall(pattern)  

avg_work_year = []  
for i in df['工作年限']:  
   # 如果工作经验为'不限''应届毕业生',那么匹配值为空,工作年限为0  
   if len(i) == 0:  
       avg_work_year.append(0)  
   # 如果匹配值为一个数值,那么返回该数值  
   elif len(i) == 1:  
       avg_work_year.append(int(''.join(i)))  
   # 如果匹配值为一个区间,那么取平均值  
   else:  
       num_list = [int(j) for j in i]  
       avg_year = sum(num_list)/2  
       avg_work_year.append(avg_year)  

df['经验'] = avg_work_year  

# 将字符串转化为列表,再取区间的前25%,比较贴近现实  
df['salary'] = df['工资'].str.findall(pattern)  

avg_salary = []  
for k in df['salary']:  
   int_list = [int(n) for n in k]  
   avg_wage = int_list[0]+(int_list[1]-int_list[0])/4  
   avg_salary.append(avg_wage)  

df['月工资'] = avg_salary  
# 将清洗后的数据保存,以便检查  
df.to_csv('draft.csv', index = False)

4. 词云

我们将职位福利这一列的数据汇总,生成一个字符串,按照词频生成词云实现python可视化。以下是原图和词云的对比图,可见五险一金在职位福利里出现的频率最高,平台、福利、发展空间、弹性工作次之。

5. 描述统计

可知,数据分析师的均值在14.6K,中位数在12.5K,算是较有前途的职业。数据分析散布在各个行业,但在高级层面上涉及到数据挖掘机器学习,在IT业有长足的发展。

我们再来看工资的分布,这对于求职来讲是重要的参考:

工资在10-15K的职位最多,在15-20K的职位其次。个人愚见,10-15K的职位以建模为主,20K以上的职位以数据挖掘、大数据架构为主。

我们再来看职位在各区的分布:

数据分析职位有62.9%在南山区,有25.8%在福田区,剩下少数分布在龙岗区、罗湖区、宝安区、龙华新区。我们以小窥大,可知南山区和福田区是深圳市科技业的中心。

6. 实证统计

我们希望获得工资与工作经验、学历的关系,由于学历分三类,需设置3个虚拟变量:大专、本科、硕士。多元回归结果如下:

在0.05的显著性水平下,F值为82.53,说明回归关系是显著的。t检验和对应的P值都小于0.05表明,工作经验和3种学历在统计上都是显著的。另外,R-squared的值为0.41,说明工作经验和学历仅仅解释了工资变异性的41%。这点不难理解,即使职位都叫数据分析师,实际的工作内容差异比较大,有的只是用Excel做基本分析,有的用Python、R做数据挖掘。另外,各个公司的规模和它愿意开出的工资也不尽相同。而工作内容的差异和公司的大方程度是很难单凭招聘网页上的宣传而获得实际数据,导致了模型的拟合优度不是很好这一现实。

由于回归模型总体是显著的,我们可以将自变量的值代入回归方程,获得各个学历的工资的期望值E。对于数据分析职位,以1年工作经验为例,大专学历的期望工资是7.8K,本科学历的期望工资是10.8K,硕士学历的期望工资是17.6K。这证实了“知识改变命运”这一说法。

7. 完整代码

由于每次运行爬虫耗时约30分钟,而运行数据分析耗时几秒钟,我们将两部分的工作单独运行,以节省数据分析的时间。

7.1 爬虫部分的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests  
import math  
import pandas as pd  
import time  

def get_json(url,num):  
   '''''从网页获取JSON,使用POST请求,加上头部信息'''  
   my_headers = {  
           'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',  
            'Host':'www.lagou.com',  
           'Referer':'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=',  
            'X-Anit-Forge-Code':'0',  
           'X-Anit-Forge-Token': 'None',  
           'X-Requested-With':'XMLHttpRequest'  
           }  

   my_data = {  
           'first': 'true',  
           'pn':num,  
           'kd':'数据分析'}  

   res = requests.post(url, headers = my_headers, data = my_data)  
   res.raise_for_status()  
   res.encoding = 'utf-8'  
   # 得到包含职位信息的字典  
   page = res.json()  
   return page  


def get_page_num(count):  
   '''''计算要抓取的页数'''  
   # 每页15个职位,向上取整  
   res = math.ceil(count/15)  
   # 拉勾网最多显示30页结果  
   if res > 30:  
       return 30  
   else:  
       return res  

def get_page_info(jobs_list):  
   '''''对一个网页的职位信息进行解析,返回列表'''  
   page_info_list = []  
   for i in jobs_list:  
       job_info = []  
       job_info.append(i['companyFullName'])  
       job_info.append(i['companyShortName'])  
       job_info.append(i['companySize'])  
       job_info.append(i['financeStage'])  
       job_info.append(i['district'])  
       job_info.append(i['positionName'])  
       job_info.append(i['workYear'])  
       job_info.append(i['education'])  
       job_info.append(i['salary'])  
       job_info.append(i['positionAdvantage'])  
       page_info_list.append(job_info)  
   return page_info_list  

def main():  
   url = 'https://www.lagou.com/jobs/positionAjax.json?city=%E6%B7%B1%E5%9C%B3&needAddtionalResult=false'  
    # 先设定页数为1,获取总的职位数  
   page_1 = get_json(url,1)  
   total_count = page_1['content']['positionResult']['totalCount']  
   num = get_page_num(total_count)  
   total_info = []  
   time.sleep(20)  
   print('职位总数:{},页数:{}'.format(total_count,num))  

   for n in range(1,num+1):  
       # 对每个网页读取JSON, 获取每页数据  
       page = get_json(url,n)  
       jobs_list = page['content']['positionResult']['result']  
       page_info = get_page_info(jobs_list)  
       total_info += page_info  
       print('已经抓取第{}页, 职位总数:{}'.format(n, len(total_info)))  
       # 每次抓取完成后,暂停一会,防止被服务器拉黑  
       time.sleep(30)  
   #将总数据转化为data frame再输出  
   df = pd.DataFrame(data = total_info,columns = ['公司全名','公司简称','公司规模','融资阶段','区域','职位名称','工作经验','学历要求','工资','职位福利'])   
    df.to_csv('lagou_jobs.csv',index = False)  
   print('已保存为csv文件.')  

if __name__== "__main__":   
   main()

7.2 数据分析部分的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd  
import matplotlib.pyplot as plt  
import statsmodels.api as sm  
from wordcloud import WordCloud  
from scipy.misc import imread  
import jieba  
from pylab import mpl  

# 使matplotlib模块能显示中文  
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体  
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题  

# 读取数据  
df = pd.read_csv('lagou_jobs.csv', encoding = 'gbk')  

# 数据清洗,剔除实习岗位  
df.drop(df[df['职位名称'].str.contains('实习')].index, inplace=True)  
# print(df.describe())  

# 由于CSV文件内的数据是字符串形式,先用正则表达式将字符串转化为列表,再取区间的均值  
pattern = '\d+'  
df['工作年限'] = df['工作经验'].str.findall(pattern)  

avg_work_year = []  
for i in df['工作年限']:  
   # 如果工作经验为'不限''应届毕业生',那么匹配值为空,工作年限为0  
   if len(i) == 0:  
       avg_work_year.append(0)  
   # 如果匹配值为一个数值,那么返回该数值  
   elif len(i) == 1:  
       avg_work_year.append(int(''.join(i)))  
   # 如果匹配值为一个区间,那么取平均值  
   else:  
       num_list = [int(j) for j in i]  
       avg_year = sum(num_list)/2  
       avg_work_year.append(avg_year)  

df['经验'] = avg_work_year  

# 将字符串转化为列表,再取区间的前25%,比较贴近现实  
df['salary'] = df['工资'].str.findall(pattern)  

avg_salary = []  
for k in df['salary']:  
   int_list = [int(n) for n in k]  
   avg_wage = int_list[0]+(int_list[1]-int_list[0])/4  
   avg_salary.append(avg_wage)  

df['月工资'] = avg_salary  
# 将清洗后的数据保存,以便检查  
df.to_csv('draft.csv', index = False)  

# 描述统计  
print('数据分析师工资描述:\n{}'.format(df['月工资'].describe()))  

# 绘制频率直方图并保存  
plt.hist(df['月工资'],bins = 12)  
plt.xlabel('工资 (千元)')   
plt.ylabel('频数')   
plt.title("工资直方图")   
plt.savefig('histogram.jpg')  
plt.show()  

# 绘制饼图并保存  
count = df['区域'].value_counts()  
# 将龙华区和龙华新区的数据汇总  
count['龙华新区'] += count['龙华区']   
del count['龙华区']  
plt.pie(count, labels = count.keys(),labeldistance=1.4,autopct='%2.1f%%')  
plt.axis('equal')  # 使饼图为正圆形  
plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))  
plt.savefig('pie_chart.jpg')  
plt.show()  

# 绘制词云,将职位福利中的字符串汇总  
text = ''  
for line in df['职位福利']:  
   text += line  
# 使用jieba模块将字符串分割为单词列表      
cut_text = ' '.join(jieba.cut(text))  
color_mask = imread('cloud.jpg')  #设置背景图  
cloud = WordCloud(  
       font_path = 'yahei.ttf',   
       background_color = 'white',  
       mask = color_mask,  
       max_words = 1000,  
       max_font_size = 100          
       )  

word_cloud = cloud.generate(cut_text)  
# 保存词云图片  
word_cloud.to_file('word_cloud.jpg')  
plt.imshow(word_cloud)  
plt.axis('off')  
plt.show()  

# 实证统计,将学历不限的职位要求认定为最低学历:大专  
df['学历要求'] = df['学历要求'].replace('不限','大专')  

# 学历分为大专\本科\硕士,将它们设定为虚拟变量  
dummy_edu = pd.get_dummies(df['学历要求'],prefix = '学历')  
# 构建回归数组  
df_with_dummy = pd.concat([df['月工资'],df['经验'],dummy_edu],axis = 1)  

# 建立多元回归模型  
y = df_with_dummy['月工资']  
X = df_with_dummy[['经验','学历_大专','学历_本科','学历_硕士']]  
X=sm.add_constant(X)   
model = sm.OLS(y,X)  
results = model.fit()  
print('回归方程的参数:\n{}\n'.format(results.params))  
print('回归结果:\n{}'.format(results.summary()))

- The End -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据杂谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[爬虫+数据分析] 分析北京Python开发的现状|文末送书5本
相信各位同学多多少少在拉钩上投过简历,今天突然想了解一下北京Python开发的薪资水平、招聘要求、福利待遇以及公司地理位置。既然要分析那必然是现有数据样本。本文通过爬虫和数据分析为大家展示一下北京Python开发的现状,希望能够在职业规划方面帮助到大家!!!
龙哥
2019/07/30
7470
[爬虫+数据分析] 分析北京Python开发的现状|文末送书5本
[爬虫+数据分析] 分析北京Python开发的现状
相信各位同学多多少少在拉钩上投过简历,今天突然想了解一下北京Python开发的薪资水平、招聘要求、福利待遇以及公司地理位置。既然要分析那必然是现有数据样本。本文通过爬虫和数据分析为大家展示一下北京Python开发的现状,希望能够在职业规划方面帮助到大家!!!
小小詹同学
2019/11/13
9310
新手向-爬取分析拉勾网招聘信息
然后在拉勾网搜索关键词 算法工程师 回车,然后点击下一页、下一页,此时开发者工具里的Network 下XHR(表示该网站是以Ajax方式获取刷新信息的)应当如下图(图中已标明了一些关键信息):
爱写bug
2019/07/05
6670
新手向-爬取分析拉勾网招聘信息
生信职位拉勾网爬取-附生信行业职业发展交流群
大家好,之前答应健明师兄爬取一下招聘网的信息,今天我就给大家推送一条生物信息行业就业信息的一些信息,数据源来自拉勾网 首先是整个网络爬虫的代码 1.导入相应的库 import requests import math import pandas as pd import time 2.构造爬取函数 def get_json(url,num): '''''从网页获取JSON,使用POST请求,加上头部信息''' my_headers = {
生信技能树
2018/11/22
6290
爬虫案例:拉勾网工作职位爬取
本人非IT专业,因为对python爬虫比较感兴趣,因此正在自学python爬虫,学习后就拿拉勾网练练手🤭,同时给zhenguo老师投稿,还能收获50元。 本次我们的目标是爬取拉勾网上成都的python岗位信息,包括职位名称、地区、薪水、任职要求、工作内容标签、公司名称、公司的类别及规模和福利待遇等信息,并将这些信息保存在一个CSV文件当中,废话不多说,开干! 首先我们进入拉勾网,输入Python关键信息,并选择成都,首先分析一下当前的url,url当中的pn=为页码,因此我们想爬取第几页的信息,
double
2022/06/27
1.2K0
爬虫案例:拉勾网工作职位爬取
用数据分析来看哪种 Python 程序员最赚钱?
本文以Python爬虫、数据分析、后端、数据挖掘、全栈开发、运维开发、高级开发工程师、大数据、机器学习、架构师这10个岗位,从拉勾网上爬取了相应的职位信息和任职要求,并通过数据分析可视化,直观地展示了这10个职位的平均薪资和学历、工作经验要求。
sergiojune
2018/10/23
9930
用数据分析来看哪种 Python 程序员最赚钱?
基于selenium爬取拉勾网职位信息
  Selenium 本是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。而这一特性为爬虫开发提供了一个选择及方向,由于其本身依赖于浏览器,所以使用Python的selenium库的前提是:需要下载相应的浏览器驱动程序,这里附上Chromedriver的下载地址:chromedriver;(64位的向下兼容,)
py3study
2020/01/16
6980
selenium爬取拉勾网python职位信息
直接上代码,主要爬取的是广州的python职位信息 from selenium import webdriver import time from lxml import etree import re from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by
菲宇
2019/11/20
1.2K0
CV领域最HOT的职位!你猜对了吗?(附代码)
1. 拉勾网通过关键字(图像、计算机视觉、算法、人工智能等)筛选出相应职位id,整理为列表
马上科普尚尚
2020/05/11
6020
CV领域最HOT的职位!你猜对了吗?(附代码)
用python爬取前程无忧网,看看我们是否真的“前程无忧”?
利用python爬取在前程无忧网搜索python关键字出现的最新的招聘数据,保存到本地Excel,进行数据查看和预处理,然后利用matplotlib进行数据分析和可视化。
龙哥
2020/09/04
1K0
用python爬取前程无忧网,看看我们是否真的“前程无忧”?
Python 使用selenium爬取拉钩网Python职位信息(爬虫)
17/10 周四 晴 整体思路: 1 使用我们最近讲的selenium模块进行模拟浏览器爬取 2 网页解析使用 xpath(底层为c语言,效率高) 3保存为csv数据 需要的模块: impo
Python知识大全
2020/02/13
6330
Python 使用selenium爬取拉钩网Python职位信息(爬虫)
Python爬虫之六:智联招聘进阶版
运行平台: Windows Python版本: Python3.6 IDE: Sublime Text 其他工具: Chrome浏览器
王强
2018/08/09
1.2K0
Python爬虫之六:智联招聘进阶版
轻松爬取拉勾网招聘岗位信息
最近发现一些朋友想要跳槽,正值疫情,也不知道现在市场的如何,同时目前的IT行业更是越来越难,技术革新越来越快,对新的岗位的需求也是不断的变化,因此就会想知道现在的应聘岗位对面试者的要求有哪些,各地的某个岗位薪资范围大概是多少等信息时候,我们就需要到某个招聘网站上不断的刷页面,看数据,但是简单的想一下,可以通过Python脚本来批量的分析招聘网站上各个岗位在不同城市的需求,高效的快捷的方便我们掌握大致的方向。
公众号: 云原生生态圈
2020/07/02
7550
轻松爬取拉勾网招聘岗位信息
洞察 | 深圳数据分析师的职业前景如何?爬完拉勾数据给你分析 (附代码和过程)
通过对局部地区某一岗位的总体分析,找出该地区该职位的职业发展前景规律。本文基于拉勾上2016年12月到2017年1月深圳地区数据分析师招聘数据,为这一行业的朋友作为参考;虽然数据略为过时,但变化也不大,规律依然适用。 在深圳 1、数据分析师主要还是开发类职业。开发类的职位,无论是市场需求还是薪资都是无可撼动的最高。 2、地区方面:如果你要在深圳找数据分析师的岗位,请去南山区,优先去科技园附近。 3、薪资方面,20K是业内中等水平; 4、学历方面,除非你直接攻读相关专业的博士,否则本科足矣; 5、技能方面:
灯塔大数据
2018/04/04
8280
洞察 | 深圳数据分析师的职业前景如何?爬完拉勾数据给你分析 (附代码和过程)
【大数据实战】招聘网站职位分析
1.网络爬虫是捜索引擎抓取系统的重要组成部分。爬虫的主要目的是将互联网上的网页下载到本地形成一个互联网内容的镜像备份。
荣仔_最靓的仔
2022/01/05
2.7K0
【大数据实战】招聘网站职位分析
Python —— 一个『拉勾网』的小爬虫
本文将展示一个 Python 爬虫,其目标网站是『拉勾网』;题图是其运行的结果,这个爬虫通过指定『关键字』抓取所有相关职位的『任职要求』,过滤条件有『城市』、『月薪范围』。并通过百度的分词和词性标注服务(免费的),提取其中的关键字,这个爬虫有什么用? 有那么一个问题模板,xx 语言 / 方向 xx 月薪需要掌握什么技能 对于这种问题,招聘网站上的信息大概是最为『公正客观』,所以这个爬虫的输出可以『公正客观』的作为求职者的技能树发展指南......个屁;如果全盘相信招聘网上写的,估计离凉凉就不远了。其上面
小小科
2018/05/04
1.3K0
Python —— 一个『拉勾网』的小爬虫
Python 爬取前程无忧最新招聘数据 matplotlib数据分析与可视化
利用python爬取在前程无忧网搜索python关键字出现的最新的招聘数据,保存到本地Excel,进行数据查看和预处理,然后利用matplotlib进行数据分析和可视化。
叶庭云
2020/09/17
5K1
Python   爬取前程无忧最新招聘数据    matplotlib数据分析与可视化
python3 对拉勾数据进行可视化分析
  上回说到我们如何如何把拉勾的数据抓取下来的,既然获取了数据,就别放着不动,把它拿出来分析一下,看看这些数据里面都包含了什么信息。(本次博客源码地址:https://github.com/MaxLyu/Lagou_Analyze)
py3study
2020/01/16
5830
python3 对拉勾数据进行可视化分析
基于pandas、matplotlib、pyecharts的人工智能相关职位招聘市场数据分析
容大教育人工智能班数据分析阶段实战项目:人工智能相关职位数据分析 小组成员:雷坤、韦民童、李波、陶宇 项目周期5天,数据分析为第2天的需求。
潇洒坤
2018/09/10
1.2K0
基于pandas、matplotlib、pyecharts的人工智能相关职位招聘市场数据分析
我用Python又爬虫了拉钩招聘,给你们看看2019市场行情
事情的起源是这样的,某个风和日丽的下午… 习惯性的打开知乎准备划下水,看到一个问题刚好邀请回答
马哥linux运维
2019/05/08
8010
我用Python又爬虫了拉钩招聘,给你们看看2019市场行情
推荐阅读
相关推荐
[爬虫+数据分析] 分析北京Python开发的现状|文末送书5本
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验