那些年咱们写过的爬虫

从写nodejs的第一个爬虫开始陆陆续续写了好几个爬虫,从爬拉勾网上的职位信息到爬豆瓣上的租房帖子,再到去爬知乎上的妹子照片什么的,爬虫为我打开了一扇又一扇新世界的大门。除了涨了不少姿式以外,与网管斗智斗勇也是一个比较有意思的事情。虽然不少东西都是浅尝辄止,但万事都有个由浅入深的过程嘛(天真脸~~)css

一只爬虫的模样

爬虫?应该是长这样的吧:html

其实,没有那么萌啦。前端

所谓爬虫,就是把目标网站的信息收集起来的一种工具。基本流程跟人访问网站是同样的,打开连接>>获取信息>>打开连接……这个循环用编程实现,就是爬虫了。专业一点的说法就是,发起请求>>解析响应数据。普通网站访问的时候,返回值是一个html文本,这时候须要解析html文本获取所需信息,好比能够用cheerio这种类jQuery的操做dom的方式去解析html文本;而使用ajax动态生成内容的网站,能够直接去请求相应的接口,从而直接得到数据。爬虫爬的,就是这些url或者接口,慢慢地爬呀爬,直到世界尽头~~~node

爬虫与网管

获取信息是爬虫的核心,可是最有技术含量的却不在于此。爬虫路上的第一个大敌,就是网管了。因为太多人利用爬虫去剽窃别人的成果,因此爬虫在生产内容的网站都不受待见。就想农民伯伯辛辛苦苦种大的大白菜,天然是不但愿被猪拱了。网管叔叔们一般会根据爬虫的特征来辨别爬虫,大致上有这么几个方面:git

1) 检查请求头。一些很初级的爬虫只是单纯得发请求,连最基本的user agent之类的请求头都没有,看见这种请求,不用说也知道是爬虫了。除了user agent,Referer也是一个一般被用来检查爬虫的字段。github

2) 判断用户行为。不少网站在未登陆状态的时候会常常返回登陆页面让用户登陆,用户登陆以后经过统计用户访问行为就能够判断出用户是否是人,好比在短期内进行了大量的访问,这显然不是人力所能作到的了。ajax

3) 判断IP的访问量。若是一个ip在短期内进行了大量的访问,显然,这也不是人干的事。尤为是同一IP出现高并发的状况,这种会加剧服务器负荷甚至搞垮服务器的爬虫,绝对是网管的眼中钉肉中刺。算法

4) 根据浏览器行为判断。浏览器在打开网页的时候会自动将网页中的图片、css、js等资源加载下来,可是爬虫却只是获取了网页的文本,并不会自动加载相关的资源,经过这一特征也能很好区分爬虫。好比说在网页中加入一个会自动发请求的js文件,服务器端若是接收不到这个请求就能够认为是爬虫在访问了。可是这招对利用浏览器内核写成的爬虫或者是高级爬虫来讲就无论用了。数据库

一般网管们比较经常使用的是就是前3种方式的组合,第4点须要开发改动先后端代码,这对身为运维的网管叔叔们来讲,给开发提需求可不容易啊。但若是在开发阶段就已经考虑到防火防盗防爬虫的话,那就会对接口进行加密或是校验了。虽说前端代码都是裸奔的,可是假若有意去混淆js的话,想要破解出加密算法也不是那么简单的。校验就跟普通的应付csrf攻击的作法也相差无几,在页面中嵌入服务器端返回的随机数,接口调用时校验这个随机数便可。编程

智斗网管

可是俗话说,你有张良计,我有过墙梯。即便网管叔叔好像作了不少反爬虫的工做,可是人民群众的智商是无限的。

什么,你要检查请求头?你要什么样的header,我这里都有!根据IP判断?花几十块买了一堆高匿代理服务器呢。判断用户行为?呵呵,我有一堆小号呀~

具体来讲:

1)伪造header。这实在太简单了,随便打开一个浏览器F12,把请求的header都复制一遍,不要太完整哦。

2)多用户爬虫。提早注册好一堆小号,登陆以后F12分析cookie,找出帐号相关的cookie,将cookie按帐号存到数组中不断轮换便可。在有csrf防护策略的网站上,还须要分析token的来源,在请求的时候带上预埋的token便可。例如知乎就在网页中预埋了一个_xsrf,在请求的时候要带上这个自定义头才能够得到请求的权限。

3)多IP爬虫。这个就稍微复杂一些,主要是高匿代理IP比较难搞到手。网上的免费代理很多,能用的很少。要么掏钱,要么就作一个爬虫来爬取可用的代理服务器吧。

4)接口参数解密。这种状况下,参数被加密成一个密码字符串,服务器端经过解密算法来还原参数,也就是说每次请求的参数都是不一样的。这里的关键在于找到加密算法和钥匙,而前端的js一般也会被混淆加密,因此这种状况是最复杂的。目前我还没遇到这种状况,因此就很少说了。

一只爬虫的修养

若是一只爬虫动不动就几百个并发,这吃相就难看了。因此咱们一般会控制一下并发和爬取间隔,尽可能不干扰服务器的正常运转。这就是一只爬虫的修养了。

流程控制方面你可使用集成的async库,也能够手动管理流程,时刻考虑异常状况就能够写出最贴合你要求的控制流程了。如今es7从语言上加入了async、await语法糖,手动编码的代码也很是优雅了。

附录

1)知乎图片爬虫:这个是受不了一个曾经很火的帖子诱惑而写的(长得好看,但没有男友是怎样的体验? ),这个爬虫能够爬取任一话题下全部回答中的图片并下载到本地目录下,大家感觉下:

知乎爬虫效果

如你所见,大部分妹子长得并无很好看。。。。(咦,我好像发现了些什么(*/ω╲*))

可是!质量不行,我还有数量呀:  

其实并非颇有动力写这种爬虫,不过看到答案中一个家伙写了一个爬虫,可是却只能爬第一页。。。这是什么感受?就好像是拉链还没拉下来,片子却播完了!忍不住,就写了一个能够下载全部答案的爬虫,而后还用数据库和json两种方式储存了一下数据。刚看的数据库,学以至用!源码和相应说明均在文后有给出。

 

2)豆瓣小组爬虫:这个是我在豆瓣上找房子的时候写的简单爬虫,这个爬虫的吃相比较难看!。!由于没有控制并发。。。由于租房帖子的更新很是快,因此就爬取了最新的10页(250条)帖子,主要逻辑就是对标题进行关键词的筛选,将符合条件的帖子输出到网页中(这里用json文件来示范了)。结果大概长这个样子:

 

3)拉勾网爬虫:这个是在换工做的时候写的一个很简单的爬虫,主要是想统计一下不一样岗位的需求状况、公司分布,原本还想要结合地图作分布图、热力图什么的,最后也是不了了之。只是简单地用echart作了一个图表就完事了,太简陋!拉钩是ajax接口返回数据的,并且没有加密,实在是太好爬了!反爬虫的策略是基于IP的,单个ip访问频繁就会被封哦,要注意!

 

PS:上面提到的爬虫都在个人 github 上了,求star!(喂,只fork不star是什么意思呀?)

 

很久没写文字了,最近一直在看后端相关的东西、还看了下比较火的Vue,感受收获仍是蛮大的,后续会分享相关的学习感悟,敬请期待!

最后,仍是惯例放图吧。(幸亏假期出去了一趟,否则都没图可放了,囧囧囧)

 原创文章,转载请注明出处!本文连接:http://www.cnblogs.com/qieguo/p/5859927.html  

相关文章
相关标签/搜索