【问题标题】:Can I specify any method as the callback when constructing a Scrapy Request object?构造 Scrapy Request 对象时可以指定任何方法作为回调吗?
【发布时间】:2014-12-23 00:54:15
【问题描述】:

我正在尝试创建一个请求,并且之前在我的蜘蛛类中传递了一个函数作为回调。但是,我已经将该函数移到了 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}>

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

[edit] 过失,回调没有被调用,因为起始页没有被抓取(我不得不覆盖parse_start_url()。但结果我做错了,我问的太好了!

【问题讨论】:

    标签: python callback web-scraping scrapy scrapy-spider


    【解决方案1】:

    理论上,这是可行的,因为 callback 只是一个以 response 为参数的可调用对象。

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

    最好在spider中创建一个方法和pass the item instance inside 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 LoadersInput and Output Processors

    【讨论】:

    • 谢谢,我没有意识到它们应该是容器。我有一个扩展 Item 的 UrlResource 类。我将避免在我的 Item 子类中使用函数,但是 Item 子类可以具有类属性吗? edit(字段除外)
    • @false_azure 谢谢你,你能展示一下UrlResource 的实现吗?
    • 如果有帮助,我可以发布代码,但它只是一个带有一些字段的 Item 子类(现在我已经去掉了回调函数)。
    • @false_azure 好吧,理论上应该是这样的:spider 具有从响应中提取数据、使用数据实例化项目、调用项目加载器等所有逻辑。美化和编辑数据的逻辑应该在项目加载器和输入和输出处理器内部。然后,管道用于将项目存储在数据库中。这就是我的结构。我一直将项目作为基于包含FieldsItem 的简单类。另见doc.scrapy.org/en/0.22/topics/architecture.html。希望对您有所帮助。
    • 谢谢,这很有帮助。我应该读过架构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多