在不访问 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'
。它实际上是传递蜘蛛相关数据的首选方法。
我有一个预打包的 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'
。它实际上是传递蜘蛛相关数据的首选方法。