前文回顾
亲爱的各位看官们,看到这篇文章的时候,我们的爬虫之旅马上就要告一段落了。如果你支持我的博客,请点赞关注并分享。如果你觉得在下写的好,有钱的捧个钱场,没钱的捧个人场。我的博客都是公开的,也就是说,不要钱随便看的。当然如果阁下略微施舍点,在下也感激不尽。好了,闲言少叙,书归正文。
爬虫呢?本质上说来其实就是模仿用户,到浏览器上抓取信息的一种手段。其实每个网站或多或少的有放爬虫意识,只是强不强得问题。在前面的介绍中,我们有伪装自己的请求代理,去访问某个网址,这其实也是一种反防爬虫手段。不过呢?这只是最低级的手段,下面呢,将介绍五种反爬虫的常见手段。
1、IP地址验证
有些网站会使用IP地址验证来处理爬虫程序,其原理是什么呢?网站程序检查客户端的IP地址,如果发现一个IP地址不停的访问和请求数据,那么就判断这个客户为机器人,也就是爬虫。 试想,程序可是以毫秒的速度运行的,一个人怎么可以以毫秒时间单位,点击网页上的元素吗?不可能的,所以这是一个常规的反爬虫手段。 那么针对这个情况,如何伪装我们的程序,让其不被侦察出来呢?很简单,设置一个代理服务器序列,然后每次更换服务器代理,即IP地址就可以了。 为了让scrapy能随机的更换代理服务器,我们可以自定义一个下载中间件,让下载中间件随机更换代理服务器即可。Scrapy框架随机更换代理服务器只需要两步,如下: 第一步:打开Scrapy项目下的middlewares.py文件,在该文件中增加如下类定义:class RandomProxyMiddleware(object):
def process_request(self, request, spider):
request.meta["proxy"] = get_random_proxy()
上面程序通过自定义的下载中间件为Scrapy设置了代理服务器,程序中的get_random_proxy()函数需要返回代理服务器的IP地址和端口号,这就需要你事先准备好一系列的代理服务器了,然后这个函数在代理服务器中,随机选一个。
第二步:通过setting.py文件设置启动自定义的下载中间件,在setting.py文件中增加如下配置代码。
DOWNLOADER_MIDDLEWARES = {
'spider_name.middlewares.RandomProxyMiddleware':543
}
2、禁用Cookie
有些网站可以通过跟踪cookie来识别是否为同一个客户端,学过网络的人都知道cookie是个什么东西,学过web后端开发的也知道这cookie是什么东西,但是没学过的不就懵逼了吗?下面简单的介绍一下,cookie到底在计算机网络中是干嘛的。 Cookie 并不是它的原意“甜饼”的意思, 而是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性, 因此它可以帮助我们实现记录用户个人信息的功能, 而这一切都不必使用复杂的CGI等程序 [2] 。 举例来说, 一个 Web 站点可能会为每一个访问者产生一个唯一的ID, 然后以 Cookie 文件的形式保存在每个用户的机器上。如果使用浏览器访问 Web, 会看到所有保存在硬盘上的 Cookie。在这个文件夹里每一个文件都是一个由“名/值”对组成的文本文件,另外还有一个文件保存有所有对应的 Web 站点的信息。在这里的每个 Cookie 文件都是一个简单而又普通的文本文件。透过文件名, 就可以看到是哪个 Web 站点在机器上放置了Cookie(当然站点信息在文件里也有保存) 那么了解了cookie,我们就知道,服务器跟踪我们的cookie文件,就很容易判断访问者是不是机器人。如果检查某客户端的cookie,发现该客户在某段时间内,频繁的请求紫云啊,那么就可以断定这个客户八成是机器人,直接屏蔽,或者采用另类的方式验证此客户是不是机器人,比如验证码验证,短信提示等。 针对这种情况,方法很简答,scrapy框架中,默认是开启cookie的,我们只要在配置文件中将cookie关掉就好了。在setting.py文件中去掉如下代码注释即可:COOKIES_ENABLED = False
3、爬虫规则文件
很多网站都会提供一个爬虫规则文件,名称为robots.txt。在该文件中制定了一系列针对爬虫的规则。例如CSDN的robots.txt文件内容如下:User-agent: *
Disallow: /scripts
Disallow: /public
Disallow: /css/
Disallow: /images/
Disallow: /content/
Disallow: /ui/
Disallow: /js/
Disallow: /scripts/
Disallow: /article_preview.html*
Disallow: /tag/
Disallow: /*?*
Disallow: /link/
Sitemap: http://www.csdn.net/article/sitemap.txt
查看方法也一并送给你,只需要在浏览地址栏上输入:
http://你查看的网址/robots.txt
以CSDN为例,你就可以看到如下结果:
上面有个user-agent:*,这个表示接收所有爬虫。但有的不是啊,例如微博的,就是user-agent:baiduspider,这表示只接受百度的爬虫。但是就算你再怎么牛,天下没有攻不破的网站。你可以强行抓取某个网站站点信息,但是需要再setting.py文件中取消如下代码注释来完成:
ROBOTSTXT_OBEY = False
4、限制访问频率
前面已经介绍了三种办法,但是前两种都是跟访问频率有关,以访问频率来判断是不是机器人。聪明的人已经想到了,笨蛋那就容我多说几句啊!不是嘲讽,而是调侃。 第一时间想到,引入thread模块,延迟程序的执行,这其实是一个办法,但是远没有人家scrapy框架给的方法简单,只需要修改setting.py文件就行啦,将如下代码注释去掉并修改:AUTOTHROTTLE_ENABLED = True # 节流阀自动开启,即访问频率限制开启
AUTOTHROTTLE_START_DELAY = 5 # 设置访问开始的延迟
AUTOTHROTTLE_MAX_DELAY = 60 # 设置访问之间的最大延迟
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 # 设置框架发送给服务器的请求数量
DOWNLOAD_DELAY = 3 # 设置下载之后的自动延迟
5、验证码
有些网站呢,会设计一些有趣的东西,比如呢,我就是一个网站开发者。如果我已经知道了前面四种反防爬虫手段,那么我就必须想一个更高明的办法来杀死或者限制别人的虫子。例如,我可以这样干,设置三个阈值,一个客户如果访问的次数到达第一个阈值,我就给一个图形验证码;到达第二个阈值,我给一个更复杂的图形验证码,例如滑动补图的那种验证码;到达第三个阈值,呵,你说你不是机器人我都认为你是个机器人,直接屏蔽你,或者“杀了这个假客户”。 所以说,为了学习我们亲爱的爬虫,我们必须拼一把,不然生而为人,怎敢抱歉? go, 去学习图形验证码的识别方法。 这里提供两种方式: 第一种:下载ppl,ocr类的包,去手动开发一个图形验证码识别的程序。这个本人是强推的,因为灵活性很高,自己的编的代码也很有成就感。如果你懒得弄,网上百度,一搜一大把。 第二种:直接将验证码图片下载下来,到专门识别验证码的网站去识别,当然可能收费。 注:如果你采用第一种方法,我提供一个思路,就是将图片先灰度化,然后再二值化,最后提取点信息就行了。总结
小虫子的最高境界就是让别人不知道他是一个小虫子,而且认为小虫子就是一个人。模仿人类行为的爬虫,才是最高明的爬虫。当然,还有很多我没有说,比如有的网站,访问时需要登陆自己的用户信息和密码,其实这个也是request的应用,学好网站架构就会明白怎么搞了。这里提供一个方向,你大可去了解selenium包,里面有你要的东西。
下一节,将说说总结,已经没有什么实质的技术内容,主要是思想。学到这里的人大可不必去看后面的东西了,但是后面的内容犹如鸡肋,食之无味,弃之可惜。
谢各位了,告辞了!
此处附上本次教程个人总结链接地址:https://blog.csdn.net/qq_44503987/article/details/105179436