Scrapy中间件

  1. Scrapy中间件分类
  2. 实现中间件的流程
  3. 下载中间件模版
  4. 爬虫中间件
  5. 随机UA下载中间件
  6. 代理中间件

Scrapy中间件分类

* 爬虫中间件 引擎和爬虫组件交互时触发中间件
* 下载中间件 引擎和下载器交互时出发中间件

实现中间件的流程

在 middlewares.py 创建中间件类
实现所需要拦截的函数
在 settings.py 中配置开启中间件
在配置中数字越小越优先执行

下载中间件模版

class DownloadMiddleware(object):      
    """下载中间件"""
    @classmethod
    def from_crawler(cls, crawler):
        """当爬虫被创建时执行  首先执行的方法"""
        pass
        
    def spider_opened(self, spider):
        """当爬虫被打开时回调,初始化一些内容时可以放在这里 """
       pass

    def process_request(self, request, spider):
        """当 引擎 把 请求提交给下载器时回调 """
       pass
      
    def process_response(self, request, response, spider):
       """ 当下载组件把响应交给引擎时回调 """
       pass
         
    def process_exception(self, request, exception, spider):
        """ 当下载中间件引发异常时回调  """
       pass

爬虫中间件

class SpiderMiddleware(object):
    ""爬虫中间件"""
    
    @classmethod
    def from_crawler(cls, crawler):
        """当爬虫创建时回调"""
       pass

    def spider_opened(self, spider):
        """ 当爬虫初始化时回调"""
        pass
     
    def process_spider_input(self, response, spider):
        """当引擎把响应交给爬虫组件时回调"""
        pass
       
    def process_spider_output(self, response, result, spider):
        """当爬虫组件把数据或者请求提交给引擎时回调"""
        pass
       
    def process_spider_exception(self, response, exception, spider):
       """当 process_spider_input 引发异常时回调"""
        pass

    def process_start_requests(self, start_requests, spider):
        """当引擎 从爬虫获取 启动 请求时回调"""
        pass
        
        

随机UA下载中间件

import random

def get_ua():
    """生成UA"""
    first_num = random.randint(55, 62)
    third_num = random.randint(0, 3200)
    fourth_num = random.randint(0, 140)
    os_type = [
        '(Windows NT 6.1; WOW64)', '(Windows NT 10.0; WOW64)', '(X11; Linux x86_64)',
        '(Macintosh; Intel Mac OS X 10_12_6)'
    ]
    chrome_version = 'Chrome/{}.0.{}.{}'.format(first_num, third_num, fourth_num)

    ua = ' '.join(['Mozilla/5.0', random.choice(os_type), 'AppleWebKit/537.36',
                   '(KHTML, like Gecko)', chrome_version, 'Safari/537.36']
                  )
    
    # 将生成UA 返回出去
    return ua

class RandomUserAgentDownloadMiddleware(object):
    
    def process_request(self, request, spider):
        """当 引擎 把 请求提交给下载器时回调"""
        
        requests.headers["User-Agent"] = get_ua()

        return None
        

代理中间件

class RandomProxyDownloadMiddleware(object):
    def process_request(self, request, spider):

        # request.meta["http_proxy"] = random.choice(PROXIES)
        
        # http://127.0.0.1:6868/proxies/random  你自己代理池的地址
        proxy = requests.get('http://127.0.0.1:6868/proxies/random').text
        requests.meta["http_proxy"] = proxy
        return None

# 注意
scrapy框架中不要用 requests.meta['proxy'] = proxy
会一直有问题,什么主机失去响应啊什么的

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:Scrapy中间件

本文作者:伟生

发布时间:2019-11-01, 14:33:27

最后更新:2019-11-01, 15:04:19

原始链接:http://yoursite.com/2019/11/01/spider_12_UA/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏