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()
    
  • 相关阅读:
    广义mandelbrot集,使用python的matplotlib绘制,支持放大缩小
    cs229 斯坦福机器学习笔记(一)-- 入门与LR模型
    Scrapy研究探索(三)——Scrapy核心架构与代码执行分析
    matlab各类数据l图像之间的转化
    开源重磅,java内容管理系统CMS,点击就可以编辑,保存,轻松构建自己的站点
    Android4.4 ContentResolver查询图片无效 及 图库删除 添加图片后,ContentResolver不更新的问题解决
    03002_MySQL数据库的安装和配置
    [.Net Core] 简单使用 Mvc 内置的 Ioc
    Asp.Net MVC中Action跳转
    EF的增删改查
  • 原文地址:https://www.cnblogs.com/bailongcaptain/p/13448290.html
Copyright © 2011-2022 走看看