Python Scrapy反爬虫常见解决方案(包含5种方法)

爬虫的本质就是“抓取”第二方网站中有价值的数据,因此,每个网站都会或多或少地采用一些反爬虫技术来防范爬虫。比如前面介绍的通过 User-Agent 请求头验证是否为浏览器、使用 JavaScript 动态加载资源等,这些都是常规的反爬虫手段。

下面针对更强的反爬虫技术提供一些解决方案。

IP 地址验证

有些网站会使用 IP 地址验证进行反爬虫处理,程序会检查客户端的 IP 地址,如果发现同一个 IP 地址的客户端频繁地请求数据, 该网站就会判断该客户端是爬虫程序。

针对这种情况,我们可以让 Scrapy 不断地随机更换代理服务器的 IP 地址,这样就可以欺骗目标网站了。

为了让 Scrapy 能随机更换代理服务器,可以自定义一个下载中间件,让该下载中间件随机更换代理服务器即可。

Scrapy 随机更换代理服务器只要两步:
  1. 打开 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 地址和端口,这就需要开发者事先准备好一系列代理服务器,该函数能随机从这些代理服务器中选择一个。
  2. 通过 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地址的访问次数,只要达到一定的访问次数(不管你是正常用户,还是机器程序),目标网站就会弹出一个图形验证码让你输入,只有成功输入了图形验证码才能继续访问。

为了让机器识别这些图形验证码,通常有两种解决方式:
  1. 使用 PIL、Libsvrn 等库自己开发程序来识别图形验证码。这种方式具有最大的灵活性,只是需要开发人员自己编码实现。
  2. 通过第三方识别。有不少图形验证码的在线识别网站,它们的识别率基本可以做到 90% 以上。但是识别率高的在线识别网站通常都要收费,而免费的往往识别率不高,还不如自己写程序来识别。