Scrapy Cloud spider请求因GeneratorExi而失败

2024-03-28 22:25:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脏兮兮的多级蜘蛛,在本地工作,但每次请求都会在云中返回GeneratorExit。在

以下是解析方法:

def parse(self, response):
    results = list(response.css(".list-group li a::attr(href)"))
    for c in results:
        meta = {}
        for key in response.meta.keys():
            meta[key] = response.meta[key]
        yield response.follow(c,
                              callback=self.parse_category,
                              meta=meta,
                              errback=self.errback_httpbin)

def parse_category(self, response):
    category_results = list(response.css(
        ".item a.link-unstyled::attr(href)"))
    category = response.css(".active [itemprop='title']")
    for r in category_results:
        meta = {}
        for key in response.meta.keys():
            meta[key] = response.meta[key]
        meta["category"] = category
        yield response.follow(r, callback=self.parse_item,
                              meta=meta,
                              errback=self.errback_httpbin)

def errback_httpbin(self, failure):
    # log all failures
    self.logger.error(repr(failure))

回溯如下:

^{pr2}$

我设置了一个errback,但它没有提供任何错误详细信息。另外,我在每个请求中都写了meta,但是没有任何区别。我错过什么了吗?在

更新: 这似乎是多级蜘蛛固有的错误。现在,我只用一个解析方法重写了这个。在


Tags: keyinselfforparseresponsedefcss
1条回答
网友
1楼 · 发布于 2024-03-28 22:25:43

其中一个differences between running a job locally and on Scrapy Cloud是启用了JOBDIR设置,这使得零碎的序列化请求成为磁盘队列而不是内存队列。在

序列化到磁盘时,Pickle操作失败,因为您的request.metadict包含一个SelectorList对象(在category = response.css(".active [itemprop='title']")行中分配),而选择器包含lxml.html.HtmlElement对象的实例(这些对象不能被Pickle,并且这个问题不在Scrapy范围内),因此TypeError: can't pickle HtmlElement objects。在

有一个merged pull request来解决这个问题。它不修复Pickle操作,它所做的是指示调度器它不应该尝试将这些请求序列化到磁盘上,而是将它们转移到内存中。在

相关问题 更多 >