前言
利用requests爬取拉勾网求职信息数据分析与可视化,废话不多说。
让我们愉快地开始吧~
开发工具
**Python版本:**3.6.4
相关模块:
requests模块;
re模块;
os模块
jieba模块;
pandas模块
numpy模块
pyecharts模块;
以及一些Python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
数据爬取
爬取拉勾网求职信息
1.requests 请求,获取单页面
req_url = 'https://www.lagou.com/jobs/list_python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput='
req_result = requests.get(req_url)
print(req_result.text)
输出结果如下
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="renderer" content="webkit">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head>
<script type="text/javascript" src="https://www.lagou.com/utrack/trackMid.js?version=1.0.0.3&t=1529144464"></script>
<body>
<input type="hidden" id="KEY" value="VAfyhYrvroX6vLr5S9WNrP16ruYI6aYOZIwLSgdqTWc"/>
<script type="text/javascript">HZRxWevI();</script>é?μé?¢?? è????-... <script type="text/javascript" src="https://www.lagou.com/upload/oss.js"></script>
</body></html>
上述结果我们可以看出与我们想象的还是差别很大。 为什么会出现以上这种情况呢,其实很简单,因为它并不是简单的静态页面,我们知道请求方式有get和post请求两种基本区别如下
(1)Get是向服务器发索取数据的一种请求;而Post是向服务器提交数据的一种请求,要提交的数据位 于信息头后面的实体中。GET和POST只是发送机制不同,并不是一个取一个发. (2)GET请求时其发送的信息是以url明文发送的,其参数会被保存在浏览器历史或web服务器中, 而post则不会某(这也是后面我们翻页的时候发现拉勾网翻页时 浏览器 url栏地址没有变化的原因。)
2.分析页面加载,找到数据
1.请求分析
在拉钩网首页,按F12进入开发者模式,然后在查询框中输入python ,点击搜索,经过我的查找,终于找到了页面上职位信息所在的页面,的确是一个post 请求,而且页面返回内容为一个json 格式的字典。
2.返回数据内容分析 ? 页面上:我们主要获取7个数据(公司|城市|职位|薪资|学历要求|工作经验|职位优点)
json 数据中:我把爬下来的json 数据整理了一下,如下图
我们会发现,我们需要的数据全在req_info['content']['positionResult']['result'] 里面,为一个列表,而且还包含许多其他的信息,本次我们不关心其他数据。我们所需要数据如下图框
3.添加headers 信息,模仿浏览器请求
通过上面的请求分析我们可以找到post 请求的网址为:https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false,如果此时我们直接发送post 请求,会提示如下代码:
{'success': False, 'msg': '您操作太频繁,请稍后再访问', 'clientIp': '122.xxx.xxx.xxx'}
出现这种提示的原因是,我们直接post 访问url,服务器会把我们误认为‘机器人’,这也是一种反爬,解决方法很简单,加一个请求头即可完全模拟浏览器请求,请求头获取见下图
4.解析页面,实现翻页爬取
分析发现下面规律: 在post 请求中,有个请求参数->表单数据,包含三个参数first、kd、pn ,通过动图演示,我们不难猜出其含义
data = {
'first':'true',
'pn':1
}
代码
import requests\
req_url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'\
headers = {'你的请求头'}\
for i in range(1,31):\
data = { 'first':'false','kd':'Python','pn':i} \
req_result = requests.post(req_url,headers = headers,data = data) req_result.encoding = 'utf-8'\
req_info = req_result.json() \
print(req_info)
5.爬取数据存入csv文件
def file_do(list_info):
if file_size == 0: \
else: \
with open(r'G:\lagou_test.csv','a+',newline='') as file_test :
展示爬取的数据
数据可视化
数据分析+pyechart数据可视化
薪资分布分析
salary_lists = {}for x in city:
salary_lists[x] = salary.count(x)
key = []
values = []for k,v in salary_lists.items():
key.append(k)
values.append(v)
bar2 = Bar('求职信息数据化','需求量',page_title='薪资分布')
bar2.use_theme('vintage')
bar2.add('薪资',key,values,is_more_utils = True,is_datazoom_show = True,xaxis_interval=0, xaxis_rotate=30, yaxis_rotate=30)
bar2.render()
我们可以看到,python 的薪资基本都是10k起步,大部分公司给出薪资在10k-40k之间,所以,不要怕学python 吃不到饭。
2.工作地点分析
通过图表,我们很容易看出,需要python 程序员的公司大多分布在北京、上海、深圳,再后面就是广州了,所以,学python 的同学千万不要去错城市哦。
3.职位学历要求
根据图表显示,python 程序员的学历要求并不高,主要是本科,虽然学历要求不高,但一定要有思辨能力哦。
4.工作经验要求
主要是需要3-5年工作经验的同学,不老也不年轻,成熟稳重,又能学新东西的年龄,招聘公司真聪明。
5.工作职位研究方向分析
6.工作福利优点分析
content = ''
for x in positionAdvantage:
content = content + x
content = re.sub('[,、(),1234567890;;&%$#@!~_=+]', '', content)
segment = jieba.lcut(content)
words_df = pd.DataFrame({'segment': segment})
words_stat = words_df.groupby(by=['segment'])['segment'].agg({"计数": numpy.size})
words_stat = words_stat.reset_index().sort_values(by=["计数"], ascending=False) test = words_stat.head(1000).values
codes = [test[i][0] for i in range(0,len(test))]
counts = [test[i][1] for i in range(0,len(test))]
wordcloud = WordCloud(width=1300, height=620,page_title='福利关键词') wordcloud.add("福利关键词", codes, counts, word_size_range=[20, 100]) wordcloud.render()
|