13.8 突破反爬虫
既然要突破反爬虫机制,那我们就需要知道有哪些反爬虫措施。大部分网站的反爬虫措施可以分为以下四类:
·基于验证码的反爬虫。 现在大部分的网站都会有验证码,有传统验证码、逻辑验证码,还有滑动验证码等,例如google会在访问的时候有时候要求输入验证码,能加大爬虫大规模爬取的难度,但是依然有办法突破,解决办法可以参考第10章的验证码问题。
·基于Headers的反爬虫。 从请求头Headers进行反爬虫是比较常见的措施,大部分网站会对Headers中的User-Agent和Referer字段进行检测。突破办法是可以根据浏览器正常访问的请求头对爬虫的请求头进行修改,尽可能和浏览器保持一致。
·基于用户行为的反爬虫。 还有一些网站通过用户的行为进行反爬虫,例如同一IP短时间内多次访问同一页面,同一账户短时间内多次进行相同操作或者访问页面的间隔比较固定,通俗来说就是表现得不像人在访问。大部分都是第一种情况,可以使用大量的IP代理进行绕过。第二种情况可以注册较多的账户登录,构成一个Cookie池,对用户状态进行自动切换。第三种情况可以将访问间隔设置成随机的,尽可能模拟人的访问频率。
·基于动态页面的反爬虫。 现在越来越多的网站采用动态加载技术,无法直接从页面上获取数据,需要分析Ajax请求,然后进行模拟发送获取数据。如果能够直接模拟Ajax请求,这当然是最好的结果,但是有些网站把Ajax请求的所有参数全部加密了,无法构造自己所需要的数据的请求,这就大大增加了爬取的难度。如果能忍受较低的效率和较大的内存消耗,我们可以使用selenium+phantomJS进行突破。
综上所述,突破反爬虫的秘诀是将爬虫模拟得像人在操作浏览器进行访问,而且在爬虫和反爬虫的斗争中,最终必然是爬虫胜利,只不过是付出的代价有多大而已。但是我建议做爬虫的时候,尽可能地减小访问频率,不要给他人的网站服务器造成过大的负担,毕竟我们只是想提取数据而已。下面我们讲解一下Scrapy中推荐的突破反爬虫措施,这些措施不仅能用于Scrapy,也可以用于普通爬虫程序。
13.8.1 UserAgent池
HTTP请求头中User-Agent包含了我们使用的浏览器和操作系统的一些信息,很多网站通过判断User-Agent内容来确定用户,所以要动态设置User-Agent,来伪装存在很多用户。这就需要使用13.5.2小节的下载器中间件RandomUserAgent,设置动态的User-Agent,使用时在settings中将内置的UserAgentMiddleware禁用,并激活RandomUserAgent即可。
13.8.2 禁用Cookies
假如你爬取的网站不需要登录就可以进行爬取,可以尝试将Cookie禁用。因为Cookie会跟踪爬虫的访问过程,容易被发现。Scrapy通过设置settings中的COOKIES_ENABLED=False,即可实现对cookie的禁用。
13.8.3 设置下载延时与自动限速
对一个网站访问过于频繁就会被反爬虫措施所识别和拦截,一个比较好的做法是设置下载延时,在settings中设置DOWNLOAD_DELAY。比如设置延时2秒:
DOWNLOAD_DELAY=2
但是存在一个问题,DOWNLOAD_DELAY设置完成之后,不能动态改变,导致访问延时都差不多,也容易被发现。不过可以设置RANDOMIZE_DOWNLOAD_DELAY字段,进行动态调整。
RANDOMIZE_DOWNLOAD_DELAY=True
如果启用,当从相同的网站获取数据时,Scrapy将会等待一个随机的值,延迟时间为0.5到1.5之间的一个随机值乘以DOWNLOAD_DELAY。这会大大降低被发现的几率,但是有一些网站会检测访问延迟的相似性,也有发现的可能性。Scrapy提供了一种更智能的方法来解决限速的问题:通过自动限速扩展,该扩展能根据Scrapy服务器及爬取的网站的负载自动限制爬取速度。
Scrapy是如何实现自动限速扩展的呢?在Scrapy中,下载延迟是通过计算建立TCP连接到接收到HTTP包头(header)之间的时间来测量的,该扩展就是以此为前提进行编写的。使用的限速算法根据以下规则调整下载延迟及并发数:
·spider永远以1并发请求数及AUTOTHROTTLE_START_DELAY中指定的下载延迟启动。
·当接收到回复时,下载延迟会调整到该回复的延迟与之前下载延迟之间的平均值。
·如何配置自动限速扩展呢?通过配置settings中的以下字段:
·AUTOTHROTTLE_ENABLED:默认为False,设置为True可以启用该扩展。
·AUTOTHROTTLE_START_DELAY:初始下载延时,单位为秒,默认为5.0。
·AUTOTHROTTLE_MAX_DELAY:设置在高延迟情况下最大的下载延迟,单位秒,默认为60。
·AUTOTHROTTLE_DEBUG:用于启动Debug模式,默认为False.
·CONCURRENT_REQUESTS_PER_DOMAIN:对单个网站进行并发请求的最大值。默认为8。
·CONCURRENT_REQUESTS_PER_IP:对单个IP进行并发请求的最大值。如果非0,则忽略CONCURRENT_REQUESTS_PER_DOMAIN设定,使用该设定。也就是说,并发限制将针对IP,而不是网站。
13.8.4 代理IP池
突破对IP访问次数的限制,可以使用大量的代理IP,然后选取合适的IP进行请求的访问。可以使用13.5.2节中讲到的RandomProxy中间件,对请求设置代理。如果是个人用户,推荐使用我的IPProxys项目。
13.8.5 Tor代理
首先介绍一下Tor是什么?Tor即“洋葱路由器”,创造这项服务的目的是让人们匿名浏览互联网。它是一个分散式系统,允许用户通过中继网络连接,而无需建立直接连接。这种方法的好处是,可以对访问的网站隐藏IP地址,因为连接是在不同服务器之间随机变换的,无法追踪您的踪迹,其实也相当于代理IP池的作用,但是也有缺点,比如访问速度较慢。下面以Windows和Ubuntu上的配置为例。
首先使用VPN连接到国外的服务器上或者配置Tor代理,因为国内并不容易连接上Tor,如图13-3所示。
接着从官网上(https://www.torproject.org/download/download.html )下载Tor,如图13-4所示,下载Expert Bundle。
图13-3 连接VPN
图13-4 Tor下载
安装完成后,这个版本并没有一个图形化的操作界面,要修改配置十分麻烦,可以通过下载Vidalia来使用TOR,Vidalia的下载地址:
https://people.torproject.org/~erinn/vidalia-standalone-bundles/
下载其中的vidalia-standalone-0.2.21-win32-1_zh-CN.exe即可,安装完成之后,以管理员权限运行Start Vidalia.exe,进行下面的设定,选择Tor路径,如图13-5所示。
图13-5 配置Tor
设置完成后,点击启动Tor就可以了,显示如图13-6所示,即为启动成功。
图13-6 启动Tor
由于Scrapy暂时只支持HTTP代理,但是Tor使用的sock5代理方式,绑定了9050端口,所以需要一个HTTP转sock的代理软件,例如polipo或者privoxy。我选择的是polipo,下载地址为:https://www.irif.fr/~jch/software/files/polipo/ 。选择polipo-1.1.0-win32.zip,下载并解压,然后编辑解压后的文件config.sample,加入以下配置:
socksParentProxy = "localhost:9050" socksProxyType = socks5 diskCacheRoot = ""
在命令行下运行该目录下的程序:polipo.exe-c config.sample,polipo默认监听8123端口,如图13-7所示。
图13-7 启动polipo
当以上工作都完成后,我们只需要在RandomProxy中间件中将process_request方法代码修改为如下所示:
def process_request(self, request, spider): request.meta['proxy'] ='http://127.0.0.1:8123'
Ubuntu下的配置也是类似的,一共分为5个步骤:
1)连接上VPN。
2)使用以下四条命令添加软件源:
sudo add-apt-repository "deb http://deb.torproject.org/torproject.org/ precise main" gpg --keyserver keys.gnupg.net --recv 886DDD89 gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add - sudo apt-get update
3)安装Tor、polipo、vidalia:sudo apt-get install tor polipo vidalia。
4)配置polipo:
socksParentProxy = "localhost:9050" socksProxyType = socks5 diskCacheRoot = ""
配置完成后,重启sudo/etc/init.d/polipo restart。
5)启动vidalia,在界面中启动Tor即可。
13.8.6 分布式下载器:Crawlera
Scrapy官方提供了一个分布式下载器Crawlera,用来帮助我们躲避反爬虫的封锁。首先去官网https://app.scrapinghub.com/account/login/next=/account/login ,注册一个账号,如图13-8所示。
注册完成后,会分配给用户API Key,用作访问验证使用,如图13-9所示。
不过这个下载器是收费的,需要充值才能正常工作。下面介绍一下如何在Scrapy中使用这个下载器,只需要两步即可。
1)安装scrapy-crawlera:
pip install scrapy-crawlera
2)修改settings.py:
DOWNLOADER_MIDDLEWARES = {'scrapy_crawlera.CrawleraMiddleware': 300} CRAWLERA_ENABLED = True CRAWLERA_APIKEY = '<API key>'
这个时候就可以启用爬虫了,具体的配置和管理操作,大家请看官方的使用文档:https://doc.scrapinghub.com/crawlera.html 。
图13-8 注册scrapinghub
图13-9 API Key
13.8.7 Google cache
Google cache指的是Google的网页快照功能。Google是一个强大的搜索引擎,可以将爬取到的网页缓存到服务器中,因此我们可以不用直接访问目的站点,访问缓存也是可以达到提取数据的目的。访问Google cache的方式为:http://webcache.googleusercontent.com/searchq=cache: 要查询的网址,例如我想查看博客的快照,可以在浏览器中输入以下网址:
http://webcache.googleusercontent.com/search?q=cache :http://www.cnblogs.com/qiyeboy/
搜索结果如图13-10所示。
大家只需要写个中间件将Request中的URL替换成Google cache下的URL即可。
图13-10 Google cache
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论