# -*- coding: utf-8 -*-
# Define here the models for your spider middleware
# # See documentation in:
from newrecord.settings import NOW_Y, NOW_M, NOW_D, YES_Y, YES_M, YES_D
from scrapy import signals
import time       
import base64                    # DownloadMiddleware                # 0 47 167 宝蓝色RGB
                                            # 在process_request   downloadmiddleware 中添加代理
                                            # proxy_user_pass = 'USERNAME:PASSWORD'
                                            # encoded_user_pass = base64.b64encode(proxy_user_pass)
                                            # request.headers['Proxy-Authorization']='Basic'+encoded_user_passwd
                                            # request.meta['proxy']='IP:PORT'
                   
                  
class NewrecordSpiderMiddleware(object):
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the spider middleware does not modify the
    # passed objects.
                  
    @classmethod   
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()  
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s  
 
# 进入spider 的response 的数据
# 和 downloadmiddle里面的process_response类似
# 先去downloadmiddleware那里的process_response  再到这里处理:               
    def process_spider_input(self, response, spider):            # 处理进入spider中的response数据,但返回的是None 
        print('-----------------------3--------------------')        # 对response筛选之后不能阻止进入spider  啥用?try--except---Exception,   
        print('---进入spidermiddleware----process_spider_input------response.url----%s--------'%(response.url))
        # Called for each response that goes through the spider
        try:      
        # middleware and into the spider.
        # Should return None or raise an exception.
            return None
        except Exception as e:
            print(e)
                   
    def process_spider_output(self, response, result, spider):
        # Called with the results returned from the Spider, after
        # it has processed the response.
        # Must return an iterable of Request, dict or Item objects.
# result :经过parse_item 处理过后的输出结果,等于item数据也可以在这里处理,不过是在Pipline处理过后的数据
# parse_item 输出的结果先进入pipeline管道里去处理item数据最后回到process_spider_output这里,再就是关闭spider:
        for i in result:
            yield i
                   
    def process_spider_exception(self, response, exception, spider):
        # Called when a spider or process_spider_input() method
        # (from other spider middleware) raises an exception.
                   
        # Should return either None or an iterable of Response, dict
        # or Item objects.
        pass       
                   
# 处理start_urls  后面的url无关: 否则这方法不会运行,只能是start_urls参数
# 并且def 里面的东西只能是process_start_requests
# 处理start_urls  与后面的url无关:
    def process_start_requests(self, start_urls, spider):
        # Called with the start requests of the spider, and works # similarly to the process_spider_output() method, except
        # that it doesn’t have a response associated.
        # Must return only start_urls (not items).
        for r in start_urls:
            if str(r).find('rank_news') >= 0:
                print('---------------------0-----------------------------')
                print('-------------------进入Spider MiddleWare里面的开始爬去网页url-----------start_requests===:%s', r)
                yield r
                  
    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s ' %spider.name)
                  
                   
class NewrecordDownloaderMiddleware(object):
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.
                   
    @classmethod   
    def from_crawler(cls, crawler):
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s   
                  
# Proxy-Authorization base64代理账户验证
# request.meta['proxy'] = "http://YOUR_PROXY_IP:PORT"
# encoded_user_pass = base64.b64encode(proxy_user_pass)
# request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
# request.meta['proxy'] = ['127.0.0.1:8000']
# request.meta['item']=''       在request meta 数据里面增加数据 可以用来传参
# request(url, meta['item']=item[], callback= '')
# request.cookies['']=''    往request里面增加cookies
    def process_request(self, request, spider):
        print('---------------1------------------')
        print('----------------进入DownloadMiddleWare中的request的url是:%s----------------' %(request.url))
        return None
 
# return None: continue processing this exception             
# return a Response object: stops process_exception() chain   
# return a Request object: stops process_exception() chain    
    def process_response(self, request, response, spider):        # 处理所有爬过的网站的response,通过response.url  可以筛选                                                                                        
        print('-----------------------------2---------------------------------')    #  需要的爬取的网址,但这个在Rules里面更方便
       print('----------------进入DownloadMiddleWare中的response的url是:%s----------------' %(response.url))
        return response                                                             # 返回的response 进入spider 中的process_spider_input                     
                                                              
    def process_exception(self, request, exception, spider):        
        pass                                                  
                                                              
    def spider_opened(self, spider):                          
        spider.logger.info('Spider opened: %s' % spider.name)
                                                                              121       1,19         顶端

Scrapy Spider MiddleWare 设置的更多相关文章

  1. Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法

    Spider有以下属性: Spider属性 name 爬虫名称,定义Spider名字的字符串,必须是唯一的.常见的命名方法是以爬取网站的域名来命名,比如爬取baidu.com,那就将Spider的名字 ...

  2. 小白学 Python 爬虫(37):爬虫框架 Scrapy 入门基础(五) Spider Middleware

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  3. 爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline

    1. Spider Middleware Spider Middleware是介入到Scrapy的Spider处理机制的钩子框架. 当Downloader生成Response之后,Response会被 ...

  4. python爬虫scrapy之downloader_middleware设置proxy代理

    一.背景: 小编在爬虫的时候肯定会遇到被封杀的情况,昨天爬了一个网站,刚开始是可以了,在settings的设置DEFAULT_REQUEST_HEADERS伪装自己是chrome浏览器,刚开始是可以的 ...

  5. scrapy代理的设置

    scrapy代理的设置 在我的上一篇文章介绍了scrapy下载器中间件的使用,这里的scrapyIP的代理就是用这个原理实现的,重写了下载器中间件的process_request(self,reque ...

  6. scrapy.Spider的属性和方法

    scrapy.Spider的属性和方法 属性: name:spider的名称,要求唯一 allowed_domains:允许的域名,限制爬虫的范围 start_urls:初始urls custom_s ...

  7. scrapy spider官方文档

    Spiders Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作 ...

  8. scrapy spider

    spider 定义:在spiders文件夹中由用户自定义,继承scrapy.Spider类或其子类 Spider并没有提供什么特殊的功能. 其仅仅请求给定的 start_urls/start_requ ...

  9. scrapy的allowed_domains设置含义

    设置allowed_domains的含义是过滤爬取的域名,在插件OffsiteMiddleware启用的情况下(默认是启用的),不在此允许范围内的域名就会被过滤,而不会进行爬取 但是有一个问题:像下面 ...

随机推荐

  1. 我的第一个flutter程序

    环境搭建好了之后,终于可以开始flutter的学习,废话少说先开始‘Hello World’. 创建好flutter项目之后,打开设备模拟器 打开之后 准备ok,开始编码 -------------- ...

  2. peewee 通俗易懂版

    Peewee作为Python ORM之一 优势:简单,小巧,易学习,使用直观 不足之处:需要手动创建数据库 基本使用流程 1⃣️根据需求定义好Model(表结构类) 2⃣️通过create_table ...

  3. 用Itextsharp 组件导出PDF 的文档的方法

    Itextsharp 是一个很强大,开源的,轻量级的 PDF 生成组件,官方网上好像没有相应的API 说明文档,以下是在工作中使用的心得与体会,并附上源码,功能包含了pdf 的创建,table 的创建 ...

  4. Docker笔记——jdk镜像制作

    openjdk镜像依赖如下: openjdk:8-jdk -> buildpack-deps:jessie-scm -> buildpack-deps:jessie-curl -> ...

  5. go 0000

    1,函数不能比较 函数默认都是值传递,  除了  map   值, slice (切片)  channel  (管道)   interface 默认以这4个默认 引用传递 两个 defer      ...

  6. Java Design Patterr

    Factory: ●简介: 工厂模式同单例模式一样,也是Java中最常用的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式.能够根据要求调用者提供的信息为接口指定不同的实现类,降低耦合. ...

  7. python 网站 监控返回值

    import requests try: code = requests.get("https://api.sudaizhijia.cm/").status_code print( ...

  8. 用户未登录或Session超时时重定向到登录页,不那么简单

    在网站开发中,我们经常有这样的场景出现: 情景1:对未登录的用户或没有权限的用户,当其想访问某个受限网页时,系统要能够自动转到登录页面.   情景2:对于用session保存用户状态的情况还有这样一种 ...

  9. 数据结构——串(KMP)

    空串:长度为0的串 空格串:由一个或多个空格组成的串 串常用的3种机内表示方法: 定长顺序存储表示: 用一组地址连续的存储单元存储串的字符序列,每一个串变量都有一个固定长度的存储区,可用定长数组来描述 ...

  10. Autowried注解和Resource注解的区别

    目录 1.概述 2.Autowried 3.Resource 4.总结 1.概述 在使用Spring框架的过程中, 依赖注入是必须的, 大多时候会使用Autowried注解来进行依赖注入, 但是也可以 ...