zoukankan      html  css  js  c++  java
  • scrapy中的配置与中间件

    Scrapy框架有两个主要的对象Reques与Response,他们贯穿在爬虫的始终,最终爬虫通过他们将数据串联起来。


    Request对象是在Spider中生成,包含HTTP请求信息,在框架中经过一系列传递、处理,最终达到Downloader下载器,下载器执行Request中的请求进行数据抓取,将生成的响应包装成一个Response对象,在经过传送处理,最终返回到发送Request的Spider中。

    爬虫Spider中间件是用来处理Response响应的,而Downloader中间件是用来处理Request请求的。

    激活中间件:启用Spider中间件时,需要将其加入SPIDER_MIDDLEWARES设置中。该设置位于settings.py文件中,是字典类型对的,其中键为中间件的路径,值为中间件的顺序。
    启用中间件的有序列表:
    第一个中间件是最靠近引擎的,最后一个中间件是最靠近Spider的。
    一般自定义中间件在500-700之间最为妥当。
    如果要禁用中间件,可以将中间件的值赋为None,键还是中间件的路径,修改的是中间件的顺序。

    编写Spider中间件

    中间件与管道类似,每个中间件组件都实现了以下一个或多个方法的Python类。
    1.process_spider_input(response,spider)
    说明:
    当参数response通过参数spider中间件时,该方法被调用,处理该rsponse,即在下载器中间件处理完成后,马上要进入某个回调函数parse_xx()前被调用。
    参数:
    response(Response对象):被处理的Response
    spider(Spider对象):该Response对应的Spider
    返回值:
    该方法返回一个None或者抛出一个异常。如果其返回None,Scrapy江会继续处理该Response,调用所有其他的中间件直到Spider处理该Response。如果其抛出一个异常,Scrapy将不会调用其他中间件的process_spider_input()方法,而是调用Request的errback。errback的输出将会从另一个方向被重新输入中间件链中,使用process_spider_output()方法来处理,当期抛出异常时调用procrss_spider_execption().

    process_spider_output(response,result,spider)

    当Spider处理完毕Response返回result时,即在爬虫运行yield item或者yield scrapy.Request()的时候调用该方法

    这些因该都是内置的中间件方法

    ,好像不是,是要自己模仿这样写

    process_spider_exception(response,exception,spider)

    说明:当spider或其他spider中间件的process_spider_input()抛出异常时,该方法被调用。
    参数:
    response:异常抛出时处理的Response
    exception:抛出异常
    spider:抛出异常的Spider
    返回值:
    该方法必须返回一个None或者一个包含Response或Item对象的可迭代对象(iterable)
    如果返回None,Scrapy将继续处理该异常,调用中间件链中的其他中间件的process_spider_exception()方法,直到所有中间件都被调用,该异常到达引擎(异常将被记录并被忽略)
    如果其返回一个可迭代对象,那么中间件链的process_spider_output()方法将被调用,其他的中间件的process_spider_exception()将不会被调用。

    process_start_request(start_request,spider)

    说明:
    该方法以Spider启动的Request为参数被调用
    参数
    start_request(包含Request的可迭代对象):start request列表
    spider(Spider对象):启动start request的Spider
    返回值:
    该方法接收的是一个可迭代对象(start_requests参数),而且必须返回一个包含Request对象的可迭代对象。

    Spider内置中间件

    Spider已经内置了一些可以辅助爬取的中间件,通过这些中间件的启用、配置可以方便的进行爬虫的优化,提高爬取成功功率与效率。

    DepthMiddleware爬取深度中间件

    作用:他是一个用于追踪被爬取网站中每个Request的爬取深度的中间件。深度是start_urls中定义URL的相对值,也就是相对URL的深度。
    他可用于限制爬取的最大深度,并根据深度控制请求优先级等。

    HttpErrorMiddleware失败请求处理中间件

    作用:
    过滤出所有失败的HTTP Response,爬虫不需要消耗更多的资源,设置更为复杂的逻辑来处理这些异常Request。根据HTTP标准,返回值在200-300的为成功的Response.
    如果想处理在这个范围之外的Response,可以通过Spider的handler_httpstatus_list属性或HTTPERROR_ALLOWED_CODES设置来指定Spider能处理的Response返回值。
    当然,除非必要且目的明确,否则不推荐处理非200状态码的响应。

    OffsiteMiddleware过滤请求中间件

    RefererMiddleware参考位置中间件

    UrlLengthMiddleware网址长度限制中间件

    下载器内置中间件

    CookiesMiddleware

    作用:
    该中间件可以使用Cookie爬取网站数据。记录了向Web Server发送的Cookie,并在之后的Request请求中发送回去,就像操作浏览器一样。
    很有用的一点是,每个住址爬虫可以保存多个cookies,只需要为Request.meta指定cookiejar值。

    HttpProxyMiddleware

    作用:
    此中间件可以通过在Request,meta中添加proxy属性值为该请求设置HTTP代理,默认获取代理的方式是通过以下环境变量来获取代理地址:
    http_proxy
    https_proxy
    no_proxy
    在settings.py中的设置:
    HTTPPROXY_ENABLED:默认为False,表示是否激活HttpProxyMiddleware
    HTTPPROXY_AUTH_ENCODING:代理有验证时的账户信息编码方式。

    Scrapy基本配置

    命令行选项优先级最高

    每个爬虫内置配置

    custom_setting可以为某些爬虫定制不同的配置,写在spider中,该变量为一个字典

    项目设置模块

    通过scrapy startproject命令创建项目后,都会生成一个settings.py文件,该文件就是该项目的配置文件。

    # Scrapy settings for test1 project
    #
    # For simplicity, this file contains only settings considered important or
    # commonly used. You can find more settings consulting the documentation:
    #
    #     https://docs.scrapy.org/en/latest/topics/settings.html
    #     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
    #     https://docs.scrapy.org/en/latest/topics/spider-middleware.html
    # Scrapy项目名字
    BOT_NAME = 'test1'
    
    SPIDER_MODULES = ['test1.spiders']
    NEWSPIDER_MODULE = 'test1.spiders'
    # 注销的都是后面加的,就是项目需要他时,他在启用
    # 使用Scrapy搜索spider的模块列表
    # SPIDER_MODULES = ['segementfault.spiders']
    # 使用爬虫创建命令genspider创建爬虫时生成的模块
    # NEWSPIDER_MODULE = 'segementfault.spiders'
    # Crawl responsibly by identifying yourself (and your website) on the user-agent
    # 默认的USER_AGENT,私用BOT_NAME配置生成,建议覆盖
    #USER_AGENT = 'test1 (+http://www.yourdomain.com)'
    
    # Obey robots.txt rules
    # 如果启用,Scrapy则会遵守网站Rebots.txt协议,建议设置为False.
    ROBOTSTXT_OBEY = False
    
    # Configure maximum concurrent requests performed by Scrapy (default: 16)
    # 配置Scrapy最大并发数,默认为32,一般需要增大设置
    #CONCURRENT_REQUESTS = 32
    
    # Configure a delay for requests for the same website (default: 0)
    # See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
    # See also autothrottle settings and docs
    # 为同一个站点设置下载延迟
    #DOWNLOAD_DELAY = 3
    # The download delay setting will honor only one of:
    # 下载延迟的设置只会根据以下两个中的一个生效
    # 对单个网站设置最大的请求并发数
    #CONCURRENT_REQUESTS_PER_DOMAIN = 16
    # 对单个IP设置最大的请求并发数
    #CONCURRENT_REQUESTS_PER_IP = 16
    
    # Disable cookies (enabled by default)
    # 禁用Cookie,默认True启用,建议为False
    #COOKIES_ENABLED = False
    
    # Disable Telnet Console (enabled by default)
    # 关闭Telent控制台,默认启用
    #TELNETCONSOLE_ENABLED = False
    
    # Override the default request headers:
    # 默认的请求头,根据爬取网站覆盖
    #DEFAULT_REQUEST_HEADERS = {
    #   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    #   'Accept-Language': 'en',
    #}
    
    # Enable or disable spider middlewares
    # See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
    # 启用Spider爬虫中间件
    #SPIDER_MIDDLEWARES = {
    #    'test1.middlewares.Test1SpiderMiddleware': 543,
    #}
    
    # Enable or disable downloader middlewares
    # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
    # 启用Download下载器中间件
    #DOWNLOADER_MIDDLEWARES = {
    #    'test1.middlewares.Test1DownloaderMiddleware': 543,
    #}
    
    # Enable or disable extensions
    # See https://docs.scrapy.org/en/latest/topics/extensions.html
    # 启用扩展
    #EXTENSIONS = {
    #    'scrapy.extensions.telnet.TelnetConsole': None,
    #}
    
    # Configure item pipelines
    # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
    # 配置管道信息
    #ITEM_PIPELINES = {
    #    'test1.pipelines.Test1Pipeline': 300,
    #}
    
    # Enable and configure the AutoThrottle extension (disabled by default)
    # See https://docs.scrapy.org/en/latest/topics/autothrottle.html
    # 启用配置AutoThrottle扩展,默认禁用,建议启用
    #AUTOTHROTTLE_ENABLED = True
    # The initial download delay
    # 初始化下载延迟
    #AUTOTHROTTLE_START_DELAY = 5
    # The maximum download delay to be set in case of high latencies
    # 高延迟下最大的下载延迟
    #AUTOTHROTTLE_MAX_DELAY = 60
    # The average number of requests Scrapy should be sending in parallel to
    # each remote server
    # Scrapy请求应该并行发送每个远程服务器的平均数量
    #AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
    # Enable showing throttling stats for every response received:
    # 启用调试模式,设计每一个响应状态数据
    #AUTOTHROTTLE_DEBUG = False
    
    # 启用和配置HTTP缓存
    # Enable and configure HTTP caching (disabled by default)
    # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
    #HTTPCACHE_ENABLED = True
    # HTTP缓存过期时间
    #HTTPCACHE_EXPIRATION_SECS = 0
    # HTTP缓存目录
    #HTTPCACHE_DIR = 'httpcache'
    # HTTP缓存忽略的响应状态码
    #HTTPCACHE_IGNORE_HTTP_CODES = []
    # HTTP缓存存储目录
    #HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
    
    

    当我们编写完管道、中间件,使用扩展时,一定要在settings.py中启用,才能够正常使用。

    默认的命令行配置

    在项目中使用,默认的配置为项目配置

    >scrapy settings --get BOT_NAME
    scrapybot
    

    在项目外使用命令行时,默认使用Scrapy全局配置

    import scrapy
    >scrapy settings --get BOT_NAME
    scrapybot
    

    默认全局配置(优先级最低)

    Scrapy默认全局配置是所有配置信息的基础,每种配置都是在此基础上进行覆盖的。

    日志

    Scrapy使用Python内置的日志系统记录事件日志,在使用日志功能之前还需进行一些配置。

    LOG_FILE:指定日志文件,如果为None,就是用标准错误输出。
    LOG_ENABLED:是否启用日志,为True时启用日志,为False时不启用
    LOG_ENCODING:使用指定的编码方式输出日志,默认为UTF-8
    LOG_LEVEL:日志记录的最低级别,可选的级别还有CRITICAL、ERROR、WARNING、INFO、DEBUG。默认为DEBUG,打印所有记录
    LOG_FORMAT:日志输出格式,默认为'%(asctime)s[%(name)s]%(levelname)s:%(message)s'
    LOG_DATEFORMAT:日志日期记录格式,默认格式为"%Y_%m%d%H:%M:%S"
    LOG_STDOUT:默认为False,如果为True,那么表示进程所有的标准输出(及错误)将被重定向到log中。例如执行print 'hello',其将会在Scrapy log中显示。
    

    数据收集

    scrapy数据收集有哪些作用,可以方便的统计一些特殊信息,包括一些指令数据的统计,比如特定的关键字、404页面等。Scrapy提供的这种收集数据机制叫做Stats Collection.
    数据收集器对每个Spider保持一个状态表。当Spider启动时,该表自动打开,当Spider关闭时,该表自动关闭。

    Scrapy常用服务

    发送邮件

    有两种方法可以创建邮件发送其(Mail Sender)。可以通过标准构造器(Constructor)创建。

    from scrapy.mail import MailSender
    mailer= MailSender()
    

    或者通过传递一个Scrapy设置对象,通过settings配置创建:
    mailer = MailSender.from_settings(settings)
    再使用send()方法来发送邮件(不包括附件)

    mailer.send(to=["someone@example.com"],subject="Some subject",body="Some body",cc=["another@example.com"])
    

    MailSender类介绍

    在settings.py中对Mail进行设置

    settings.py中的设置定义了MailSender构造器的默认值

    
    
    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    从头认识java-2.6 逗号操作符
    JavaScript基础知识
    特性选择器
    文本缩进
    如何使图片与导航栏对齐
    如何使用CSS选择器应用于子元素
    图像
    布局
    列表,表格和表单
    盒子
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/15423400.html
Copyright © 2011-2022 走看看