Scrapy是一个灵活的框架,你可以通过设置中间件和扩展来扩展其功能。在这个章节中,我们将深入了解Scrapy的中间件和扩展,并通过示例来解释它们的使用。

1. 中间件 (Middleware)

中间件是Scrapy用来处理引擎和下载器之间的请求和响应的插件。有两种类型的中间件:

  • 下载器中间件 (Downloader Middleware):处理引擎和下载器之间的请求/响应。
  • 爬虫中间件 (Spider Middleware):处理爬虫和引擎之间的请求/响应/Item。

中间件的主要用途包括处理请求头,处理请求重定向,重试失败的请求,限制并发请求等。

以下是一个简单的下载器中间件示例,该中间件会在每个请求的头信息中添加一个自定义字段:

python

Copy

class CustomHeaderMiddleware(object):
    def process_request(self, request, spider):
        request.headers['Custom-Header'] = 'Custom Value'
        return None

为了启用这个中间件,你需要把它添加到你的DOWNLOADER_MIDDLEWARES设置中:

python

Copy

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomHeaderMiddleware': 1,
}

2. 扩展 (Extension)

扩展是Scrapy的一个可插入组件,用于扩展Scrapy功能。扩展是全局级别的,当Scrapy启动时,扩展就被加载,并且在整个爬虫过程中都是活跃的。

扩展的用途包括发送电子邮件通知,收集爬虫统计信息,处理信号等。

以下是一个简单的扩展示例,该扩展会在每次爬虫启动和关闭时打印一条消息:

python

Copy

from scrapy import signals

class SpiderOpenCloseLogging(object):
    def __init__(self, crawler):
        self.crawler = crawler
        crawler.signals.connect(self.spider_opened, signal=signals.spider_opened)
        crawler.signals.connect(self.spider_closed, signal=signals.spider_closed)

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def spider_opened(self, spider):
        self.crawler.stats.set_value('start_time', datetime.now())

    def spider_closed(self, spider):
        self.crawler.stats.set_value('stop_time', datetime.now())

为了启用这个扩展,你需要把它添加到你的EXTENSIONS设置中:

python

Copy

EXTENSIONS = {
    'myproject.extensions.SpiderOpenCloseLogging': 1,
}

以上就是Scrapy的中间件和扩展的基本介绍。希望这些信息能帮助你更好地理解Scrapy框架的工作原理,以便你可以更有效地使用它来完成你的爬虫项目。
推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

file


移动安全星球
1 声望2 粉丝