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构造器的默认值

    
    
    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    Postgresql HStore 插件试用小结
    postgres-xl 安装与部署 【异常处理】ERROR: could not open file (null)/STDIN_***_0 for write, No such file or directory
    GPDB 5.x PSQL Quick Reference
    postgresql 数据库schema 复制
    hive 打印日志
    gp与 pg 查询进程
    jquery table 发送两次请求 解惑
    python 字符串拼接效率打脸帖
    postgresql 日期类型处理实践
    IBM Rational Rose软件下载以及全破解方法
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/15423400.html
Copyright © 2011-2022 走看看