Python Scrapy反爬虫常见解决方案(包含5种方法)
爬虫的本质就是“抓取”第二方网站中有价值的数据,因此,每个网站都会或多或少地采用一些反爬虫技术来防范爬虫。比如前面介绍的通过 User-Agent 请求头验证是否为浏览器、使用 JavaScript 动态加载资源等,这些都是常规的反爬虫手段。
下面针对更强的反爬虫技术提供一些解决方案。
IP 地址验证
有些网站会使用 IP 地址验证进行反爬虫处理,程序会检查客户端的 IP 地址,如果发现同一个 IP 地址的客户端频繁地请求数据, 该网站就会判断该客户端是爬虫程序。
针对这种情况,我们可以让 Scrapy 不断地随机更换代理服务器的 IP 地址,这样就可以欺骗目标网站了。
为了让 Scrapy 能随机更换代理服务器,可以自定义一个下载中间件,让该下载中间件随机更换代理服务器即可。
Scrapy 随机更换代理服务器只要两步:
- 打开 Scrapy 项目下的 middlewares.py 文件,在该文件中增加定义如下类
-
class RandomProxyMiddleware (object) : #动态设置代理服务器的IP 地址 def process request (self, request, spider): # get_random_proxy() 函数随机返回代理服务器的IP 地址和端口 request.meta["proxy"] = get_random_proxy()
- 上面程序通过自定义的下载中间件为 Scrapy 设置了代理服务器。程序中的 get_random_proxy() 函数需要能随机返回代理服务器的 IP 地址和端口,这就需要开发者事先准备好一系列代理服务器,该函数能随机从这些代理服务器中选择一个。
- 通过 settings.py 文件设置启用自定义的下载中间件。在 settings.py 文件中增加如下配置代码:
-
#配置自定义的下载中间件 DOWNLOADER MIDDLEWARES = { 'ZhipinSpider.middlewares.RandomProxyMiddleware': 543, }
禁用Cookie
有些网站可以通过跟踪 Cookie 来识别是否是同一个客户端。Scrapy 默认开启了 Cookie,这样目标网站就可以根据 Cookie 来识别爬虫程序是同一个客户端。
目标网站可以判断,如果同一个客户端在单位时间内的请求过于频繁,则基本可以断定这个客户端不是正常用户,很有可能是程序操作(比如爬虫),此时目标网站就可以禁用该客户端的访问。
针对这种情况,可以让 Scrapy 禁用 Cookie(Scrapy 不需要登录时才可禁用 Cookie)。在 settings.py 文件中取消如下代码的注释即可禁用 Cookie: -
COOKIES_ENABLED = False
违反爬虫规则文件
在很多 Web 站点目录下都会提供一个 robots.txt 文件,在该文件中制定了一系列爬虫规则。例如,Weibo.com 网站下的 robots.txt 文件的内容如下:
-
Sitemap: http://weibo.com/sitemap.xml User-Agent: Baiduspider Disallow : User-agent : 360Spider Disallow : User-agent : Googlebot Disallow : User-agent : Sogou web spider Disallow : User-agent:bingbot Disallow : User-agent : smspider Disallow : User-ageηt : HaosouSpider Disallow : User-agent : YisouSpider Disallow : User-agent : * Disallow : /
该规则文件指定该站点只接受 Baidu 的网络爬虫,不接受其他爬虫程序。
为了让爬虫程序违反爬虫规则文件的限制,强行爬取站点信息,可以在 settings 文件中取消如下代码的注释来违反站点制定的爬虫规则: -
#指定不遵守爬虫规则 ROBOTSTXT OBEY = False
限制访问频率
正如前面所提到的,当同一个 IP 地址、同一个客户端访问目标网站过于频繁时(正常用户的访问速度没那么快),其很可能会被当成机器程序(比如爬虫)禁止访问。
为了更好地模拟正常用户的访问速度,可以限制 Scrapy 的访问频率。在 settings 文件中取消如下代码的注释即可限制 Scrapy 的访问频率: -
#开启访问频率限制 AUTOTHROTTLE ENABLED = True #设置访问开始的延迟 AUTOTHROTTLE START DELAY = 5 #设置访问之间的最大延迟 AUTOTHROTTLE MAX DELAY = 60 #设置Scrapy 并行发给每台远程服务器的请求数量 AUTOTHROTTLE TARGET CONCURRENCY= 1.0 #设置下裁之后的自动延迟 DOWNLOAD DELAY = 3
图形验证码
有些网站为了防止机器程序访问,会做一些很“变态”的设计,它会记录同一个客户端、同一个IP地址的访问次数,只要达到一定的访问次数(不管你是正常用户,还是机器程序),目标网站就会弹出一个图形验证码让你输入,只有成功输入了图形验证码才能继续访问。
为了让机器识别这些图形验证码,通常有两种解决方式:- 使用 PIL、Libsvrn 等库自己开发程序来识别图形验证码。这种方式具有最大的灵活性,只是需要开发人员自己编码实现。
- 通过第三方打码平台识别。有不少图形验证码的在线识别网站,它们的识别率基本可以做到 90% 以上。但是识别率高的在线识别网站通常都要收费,而免费的往往识别率不高,还不如自己写程序来识别。