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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。