zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    [微信篇]ESP8266-NonOS学习笔记(十一)之微信小程序控制LED灯 Part 1
    [外设篇]ESP8266-SDK教程(十)之DHT11、OLED1306
    [基础篇]ESP32-RTOS-SDK教程(一)之Windows环境搭建
    [网络篇]ESP8266-SDK教程(九)之物联网标配MQTT实际测试
    [网络篇]ESP8266-SDK教程(八)之物联网标配MQTT服务端软件
    [网络篇]ESP8266-SDK教程(七)之物联网标配MQTT初相识
    [网络篇]ESP8266-SDK教程(六)之网页配置Wi-Fi名称和密码
    [网络篇]ESP8266-SDK教程(五)之SmartConfig、Airkiss等多种配网方式
    [基础篇]ESP8266-SDK教程(四)之GPIO操作(按键、LED、中断、定时器)
    [网络篇]ESP8266-SDK教程(三)之TCP通信Server<->Client
  • 原文地址:https://www.cnblogs.com/zenan/p/9072065.html
Copyright © 2011-2022 走看看