scrapy主要有两种----中间件爬虫中间件和下载器中间件,这里主要介绍的是下载器中间件DownloaderMiddleware,下载器中间件相当于是在引擎与下载器中间的拦截器,可以在下载器发送请求之前对请求的参数进行修改,比如ip代理,userAgent,都可以在DownloaderMiddleware中完成添加。DownloaderMiddleware默认有五个方法:
process_request():听名字就知道是引擎从调度器拿到url后丢给下载器进行的时候,要经过process_request,ip代理和ua设置就是在这个位置,此方法有三种返回值,返回值是None则经过下一个中间件,返回值是request对象则将resquest对象发送个引擎,并不再向后执行,返回值是response对象,则将resp队形返回给引擎,并不在向后执行。
process_response():这个是当下载器完成请求后,把请求返回给下载器的路上,要经过process_response(),它只有两种返回值,返回值若是response对象,继续向下一个中间件进行,若返回值是request()对象,直接返回给引擎,引擎会返回给调度器。
process_exception():当请求发生错误异常时,这个中间件才会运行
spider _opened():爬虫开始前执行。
from_craeler():这个比较特俗一点,可以说是自定义中间件方法的一个声明,看介绍
def from_crawler(cls, crawler):
# This method is used by Scrapy to create your spiders.
#在Scrapy中使用这种方法来创建你自己的爬虫
s = cls()
#看着这个东西熟悉吗,没错这就是我们的spider_open方法。
#其中 s.spider_opened 是方法执行的功能,signals.spider_opened执行时间
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
#这里也可以用同样发放写一个在爬虫关闭时调用的方法
crawler.signals.connect(s.spider_close, signal=signals.spider_closed)
return s
添加后记得新建一个名为spider_close方法。ctrl+鼠标左键点击signals.spider_opened可以看到scrapy中执行时间都有哪些。
engine_started = object()
engine_stopped = object()
spider_opened = object()
spider_idle = object()
spider_closed = object()
spider_error = object()
request_scheduled = object()
request_dropped = object()
request_reached_downloader = object()
request_left_downloader = object()
response_received = object()
response_downloaded = object()
headers_received = object()
bytes_received = object()
item_scraped = object()
item_dropped = object()
item_error = object()
注意,中间件也是要在setting中打开的。
scrapy中间件设置userAgent:
首先最好先在setting中准备一个ua池,
UserAgent = [
"NOKIA5700/ UCWEB7.0.2.37/28/999",
"Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12",
]
在process_request()调用时随机选择其中一个:
from settings import UserAgent
def process_request(self, request, spider):
userAgent = random.choice(UserAgent)
request.headers['User-Agent'] = userAgent
return None
设置代理也是同样的流程:免费代理的话先在setting中建一个代理IP池,然后从中随机选择一个,但是免费的大多时不能用的,还是收费的好用一些。
def process_request(self, request, spider):
ipstring = request.get('http://v2.api.juliangip.com/company/postpay/getips?num=1&pt=1&result_type=text&split=1&trade_no=6029336031352998&sign=c6deaa0dac6d6e7693')
request.meta['proxy'] = 'https://'+ipstring
return None