• scrapy 中间件


    一、中间件的分类

      scrapy的中间件理论上有三种(Schduler Middleware,Spider Middleware,Downloader Middleware),在应用上一般有以下两种

           1.爬虫中间件Spider Middleware

    • 我们可以在Downloader生成的Response发送给Spider之前,也就是在Response发送给Spider之前对Response进行处理。

    • 我们可以在Spider生成的Request发送给Scheduler之前,也就是在Request发送给Scheduler之前对Request进行处理。

    • 我们可以在Spider生成的Item发送给Item Pipeline之前,也就是在Item发送给Item Pipeline之前对Item进行处理。

      2.下载器中间件Downloader Middleware

             主要功能在请求到网页后,页面被下载时进行一些处理.

    二、使用

          1.Spider Middleware有以下几个函数被管理:

           - process_spider_input 接收一个response对象并处理,

             位置是Downloader-->process_spider_input-->Spiders(Downloader和Spiders是scrapy官方结构图中的组件)

           - process_spider_exception spider出现的异常时被调用

           - process_spider_output 当Spider处理response返回result时,该方法被调用

           - process_start_requests 当spider发出请求时,被调用

        位置是Spiders-->process_start_requests-->Scrapy Engine(Scrapy Engine是scrapy官方结构图中的组件)         

       2.Downloader Middleware有以下几个函数被管理

       - process_request  request通过下载中间件时,该方法被调用

       - process_response 下载结果经过中间件时被此方法处理

       - process_exception 下载过程中出现异常时被调用

          编写中间件时,需要思考要实现的功能最适合在那个过程处理,就编写哪个方法.

          中间件可以用来处理请求,处理结果或者结合信号协调一些方法的使用等.也可以在原有的爬虫上添加适应项目的其他功能,这一点在扩展中编写也可以达到目的,实际上扩展更加去耦合化,推荐使用扩展.

    三.常用功能

    downloader middleware中常用功能:

    1) 添加User-Agent

    class UserAgentMiddleware:
        @property
        def user_agent(self):
            USER_AGENT_LIST = [
                'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
                "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
                "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
                "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
            ]
            USER_AGENT = random.choice(USER_AGENT_LIST)
            return USER_AGENT
    
        def process_request(self, request, spider):
            # Called for each request that goes through the downloader
            # middleware.
            request.headers.setdefault('User-Agent', self.user_agent)
            return None

    2) 添加Proxy

    class ProxyMiddleware(object):
    
        proxy_list = [
            "http://110.73.3.113:8123",
            "http://171.13.37.172:808",
            "https://221.229.44.79:808",
        ]
    
        def process_request(self, request, spider):
            ip = random.choice(self.proxy_list)
            print(ip)
            request.meta['proxy'] = ip

    3) 动态网页使用无头浏览器处理

    4)下载页面并返回,不经过downloader

        def process_request(self, request, spider):
            
            res = requests.get(request.url)
            body = res.content
            return scrapy.http.HtmlResponse(url=request.url,body=body,request=request,status=200)
    

      

    requests 设置代理:

    import requests
    
    
    proxy = {"http":"http://120.158.123.88:8008"}
    requests.get(url,proxies=proxy)
    
  • 相关阅读:
    Java网络编程注意事项3
    存储在图的形式——邻接矩阵(排列)
    C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)
    [Django1.6]south于django1.6使用
    《Javascript权威指南》13号学习笔记:使用日期和时间
    POJ 1699 Best Sequence (DFS+预处理)
    第五蓝桥杯 蚂蚁冷
    Mac OS X 在捕捉AppLAN通信包
    面向对象、内存模型、动态绑定
    链接器与分离编译
  • 原文地址:https://www.cnblogs.com/zenan/p/9072065.html
Copyright © 2020-2023  润新知