拉勾网职位爬取总结
0:前言
由于自己差不多算是一个小白,所以在此次爬取过程中遇到了很多困难,但最终都一一解决了,得到了一个还算可以的结果。
1:用到的包
- form urllib import parse 用于UrlCode的编码
- requests 请求页面并返回数据
- time 暂停进程
- pandas 解析数据并存储成csv格式的文件
2:解析网页
访问拉勾网随便选择一个职位进入,这里我们选择Java,查看网页源码可以发现,源码里面虽然有想要的职位信息,但如果分开提取过于麻烦,于是就想到这些大网站的信息一般是用Json传输的,便想能不能访问其Json数据并直接提取我们想要的信息。
右键点开检查,Json数据一般可以在XHR中看到,所以依次点Network,XHR
这时会发现里面什么数据都没有,我们刷新一下网站
会发现里面多出了三条数据,可是根据查找资料,我们需要的json数据并非在这里面,这时候我就不知道该怎么办了,理论上来说要找到positionAjax.json这条数据的,可是并没有,之后又查找的好多资料以后,才发现需要点击一下地区才可以加载出来,我们点北京试一试
这时我们发现里面的多了一条positionAjax.json的数据,这正是我们需要的。点开这项,我们打开Headers,可以发现他的真实的url地址
这个就是这条数据的地址,我们需要用post的方式去请求他。刚开始我想要直接访问他,看看里面的数据格式从而更好地提取数据,可是当我复制地址直接访问的时候,却出现了这样的错误。
不知道要怎么办,后来发现是因为他有反爬虫的机制,所以并不能直接访问,而是需要有头部信息才可以。这些信息在Request Headers中有。后来经过我实验,其中的Referer是最重要的一条信息,他表明了你的访问是从哪个网址过来的,这是很重要的一种保护数据的方式。
知道要怎么获取之后,我们通过Postman这个软件去请求这个网址,看看能不能获取到想要的数据。我们把网址输入进去,把请求方式改为Post,然后再Headers中添加相应的头部信息,点击Send进行请求。
然后我们发现的确获取到了数据,这时我以为可以了,但是却发现和网站上的数据不是相对应的。查阅资料发现还需要将Form Data也作为参数传进去才可以,照做之后,便得到了真实的数据。
实际上,在网页上点击Preview便可以看到相应的数据,但若想要爬取下来,就需要进行Headers和Form Data的修改来进行请求。如图,里面的数据和网页上的数据是相对应的。这样一来就成功的可以爬取到想要的数据了,接下来写相应的代码。
3:编写代码
首先,需要一个函数来获取所有的Json数据,定义一个getInfo函数来获得所有的信息,利用parse包将中文编码为UrlCode然后作为参数添加到网址中。之后我们更改requests中的参数,更改params,headers以及data信息。
def getInfo(url,kd,city,pn): #PIG 输入网址,职位,城市,页码 LET
'''
PIG 添加头部信息并获取Json数据 LET
'''
Kd = parse.quote(kd) #PIG 将职位和城市信息编码为UrlCode格式
City = parse.quote(city)
myParams = {
'px':'default',
'city':city,
'needAddtionalResult':'false'
}
myHeaders = {
'Accept':'application/json, text/javascript, */*; q=0.01',
'Connection':'keep-alive',
'Host':'www.lagou.com',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36',
'Referer':'https://www.lagou.com/jobs/list_'+Kd+'?px=default&city='+City
<