【问题标题】:How return items from a custom spider middleware如何从自定义蜘蛛中间件返回项目
【发布时间】:2013-04-09 12:02:30
【问题描述】:

我从 OffsiteMiddleware 创建了我的自定义 SpiderMiddleware。从原始类中简单复制和粘贴,也许它存在更好的方法。

我会收集过滤后的异地域。 我的管道有效。

但我不知道如何将项目返回到我的管道。

感谢您的帮助。

def process_spider_output(self, response, result, spider):
    items = []
    for x in result:
        if isinstance(x, Request):
            if x.dont_filter or self.should_follow(x, spider):
                yield x
            else:
                domain = urlparse_cached(x).hostname
                if domain and domain not in self.domains_seen[spider]:
                    self.domains_seen[spider].add(domain)
                    # ***My items ===> items.append(OutboundsLinks(url = domain))***
        else:
            yield x

【问题讨论】:

    标签: python scrapy middleware


    【解决方案1】:

    process_spider_output() 必须返回一个可迭代的 Request 或 Item 对象。

    def process_spider_output(self, response, result, spider):
        items = []
        for x in result:
            if isinstance(x, Request):
                if x.dont_filter or self.should_follow(x, spider):
                    yield x
                else:
                    domain = urlparse_cached(x).hostname
                    if domain and domain not in self.domains_seen[spider]:
                        self.domains_seen[spider].add(domain)
                        # create an item here and yield it 
            else:
                yield x
    

    【讨论】:

    • 您好,谢谢您的帮助。我刚刚生成了一个 BaseItem,而不是我的代码中的列表。我是 python 的菜鸟,我不太了解 return 与 yield 的区别。对于相同的结果,是否有比我的代码更好的解决方案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2020-06-03
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多