您的位置:首页 > 其它

爬虫技术分享

2016-01-08 16:22 162 查看
(一)网络爬虫

网络爬虫是一个自动提取网页的程序或者脚本,其原理就是用程序模拟浏览器的访问行为,进行网页的下载。

(二)网络爬虫的基本结构及工作流程

一个通用的网络爬虫的框架如图所示:




网络爬虫的基本工作流程如下:

1.首先选取一部分精心挑选的种子URL;

2.将这些URL放入待抓取URL队列;

3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。


4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。

三、抓取策略

1.深度优先遍历策略

深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接。我们以下面的图为例:



遍历的路径:A-F-G E-H-I B C D

2.宽度优先遍历策略

宽度优先遍历策略的基本思路是,将新下载网页中发现的链接直接插入待抓取URL队列的末尾。也就是指网络爬虫会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。还是以上面的图为例:

遍历路径:A-B-C-D-E-F G H I


3.OPIC策略策略

该算法实际上也是对页面进行一个重要性打分。在算法开始前,给所有页面一个相同的初始现金(cash)。当下载了某个页面P之后,将P的现金分摊给所有从P中分析出的链接,并且将P的现金清空。对于待抓取URL队列中的所有页面按照现金数进行排序。




4.Partial PageRank策略

Partial PageRank算法借鉴了PageRank算法的思想:对于已经下载的网页,连同待抓取URL队列中的URL,形成网页集合,计算每个页面的PageRank值,计算完之后,将待抓取URL队列中的URL按照PageRank值的大小排列,并按照该顺序抓取页面。

如果每次抓取一个页面,就重新计算PageRank值,一种折中方案是:每抓取K个页面后,重新计算一次PageRank值。但是这种情况还会有一个问题:对于已经下载下来的页面中分析出的链接,也就是我们之前提到的未知网页那一部分,暂时是没有PageRank值的。为了解决这个问题,会给这些页面一个临时的PageRank值:将这个网页所有入链传递进来的PageRank值进行汇总,这样就形成了该未知页面的PageRank值。


PageRank算法简介及Map-Reduce实现

并且 pagerank模型演示了爬虫遇到的问题。

(三)逃避被反爬策略

如何使程序不被反爬,是爬虫特别重要的一个点。爬虫程序写好之后,后期的维护工作也特别重要。因为对方的反爬策略一旦改变,那么你之前的逃避反爬的策略就会失效了,你不得不重新调整爬取策略来规避反爬。

目前常见的规避反爬的策略有如下几个点:

1. 伪装user agent

User agent 是HTTP协议的中的一个字段, 其作用是描述发出HTTP请求的终端的一些信息。 服务器通过这个字段就可以知道要访问网站的是什么人了。每个浏览器,每个正规的爬虫都有其固定的user agent,因此只要将这个字段改为这些知名的user agent,就可以成功伪装了。不过,不推荐伪装知名爬虫,因为这些爬虫很可能有固定的IP,如百度爬虫。与此相对的,伪装浏览器的user agent是一个不错的主意,因为浏览器是任何人都可以用的,换名话说,就是没有固定IP。推荐准备若干个浏览器的user agent,然后每次发送请求的时候就从这几个user agents中随机选一个填上去。I

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

2 模拟登陆

**当需要输入验证码**
解决办法 1:手工打码
2:写程序自动识别验证码
3:手动登陆,拿登陆好之后的cookie。(cookie有效期很长的情况可以用改做法)。

之后用抓包工具分析整个登陆过程,得到相关的请求参数,模拟登陆。其中典型的微博的模拟登陆,就是很复杂的。新浪微博的用户名加密目前采用Base64加密算法,而新浪微博登录密码的加密算法使用RSA2。


3. 使用代理

如果对方用某段时间内某IP的访问次数来判定爬虫,然后将这些爬虫的IP都封掉的话,以上伪装就失效了。对方的这个思路隐含着一个假设:爬虫的访问量必然比正常用户的大很多,因而只要使这个假设不成立就可以了。这时就该代理上场了。所谓代理就是介于用户与网站之间的第三者:用户先将请求发到代理,然后代理再发到服务器,这样看起来就像是代理在访问那个网站了。这时,服务器会将这次访问算到代理头上。同时用多个代理的话,单个IP的访问量就降下去了,于是就有可能逃过一劫。不过,这个方法最大的问题就是找到稳定的代理。




4. 降低访问频率

ip代理资源是有限的,而有的网站反爬力度确实很大,所以常用的做法是 代理ip+睡眠一段时间 来使程序降低访问频率来 最大量的爬取资源而又不被反爬。

(四)知己知彼-互联网网站的反爬虫策略

以内容为主导的网站和有核心数据的网站通常都有反爬策略,而我们遇到的反爬方式又只是冰山一角,所以没有通用的防反爬的防爬方式,唯有不断的去试探,发现对方的反爬的突破点来规避反爬。

robbin介绍了几种常见的防爬方式,有:

1:手工识别和拒绝爬虫的访问

相当多的爬虫对网站会造成非常高的负载,因此识别爬虫的来源IP是很容易的事情。最简单的办法就是用netstat检查80端口的连接:

netstat -nt | grep youhostip:80 | awk '{print $5}' | awk -F":" '{print $1}'| sort | uniq -c | sort -r -n


按照80端口连接数量对来源IP进行排序,这样可以直观的判断出来网页爬虫。

绝爬虫请求既可以通过内核防火墙来拒绝,也可以在web server拒绝,比方说用iptables拒绝:

iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s 84.80.46.0/24


直接封锁爬虫所在的C网段地址。这是因为一般爬虫都是运行在托管机房里面,可能在一个C段里面的多台服务器上面都有爬虫,而这个C段不可能是用户宽带上网,封锁C段可以很大程度上解决问题

2 .通过识别爬虫的User-Agent信息来拒绝爬虫

来源IP分布很广,很难简单的通过封锁IP段地址来解决问题.

此时我们可以通过爬虫的User-Agent信息来识别,因此我们就可以通过记录和分析User-Agent信息来挖掘和封锁爬虫。

3.延迟相应速度

爬虫对网站爬取频率过高,但是搜索引擎给网站带来了很多流量,并不希望简单的封锁爬虫,仅仅是希望降低爬虫的请求频率。

做法:对爬虫请求延迟响应,这样就可以有效降低爬虫对网站的负载了

4.通过网站流量统计系统和日志分析来识别爬虫

1:直接分析服务器日志,来统计网站访问量。

2:拿流量统计系统记录的IP和服务器程序日志记录的IP地址进行比较,如果服务器日志里面某个IP发起了大量的请求,在流量统计系统里面却根本找不到,或者即使找得到,可访问量却只有寥寥几个,那么无疑就是一个网络爬虫。

5.网站的实时反爬虫防火墙实现策略

记录每个IP的访问频度,在单位时间之内,如果访问频率超过一个阀值,我们就认为这个IP很可能有问题,那么我们就可以返回一个验证码页面,要求用户填写验证码.

6.用时间窗口来改进实时反爬虫系统

爬虫爬取网页的频率都是比较固定的,不像人去访问网页,中间的间隔时间比较无规则,所以我们可以给每个IP地址建立一个时间窗口,记录IP地址最近12次访问时间,每记录一次就滑动一次窗口,比较最近访问时间和当前时间,如果间隔时间很长判断不是爬虫,清除时间窗口,如果间隔不长,就回溯计算指定时间段的访问频率,如果访问频率超过阀值,就转向验证码页面让用户填写验证码.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: