前言
本文中如有错误,请各位指正。
背景
在爬取各大网页信息时,通过会遇到各种各样的反爬措施:很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常的访客,那么它就可能就会禁止此IP的访问(有兴趣的小伙伴可以试试天眼查这个网站)。所以我们需要设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取,同时也不会暴露自己。
虽然网上有各在代理IP地址,但是是实际工作中这些IP并不能用。因此我们需要购买并使用一些付费的代理。比如本文中要使用的阿布云。我们可以去阿布云网站去购买相应的服务。(ps:此处并无做广告的意思,只是因为我自己在使用。)
Scrapy中阿布云代理的接入
在本文中,我仅作为一名勤劳的搬运工,将阿布云在Scrapy中的接入代码列出,其它接入指南可以参考网站:https://www.abuyun.com/http-proxy/pro-manual.html (以下程序转自此网站)
#! -*- encoding:utf-8 -*-
import base64
# 代理服务器
proxyServer = "http://http-pro.abuyun.com:9010"
# 代理隧道验证信息
proxyUser = "H01234567890123P"
proxyPass = "0123456789012345"
# for Python2
proxyAuth = "Basic " + base64.b64encode(proxyUser + ":" + proxyPass)
# for Python3
#proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((proxyUser + ":" + proxyPass), "ascii")).decode("utf8")
class ProxyMiddleware(object):
def process_request(self, request, spider):
request.meta["proxy"] = proxyServer
request.headers["Proxy-Authorization"] = proxyAuth
可将此程序写入middlewares.py文件中,然后在settings.py下载器中间件中配置即可。如果想检测自己的代理是否使用,可将密码或帐号故意写错进行测试(暂时只能想到这种方法)。
知识点
下载器中间件
有时某些代码在蜘蛛执行之前要先执行,或者要对request进行重新调整,此时就可以使用下载器中间件这种插件系统 在不修改代码的前提下直接将新的功能模块接入Scrapy框架中。
编写下载器中间件十分简单。每个中间件组定义了一个或多个方法的Python类,以下是自定义下载器中间件的救命模板:
class MyDownloadMiddleWare(object):
def process_request(self,request,spider):
"'当每个request通过下载中间件时,该方法被调用"
pass
def process_response(self,request,response,spider):
"当完成对request的下载并产生response对象时在调用spider上的parse方法之前被 调用"
pass
def process_exception(self,request,exception,spider):
"当下载处理器(download handler)或process_request()抛出异常时被调用"
关于这三个函数的具体内容可以自行百度学习,此处不再给出。
Scrapy提供了一个下载器中间件scrapy.downloadermiddlers.HttpProxyMiddleware
,用于设置爬网的代理,只要在settings.py文件中设置以下几个配置项就可启用该代理中间件:
DOWNLOADER_MIDDLERS={
'scrapy.downloadermiddlers.HttpProxyMiddleware':900
}
HTTPPROXY_ENABLED=True
HttpProxyMiddleware
中间件并不可以在设置文件中直接指定代理地址,它设置代理地址的方法有两种,一种是从系统代理中读取,一种就是在生成请求实例request后在request.meta['proxy']
中设置代理。也就是说要么在蜘蛛的start_requests
方法中进行设置,要么编写一个下载器中间件并将其实现优先级设置得比HttpProxyMiddleware
更高,在自定义中先设定好request.meta['proxy']
的值。
上面给出的阿布云的使用方法即是编写一个下载器中间件。
声明
此理论部分转自书《虫术–python绝技》。