【问题标题】:How can I sync data between Scrapy Parse Methods without using "meta"?如何在不使用“元”的情况下在 Scrapy Parse 方法之间同步数据?
【发布时间】:2020-09-11 17:46:45
【问题描述】:

我想使用其他方法而不是使用 meta,因为 meta 当前用于处理我的蜘蛛中的 302 响应。当我在此字典中添加额外的项目以同步数据时,302 响应被忽略

    def start_requests(self):
        for url in urls:
            self.rowExt = row
            yield scrapy.Request(
                url=url, callback=self.parse, dont_filter=True,
                meta={
                    'dont_redirect': True,
                    'handle_httpstatus_list': [302],
                }
            )

如果我在此字典中添加任何额外的项目,302 响应处理将不起作用。

    def start_requests(self):
        for url in urls:
            self.rowExt = row
            yield scrapy.Request(
                url=url, callback=self.parse, dont_filter=True,
                meta={
                    'dont_redirect': True,
                    'handle_httpstatus_list': [302],
                    'Name': name,
                    'Price': price,
                }
            )

【问题讨论】:

    标签: python web-scraping scrapy web-crawler


    【解决方案1】:

    如果你使用的是 Scrapy v1.7+ 可以使用cb_kwargs,用法有点类似。

        yield scrapy.Request(
            url=url, callback=self.parse, dont_filter=True,
            meta={
                'dont_redirect': True,
                'handle_httpstatus_list': [302],
            },
            cb_kwargs={
                'name': name,
                'price': price,
            }
        )
    
        def parse(self, response, name, price):
            ....
    

    请注意,传入cb_kwargs 的项目作为关键字参数传入回调函数,因此您需要相应地调整函数签名。

    【讨论】:

    • 非常感谢。
    • 没问题,如果我的回答解决了问题,请点击对勾接受。
    • 绝对值得记住关于在回调函数中作为关键字参数传递的这一点。当您在文档中阅读它时会错过它。
    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    相关资源
    最近更新 更多