09 scrapy的中间件

scrapy的中间件简介

1 都写在middlewares.py
2 爬虫中间件
3 下载中间件
4 要生效,一定要配置,配置文件

下载中间件:

下载中间件的用途
    1、在process——request内,自定义下载,不用scrapy的下载
    2、对请求进行二次加工,比如
        设置请求头
        设置cookie
        添加代理
        scrapy自带的代理组件:
            from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware
            from urllib.request import getproxies

下载中间件代码解析:

class DownMiddleware1(object):
    def process_request(self, request, spider):
        """
        请求需要被下载时,经过所有下载器中间件的process_request调用
        :param request: 
        :param spider: 
        :return:  
            None,继续后续中间件去下载;
            Response对象,停止process_request的执行,开始执行process_response
            Request对象,停止中间件的执行,将Request重新调度器
            raise IgnoreRequest异常,停止process_request的执行,开始执行process_exception
        """
        pass



    def process_response(self, request, response, spider):
        """
        spider处理完成,返回时调用
        :param response:
        :param result:
        :param spider:
        :return: 
            Response 对象:转交给其他中间件process_response
            Request 对象:停止中间件,request会被重新调度下载
            raise IgnoreRequest 异常:调用Request.errback
        """
        print('response1')
        return response

    def process_exception(self, request, exception, spider):
        """
        当下载处理器(download handler)或 process_request() (下载中间件)抛出异常
        :param response:
        :param exception:
        :param spider:
        :return: 
            None:继续交给后续中间件处理异常;
            Response对象:停止后续process_exception方法
            Request对象:停止中间件,request将会被重新调用下载
        """
        return None

中间件的简单使用:

1 更换请求头
from scrapy.http.headers import Headers
request.headers['User-Agent']=''
2 cookie池
request.cookies={'username':'asdfasdf'}
3 代理池
request.meta['download_timeout'] = 20
request.meta["proxy"] = 'http://27.188.62.3:8060'

以上都是再request中用的

4 selenium在scrapy中的使用

ps:selenium最好写在response中

# 当前爬虫用的selenium是同一个

# 1 在爬虫中初始化webdriver对象
    from selenium import webdriver
    class CnblogSpider(scrapy.Spider):
        name = 'cnblog'
        ...
 bro=webdriver.Chrome(executable_path='../chromedriver.exe')
# 2 在中间件中使用(process_request)
spider.bro.get('https://dig.chouti.com/')   response=HtmlResponse(url='https://dig.chouti.com/',body=spider.bro.page_source.encode('utf-8'),request=request)
    return response
	
# 3 在爬虫中关闭
    def close(self, reason):
        print("我结束了")
        self.bro.close()
posted @ 2020-08-06 19:12  江湖有梦  阅读(90)  评论(0编辑  收藏  举报