zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    网络编程(一)--网络编程介绍
    Python与设计模式之单例模式
    面向对象(六)--元类
    面向对象(五)--isinstance与issubclass方法、反射、内置方法(部分)、异常处理
    面向对象(四)--绑定方法与非绑定方法(classmethod、staticmethod装饰器)
    面向对象(三)--多态、封装、property装饰器
    面向对象(二)--继承与派生、组合
    Django之中间件
    Django之auth认证
    Django之form主键
  • 原文地址:https://www.cnblogs.com/bailongcaptain/p/13448290.html
Copyright © 2011-2022 走看看