爬虫蜘蛛Scrapy如何使用信号Signals API延迟信号处理程序?(69)python Scrapy教程1.51以上版本
Scrapy广泛使用信号来通知特定事件发生的时间。您可以在Scrapy项目中捕获一些这些信号(例如使用扩展名)来执行其他任务或扩展Scrapy以添加未提供的开箱即用的功能。
即使信号提供了几个参数,捕获它们的处理程序也不需要接受所有这些参数 – 信号调度机制只会传递处理程序接收的参数。
您可以通过Signals API连接信号(或发送您自己的 信号)。
这是一个简单的示例,展示了如何捕获信号并执行某些操作:
from scrapy import signals
from scrapy import Spider
class DmozSpider(Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/",
]
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
spider = super(DmozSpider, cls).from_crawler(crawler, *args, **kwargs)
crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed)
return spider
def spider_closed(self, spider):
spider.logger.info('Spider closed: %s', spider.name)
def parse(self, response):
pass
内置信号参考
这是Scrapy内置信号列表及其含义。
engine_started
scrapy.signals.
engine_started()
- Scrapy引擎开始爬网时发送。
此信号支持从其处理程序返回延迟。
注意
这个信号可能被解雇后的spider_opened
信号,这取决于蜘蛛是如何开始。因此,不要依赖此信号之前被解雇spider_opened
。
engine_stopped
scrapy.signals.
engine_stopped()
- Scrapy引擎停止时发送(例如,爬网过程完成时)。
此信号支持从其处理程序返回延迟。
item_dropped
scrapy.signals.
itemitem_dropped(
response,
exception,
spider,
)
- 在某个阶段引发异常时,从项目管道中删除项目后发送
DropItem
。此信号支持从其处理程序返回延迟。
参数:
spider_closed
scrapy.signals.
spiderspider_closed(
reason,
)
- 蜘蛛关闭后发送。这可用于释放保留的每蜘蛛资源
spider_opened
。此信号支持从其处理程序返回延迟。
参数: - spider (
Spider
object) – 已经关闭的蜘蛛 - reason (str) – 描述蜘蛛关闭原因的字符串。如果由于蜘蛛完成刮擦而关闭,原因是
'finished'
。否则,如果通过调用close_spider
引擎方法手动关闭了spider ,那么原因是在该reason
方法的参数中传递的那个(默认为'cancelled'
)。如果引擎关闭(例如,通过按Ctrl-C来停止它),原因就是'shutdown'
。
- spider (
spider_opened
scrapy.signals.
spiderspider_opened(
)
- 在蜘蛛打开爬行后发送。这通常用于保留每个蜘蛛资源,但可用于打开蜘蛛时需要执行的任何任务。
此信号支持从其处理程序返回延迟。
参数: spider ( Spider
object) – 已经打开的蜘蛛
spider_idle
scrapy.signals.
spiderspider_idle(
)
- 当蜘蛛闲置时发送,这意味着蜘蛛没有进一步:
- 请求等待下载
- 请求预定
- 项目管道中正在处理的项目
如果在此信号的所有处理程序完成后空闲状态仍然存在,则引擎开始关闭蜘蛛。蜘蛛完成关闭后,
spider_closed
信号被发送。您可以引发
DontCloseSpider
异常以防止蜘蛛被关闭。此信号不支持从其处理程序返回延迟。
参数: spider ( Spider
object) – 已经空闲的蜘蛛
注意
在spider_idle
处理程序中调度某些请求并 不能保证它可以阻止蜘蛛被关闭,尽管它有时可以。这是因为如果调度程序拒绝所有调度的请求(例如,由于重复而过滤),则蜘蛛可能仍然保持空闲。
spider_error
request_scheduled
request_dropped
scrapy.signals.
requestrequest_dropped(
spider,
)
- 当
Request
稍后要下载的引擎调度的a 被调度程序拒绝时发送。该信号不支持从其处理程序返回延迟。
参数: - request (
Request
object) – 到达调度程序的请求 - spider(
Spider
object) – 产生请求的蜘蛛
- request (
response_received
scrapy.signals.
responseresponse_received(
request,
spider,
)
- 当引擎
Response
从下载程序收到新内容时发送。此信号不支持从其处理程序返回延迟。
参数: - response (
Response
object) – 收到的响应 - request (
Request
object) – 生成响应的请求 - spider (
Spider
object) – 响应所针对的蜘蛛
- response (
response_downloaded
scrapy.signals.
responseresponse_downloaded(
request,
spider,
)
- 下载后立即由下载程序发送
HTTPResponse
。此信号不支持从其处理程序返回延迟。
参数: - response (
Response
object) – 下载的响应 - request(
Request
object) – 生成响应的请求 - spider(
Spider
object) – 响应所针对的蜘蛛
- response (