前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python Scrapy框架之SpiderMiddleware中间件(爬虫))

Python Scrapy框架之SpiderMiddleware中间件(爬虫))

作者头像
Python知识大全
发布2020-02-13 14:54:22
7880
发布2020-02-13 14:54:22
举报
文章被收录于专栏:Python 知识大全Python 知识大全

2019

SpiderMid

Spider中间件是介入到Scrapy的spider处理机制的钩子框架,您可以添加代码来处理发送给 Spiders 的response及spider产生的item和request。

1 激活spider中间件

  • 要启用spider中间件,您可以将其加入到 SPIDER_MIDDLEWARES 设置中。该设置是一个字典,键位中间件的路径,值为中间件的顺序(order)。
  • 样例:
代码语言:javascript
复制
SPIDER_MIDDLEWARES = {
    'myproject.middlewares.CustomSpiderMiddleware': 543,
}
  • SPIDER_MIDDLEWARES 设置会与Scrapy定义的 SPIDER_MIDDLEWARES_BASE 设置合并(但不是覆盖), 而后根据顺序(order)进行排序,最后得到启用中间件的有序列表: 第一个中间件是最靠近引擎的,最后一个中间件是最靠近spider的。
  • 关于如何分配中间件的顺序请查看 SPIDER_MIDDLEWARES_BASE 设置,而后根据您想要放置中间件的位置选择一个值。由于每个中间件执行不同的动作,您的中间件可能会依赖于之前(或者之后)执行的中间件,因此顺序是很重要的。
  • 如果您想禁止内置的(在 SPIDER_MIDDLEWARES_BASE 中设置并默认启用的)中间件, 您必须在项目的 SPIDER_MIDDLEWARES 设置中定义该中间件,并将其值赋为 None 。例如,如果您想要关闭off-site中间件:
代码语言:javascript
复制
SPIDER_MIDDLEWARES = {
    'myproject.middlewares.CustomSpiderMiddleware': 543,
    'scrapy.contrib.spidermiddleware.offsite.OffsiteMiddleware': None,
}
  • 最后,请注意,有些中间件需要通过特定的设置来启用。更多内容请查看相关中间件文档。

2 编写您自己的spider中间件

  • 编写spider中间件十分简单。每个中间件组件是一个定义了以下一个或多个方法的Python类:
  • 来自类:class scrapy.contrib.spidermiddleware.SpiderMiddleware
process_spider_input(response, spider)
代码语言:javascript
复制
当response通过spider中间件时,该方法被调用,处理该response。

`process_spider_input()` 应该返回 None 或者抛出一个异常。

如果其返回 None ,Scrapy将会继续处理该response,调用所有其他的中间件直到spider处理该response。

如果其跑出一个异常(exception),Scrapy将不会调用任何其他中间件的 process_spider_input() 方法,并调用request的errback。errback的输出将会以另一个方向被重新输入到中间件链中,使用 process_spider_output() 方法来处理,当其抛出异常时则带调用 process_spider_exception() 。

参数:
response (Response 对象) – 被处理的response
spider (Spider 对象) – 该response对应的spider
process_spider_output(response, result, spider)
代码语言:javascript
复制
当Spider处理response返回result时,该方法被调用。

`process_spider_output()` 必须返回包含 Request 或 Item 对象的可迭代对象(iterable)。

参数:
response (Response 对象) – 生成该输出的response
result (包含 Request 或 Item 对象的可迭代对象(iterable)) – spider返回的result
spider (Spider 对象) – 其结果被处理的spider
process_spider_exception(response, exception, spider)
代码语言:javascript
复制
当spider或(其他spider中间件的) process_spider_input() 跑出异常时, 该方法被调用。

`process_spider_exception()` 必须要么返回 None , 要么返回一个包含 Response 或 Item 对象的可迭代对象(iterable)。

如果其返回 None ,Scrapy将继续处理该异常,调用中间件链中的其他中间件的 process_spider_exception() 方法,直到所有中间件都被调用,该异常到达引擎(异常将被记录并被忽略)。

如果其返回一个可迭代对象,则中间件链的 process_spider_output() 方法被调用, 其他的 process_spider_exception() 将不会被调用。

参数:
response (Response 对象) – 异常被抛出时被处理的response
exception (Exception 对象) – 被跑出的异常
spider (Spider 对象) – 抛出该异常的spider
process_start_requests(start_requests, spider)
代码语言:javascript
复制
0.15 新版功能.

该方法以spider 启动的request为参数被调用,执行的过程类似于 process_spider_output() ,只不过其没有相关联的response并且必须返回request(不是item)。

其接受一个可迭代的对象(start_requests 参数)且必须返回另一个包含 Request 对象的可迭代对象。

注解

当在您的spider中间件实现该方法时, 您必须返回一个可迭代对象(类似于参数start_requests)且不要遍历所有的 start_requests。该迭代器会很大(甚至是无限),进而导致内存溢出。Scrapy引擎在其具有能力处理start request时将会拉起request, 因此start request迭代器会变得无限,而由其他参数来停止spider( 例如时间限制或者item/page记数)。

参数:
start_requests (包含 Request 的可迭代对象) – start requests
spider (Spider 对象) – start requests所属的spider

Scrapy框架的配置Settings

  • Scrapy设置(settings)提供了定制Scrapy组件的方法。可以控制包括核心(core),插件(extension),pipeline及spider组件。
  • 参考文档:http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/settings.html#topics-settings-ref

内置设置参考手册

  • BOT_NAME
    • 默认: 'scrapybot'
    • 当您使用 startproject 命令创建项目时其也被自动赋值。
  • CONCURRENT_ITEMS
    • 默认: 100
    • Item Processor(即 Item Pipeline) 同时处理(每个response的)item的最大值。
  • CONCURRENT_REQUESTS
    • 默认: 16
    • Scrapy downloader 并发请求(concurrent requests)的最大值。
  • DEFAULT_REQUEST_HEADERS
    • 默认: 如下 { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', }
    • Scrapy HTTP Request使用的默认header。
  • DEPTH_LIMIT
    • 默认: 0
    • 爬取网站最大允许的深度(depth)值。如果为0,则没有限制。
  • DOWNLOAD_DELAY
    • 默认: 0
    • 下载器在下载同一个网站下一个页面前需要等待的时间。该选项可以用来限制爬取速度, 减轻服务器压力。同时也支持小数:
  • DOWNLOAD_DELAY = 0.25 # 250 ms of delay
    • 默认情况下,Scrapy在两个请求间不等待一个固定的值, 而是使用0.5到1.5之间的一个随机值 * DOWNLOAD_DELAY 的结果作为等待间隔。
  • DOWNLOAD_TIMEOUT
    • 默认: 180
    • 下载器超时时间(单位: 秒)。
  • ITEM_PIPELINES
    • 默认: {}
    • 保存项目中启用的pipeline及其顺序的字典。该字典默认为空,值(value)任意,不过值(value)习惯设置在0-1000范围内,值越小优先级越高。 ITEM_PIPELINES = { 'mySpider.pipelines.SomethingPipeline': 300, 'mySpider.pipelines.ItcastJsonPipeline': 800, }
  • LOG_ENABLED
    • 默认: True
    • 是否启用logging。
  • LOG_ENCODING
    • 默认: 'utf-8'
    • logging使用的编码。
  • LOG_LEVEL
    • 默认: 'DEBUG'
    • log的最低级别。可选的级别有: CRITICAL、 ERROR、WARNING、INFO、DEBUG 。
  • USER_AGENT
    • 默认: "Scrapy/VERSION (+http://scrapy.org)"
    • 爬取的默认User-Agent,除非被覆盖。
  • PROXIES: 代理设置
    • 示例: PROXIES = [ {'ip_port': '111.11.228.75:80', 'password': ''}, {'ip_port': '120.198.243.22:80', 'password': ''}, {'ip_port': '111.8.60.9:8123', 'password': ''}, {'ip_port': '101.71.27.120:80', 'password': ''}, {'ip_port': '122.96.59.104:80', 'password': ''}, {'ip_port': '122.224.249.122:8088', 'password':''}, ]
  • COOKIES_ENABLED = False
    • 禁用Cookies

END

岁月有你 惜惜相处

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python 知识大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 激活spider中间件
  • 2 编写您自己的spider中间件
    • process_spider_input(response, spider)
      • process_spider_output(response, result, spider)
        • process_spider_exception(response, exception, spider)
          • process_start_requests(start_requests, spider)
          • Scrapy框架的配置Settings
            • 内置设置参考手册
            相关产品与服务
            消息队列 TDMQ
            消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档