这个项目是很早之前做的,当初是为了了解跟python数据分析有关行业的信息,大概地了解一下对这个行业的要求以及薪资状况,我决定从网上获取信息并进行分析。既然想要分析就必须要有数据,于是我选择了拉勾,从他们那里得到了信息。不得不说,拉勾的反爬技术还挺厉害的,稍后再说明。话不多说,直接开始。
明确目的
每次爬虫都要有明确的目的,刚接触随便找东西试水的除外。我想要知道的是python数据分析的要求以及薪资状况,因此,薪资、学历、工作经验以及一些任职要求就是我的目的。
既然明确了目的,看一下它们在什么位置,打开浏览器,寻找目标。像拉勾这种网站信息一般都是通过ajax加载的,而且在输入“python数据分析”敲击回车之后跳转的页面,招聘信息不是一开始就显示出来的,通过点击页码也只是招聘信息在变化甚至连network都没多大变化,可以大胆猜测是通过post请求的,所以关注post请求以及XHR文件,很快就发现了我们要的东西。
点击preview可见详细信息以json形式保存着,其中'salary'、 'workYear'、 'education'、 'positionID'(招聘信息详情页有关的id)是我们要的。再观察一下它的form data,其中kd=关键字,pn=pageNum(页码)这是我们请求的时候要带上的参数。另外我们要注意请求头的referer参数,待会儿要用。知道了目标之后,爬起来!
开始爬虫
先设置请求头headers,把平时用的user-agent带上,再把formdata也带上,用requests库直接requests.post(url, headers=headers, data=formdata),然后就开始报错了:{"status":false,"msg":"您操作太频繁,请稍后再访问", "clientIp" : "......", "state":2402}。
解决这个问题的关键在于,了解拉勾的反爬机制:在进入python数据分析招聘页之前,我们要在主页输入关键字跳转。在这个过程中,服务器会传回来一个cookies,带着这个cookies请求目标 url 就可以得到要的东西,而且在请求目标地址的话还要带上referer这个请求头参数,referer的含义大概是这样:告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。另外,睡眠时间也要设置的长一点,不然很容易被封。知道了反爬机制之后,话不多说,直接上代码。
'''
@author: Max_Lyu
Create time: 2019/4/1
url: https://github.com/MaxLyu/Lagou_Analyze
'''
# 请求起始 url 返回 cookies
def get_start_url(self):
session = requests.session()
session.get(self.start_url, headers=self.headers, timeout=3)
cookies = session.cookies
return cookies
# 将返回的 cookies 一起 post 给 target_url 并获取数据
def post_target_url(self):
cookies = self.get_start_url()
pn = 1
for pg in range(30):
formdata = {
'first': 'false',
'pn': pn,
'kd': 'python数据分析'
}
pn += 1
response = requests.post(self.target_url, data=formdata, cookies=cookies, headers=self.headers, timeout=3)
self.parse(response)
time.sleep(60) # 拉勾的反扒技术比较强,短睡眠时间会被封
# 解析 response,获取 items
def parse(self, response):
print(response)
items = []
print(response.text)
data = json.loads(response.text)['content']['positionResult']['result']
if len(data):
for i in range(len(data)):
positionId = data[i]['positionId']
education = data[i]['education']
workYear = data[i]['workYear']
salary = data[i]['salary']
list = [positionId, education, workYear, salary]
items.append(list)
self.save_data(items)
time.sleep(1.3)
复制
其中save_data(items)是保存文件,我是保存在csv文件。篇幅有限,这里不做展示。另外,通过positionID获取详情页的任职要求文本数据。
数据展示
到这里,爬取的任务就结束了。获得数据之后将其做一个可视化。
先大概看一下这些数据:
由于获取的数据中薪资分布有点乱,我们需要对其做一个预处理,这里不做展示;另外,任职要求也有很多频繁出现的无关的“停用词”,也要做一下处理。
处理完成后,用 Python 的 matplotlib 模块根据“薪资、学历、工作经验”绘制图形,用 wordcloud 绘制“任职要求”词云图。
从饼状图可以看出,python数据分析师的学历大部分要求是本科,占了86%,当然硕士的要求其实也挺高的了。
从柱状图可以看出,python数据分析师的工作经验绝大部分要求1-5年。
而从薪资环形图可以得出python数据分析的工资为10k-30k的比较多,工资高的估计要求会比较高,所以我们看一下职位要求。
从词云图可看出,数据分析肯定要对数据比较敏感,并且对统计学、excel、python、数据挖掘、hadoop等也有一定的要求。不仅如此,还要求具有一定的抗压能力、解决问题的能力、良好的表达能力、思维能力等。
想要获取源码的盆友,可在本公众号后台回复【拉勾】,如果觉得写得还行,欢迎关注本公众号,虽然不定期更新