3

我正在尝试创建一个请求,并且之前一直在我的蜘蛛类中传递一个函数作为回调。但是,我已经将该函数移到了 Item 子类,因为我希望有不同类型的 Items 并且每种项目的回调可能不同(例如,此时我将提出 DropItem 如果内容类型与预期不符,并且每种类型的项目都有一组不同的有效 MIME 类型)。所以,我想知道的是我可以从我的 Item 子类中传递一个函数作为回调参数吗?基本上是这样的:

item = MyCustomItem()  # Extends scrapy.item.Item
# bunch of code here...
req = Request(urlparse.urljoin(response.url, url), method="HEAD", callback=item.parse_resource_metadata)

暂时item.parse_resource_metadata没有接到电话。印刷req.callback

<bound method ZipResource.parse_resource_metadata of {(correct data for this Item object}>

所以它至少像我希望的那样构建请求。

[编辑] 过失,回调没有被调用,因为开始页面没有被抓取(我不得不覆盖parse_start_url()。但事实证明我做错了,我问的太好了!

4

1 回答 1

3

从理论上讲,它是可行的,因为callback它只是一个具有responseas 参数的可调用对象。

虽然,Items 只是字段的容器,但它们是用于存储数据的,你不应该在其中放置逻辑

最好在蜘蛛中创建一个方法并在里面传递item实例meta

def parse(self, response):
    ...
    item = MyCustomItem()
    ...
    yield Request(urlparse.urljoin(response.url, url), 
                  method="HEAD", 
                  meta={'item': item},
                  callback=self.my_callback)

def my_callback(self, response):
    item = response.meta['item']
    ...

我不完全确定您要实现什么,但您也可以仔细看看Item Loadersand Input and Output Processors

于 2014-12-23T00:58:26.670 回答