使用Python爬虫获取拉钩职位信息的作死过程

使

Today i…..

最近本宝宝在做大数据的有关作业,需要获取一下拉勾的职位信息,于是,我就开始了我的爬虫之路

所谓爬虫就是

大概就是这样,接下来大概就是分享一下我做这个爬虫的是时候的一些整体思路

首先,我洗了个澡,吃了点水果,咳咳。说正经的了。

首先你需要有一台电脑,一台运行Linux的或者带有Linux虚拟机的电脑,众所周知Windows的GBK编码一直让很多文本在其中显示乱码,因此为了避免不必要的折腾,这里我就直接推荐用Linux平台。然后你还要有Python的运行环境,这里我推荐Python3,因为Python3的文件编码格式默认是UTF-8,而很多网页也使用这一编码格式,所以对于文本的处理就比较得心应手了。最后你还需要几个比较好用的web库和一个顺手的编辑器

顺带一提,比较好用的web库就是requests库

准备好这些材料后,我们打开天然气,你以为我们首先就要打开编辑器,错!我们既然要选择爬取这个网站,自然要提前为我们的爬虫大军踩好点,所以我们先打开浏览器访问一下拉勾的网站页面

一个网站获取数据的类型有很多种,有的使用JSON来实现无刷新访问,有的则是直接使用脚本语言刷新指定的模板,对于这两种交互方式的爬取思路截然不同,相对于后者来说,前者还是简单许多,当我们访问下一页时能明显发现拉钩使用的是无刷新访问方式,那这个事情就变得比较easy

打开浏览器的F12,选中network选项卡,然后在捕获类型中选择XHR,随便点击一页

我们这个时候会发现chrome捕获到了两个JSON请求,哇,看起来就成功了一大半了啊,接下来我们看一下JSON返回的数据

看样子似乎很符合我们的胃口,遂开搞。

从这里我们可以看到是一个positionAjax.json的文件来负责给我们返回职位信息,思路大概就有了,我们需要伪造这个JSON请求来获取到我们的数据

这个时候我们就需要另一个软件:brupsuit。一款很万能的中间人软件,我们需要将他配置到浏览器上,配置brupsuit的过程不在本文的讨论范围内,所以不写。不过需要注意的是,因为拉勾是HTTPS,所以我们需要配置brupsuit让他来可以在HTTPS环境下工作

从抓取结果来看,我们似乎只要把first,pn,kd三个变量以post方式传给这个文件就可以获取到数据

于是开搞,发现这样做并不行,直接获取不到数据。这里就需要了解网站使用的一些反爬虫的技巧。首先是大家都知道的识别浏览器UA,所以我们要自造一个header带上我们选好的浏览器UA。还有一些网站会通过referer来判断请求是否是本站发出,因此做戏做全套,referer也要按照数据包里的写对,OK,再次开搞

(因为这一篇总结文,并没有当时碰壁的截图,大家可以自行实验一下)

这次可以获取数据了,真的是皆大欢喜,但是每次最多只能获取5页,妈耶,这个网站还很刁钻啊,一般这种情况下就是会有cookies专门负责检验是否是爬虫,然后开始找检测爬虫的Cookies,值得一提的是,这里的所有工作基本都是brupsuit完成的,因此个人真的很推荐用brupsuit研究网站来写爬虫(虽然过程说起来很简单,实际操作起来就是:卧槽,怎么又给我ban了,乖乖,这到底是怎么回事)

经过一番艰苦测试,终于找到了检测爬虫的三个Cookie,这里就不得不佩服拉勾开发者了,这三个cookie是分别从三个子网站获取,设置在主站下的,三个cookie缺一不可,乖乖,感觉自己在探险,爬虫有趣的地方就在和对方开发者的博弈,个人认为拿下难题的那一刻真的特别激动

诺,就是这三个可恨的cookies,打死他们

只要你在网页打开的时候收集到这三个cookie放在cookieJar里,封装好,在请求的时候放入cookies参数发出去,就可以获得货真价实的回传数据

对于获取JSON接口的速度,这个我测试过,只要不是疯牛速度基本都不会ban

其实说起来整个爬虫的核心部分就在于UA,referer,cookies这三个部分,其实这三个部分统称就是header部分,只要解决好了header部分,剩下的问题基本就迎刃而解

具体的爬虫代码已经张贴在Github上啦,写的渣还望轻喷

至于代码里写道的获取全部城市这个思想,其实就是使用的xpath来解析了一个拉勾有拉勾全部地名的网页,保存在变量中,具体的xpath用法也是很简单的,能让程序干的事情尽量不要手工完成,毕竟我懒

以上就是作死的全过程,因为主要是分享思路,所以我都没怎么讲到代码的实现细节,大家可以去Github上找到我写的代码,然后如果你觉得我写的代码有哪里可以改进的,或者你有更流弊的方法,欢迎评论或者留言

About the author

NOBUG.IN

2 comments

By NOBUG.IN

Your sidebar area is currently empty. Hurry up and add some widgets.