我有一个脏兮兮的多级蜘蛛,在本地工作,但每次请求都会在云中返回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,但是没有任何区别。我错过什么了吗?在
更新: 这似乎是多级蜘蛛固有的错误。现在,我只用一个解析方法重写了这个。在
其中一个differences between running a job locally and on Scrapy Cloud是启用了JOBDIR设置,这使得零碎的序列化请求成为磁盘队列而不是内存队列。在
序列化到磁盘时,Pickle操作失败,因为您的
request.meta
dict包含一个SelectorList
对象(在category = response.css(".active [itemprop='title']")
行中分配),而选择器包含lxml.html.HtmlElement
对象的实例(这些对象不能被Pickle,并且这个问题不在Scrapy范围内),因此TypeError: can't pickle HtmlElement objects
。在有一个merged pull request来解决这个问题。它不修复Pickle操作,它所做的是指示调度器它不应该尝试将这些请求序列化到磁盘上,而是将它们转移到内存中。在
相关问题 更多 >
编程相关推荐