在不访问 Request/Response 循环的情况下将数据传递给信号回调

Passing data to signal callbacks without access to the Request/Response cycle

我有一个预打包的 Scrapy 蜘蛛和管道,想在现有的 Twisted 应用程序中使用它,但我需要将附加信息(单个字符串)传递给 item_scraped signal. For example purposes, I've written a script that summarizes what I've tried so far that uses the dirbot 示例的接收者包裹:

 #!/usr/bin/env python2
 from dirbot import settings as dbs
 from dirbot.spiders.dmoz import DmozSpider
 from functools import partial
 from scrapy import signals, log
 from scrapy.crawler import Crawler
 from scrapy.settings import Settings
 from twisted.internet import reactor


 # ---------------
 # This gets called
 # def item_scraped(item, response, spider):
 #     return item
 # ---------------


 # ------------
 # This does, but the signal dispatching system raises an exception:
 # exceptions.ValueError: unknown receiver type <functools.partial object at 0x7fa59c4d11b0> <type 'functools.partial'>
 def foo(something, item, response, spider):
     1/0

 # item_scraped = partial(foo, 1)
 # ------------


 def bla():
     something = 0  # noqa

     # -----------------
     # This doesn't
     def item_scraped(item, response, spider):
         1/something
     # -----------------

     log.start()
     settings = Settings()
     settings.setmodule(dbs)
     spider = DmozSpider()
     crawler = Crawler(settings)

     crawler.signals.connect(item_scraped,
                             signal=signals.item_scraped)
     crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
     crawler.configure()
     crawler.crawl(spider)
     return crawler.start()

 reactor.callWhenRunning(bla)
 reactor.run()

如您所见,让 Scrapys 信号系统调用我的回调的唯一方法是使它成为一个非部分的、模块级可访问的函数,我看不出如何在没有的情况下将额外的数据传递给它将该数据放入一个全局变量中(这一切都在幕后使用了 Twisted,bla 本身就是对其他东西的回调,因此全局变量方法可能会非常快速地涉及大量锁定)。

/edit 因为似乎有点不清楚我要做什么: item_scraped 回调应该从接收到的项目中获取一些数据并对其进行处理,在我的例子中将其发送到 IRC 频道(因此我示例中的变量 something 将是IRC 频道和 item_scraped 回调需要访问该频道才能将其发送到正确的频道)。

我不能说我完全理解你想做什么,但既然 spider 到处传递,你为什么不将你的附加信息设置为该对象的属性?喜欢spider.mystuff = 'some_data'。它实际上是传递蜘蛛相关数据的首选方法。