老李谈爬虫
老李谈爬虫
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200。
爬虫又可以称之为蜘蛛或者说是机器人,很多人肯定都听说过网络爬虫的概念,大意就是他的目标就是不断的发送http请求去爬去网页上的数据,爬虫在搜索引擎中运用的非常的广泛,但是爬虫其实并不简单,下面我给大家详细的讲述关于爬虫的一些细节,或许就有你不知道的细节哦。
爬虫算法
先来说说一个简单的爬虫算法,爬虫算法的核心就是获取网页内如,解析出其中的网页链接,再次发送请求取得里面的内容,然后循环。因此这里会需要一个种子链接地址,我们称之为种子网页。你可以把爬虫算法看成一个图算法,各个网页通过入链和出链的形式互相连接着,构成了类似于无向图的结构。在爬虫算法的中间过程中会维护一个未访问URL列表,一般放在主内存中,可以提高访问效率,访问完毕之后再移除,获取到新的链接之后再次放入。
爬虫队列
爬虫队列指的是爬虫访问到新的链接时,所存入队列的方式,因为这关系到之后将会优化访问哪些未访问的url,如果采用FIFO的方式的话,对应的爬虫就是宽度优先爬虫,就是广度优先算法类似,这个很好理解,还有另外一种就是按照优先队列的方式,这个称之为带偏好的爬虫,这类爬虫他会做的一个操作是会给即将访问的URL一个优先级值,该优先级值会根据页面价值估计计算而得。
网页链接获取
了解了爬虫的核心原理之后,就可以往细节里面再去研究,比如获取到了网页内容之后,我们如何去解析或者说是去识别出里面的链接呢,也许你会马上联系到正则表达式去匹配嘛,方便又快捷,但是你忘了一个前提,你所面对的是海量的数据,什么叫做海量,千万级,亿级别的数据。所以我们得重新选择一个好的方式,大体上来说,网页的解析过程可以简单的从超链接中获取url也可以复杂到分析HTML代码,以后者为例,你可以用获取到的HTML源代码构建一个dom树,然后一个深度优先或广度优先的方式去遍历每个标签节点,当然在这部分还可以有很多的算法优化。
链接提取和规范化
一般链接不是拿来就可以直接使用的,有些链接会有很多的无效词组成,你需要进行无效词的删除,然后从中提取出有用的url,这有点类似于搜索引擎中构建到排索引时用到的预处理方法类似。
爬虫陷阱攻击
爬虫不就是发个http请求嘛,也会对目的主机造成攻击?举个场景就能让大家马上明白,有2个网页,都是某爬虫即将要访问的url,A网页的连接为http://xxxx/a/b,也就是说是指向B网页的,然后B网页的链接为http://xxxx/b/a,也就是指向A网页的,这样就会发生一个很有意思的现象就是,A,B网页不断的爬虫访问,如此循环,最后不仅带宽被爬虫所霸占,还会导致其他正常的服务请求不能被处理,也就是造成了Dos拒绝服务攻击。解决的办法很简单,限制一下对同一个网页的访问次数。
爬虫道德
尽管爬虫的功能很单一,就是偶然想某个地址请求请求内容而已,但是如果使用不当,也会造成恶意的影响,尤其是性能很棒的爬虫,会占领一定的Web服务器资源的带宽,极端情况下就是dos攻击嘛。
礼貌的爬虫
如何做一个礼貌的爬虫:一个礼貌的爬虫应该在向某台服务器发送请求前,先去解析该服务器上的robots.txt文件,这个文件规定了任何爬虫不能爬取的内容,不仅如此,爬虫还需遵守爬虫阻止协议(虽然说并没有什么明文的规定)。当然如果某些爬虫不遵守上面说的规则,一旦被发现,可以马上封杀此ip,比如说短时间内高频率的访问某站点,就很容易被发现。
爬虫小应用
这里举一个应用到爬虫的小的场景,当然不是搜索引擎的应用场景,某些用户想要在浏览网页的时候屏蔽掉烦人的广告,想要过滤掉此类链接,这时候就可以使用带有部分爬虫功能的去广告插件,爬虫在此的作用就是爬去链接数据,识别是否是广告数据,因为广告一般都是一个大的图片上跟一个链接,识别出之后就能想干嘛干嘛了。