Scrapy - TypeError:' Request'对象不可迭代

时间:2017-07-30 20:06:43

标签: python scrapy

我试图遍历从传递给scrapy请求的回调中返回的URL列表,但是我收到以下错误:

TypeError: 'Request' object is not iterable

以下作品。我可以看到所有提取的网址都在终端:

import scrapy

class PLSpider(scrapy.Spider):
    name = 'pl'
    start_urls = [ 'https://example.com' ]

    def genres(self, resp):
        for genre in resp.css('div.sub-menus a'):
            yield {
                'genre': genre.css('::text').extract_first(),
                'url': genre.css('::attr(href)').extract_first() 
            }

    def extractSamplePackURLs(self, resp):
        return {
            'packs': resp.css('h4.product-title a::attr(href)').extract()
        }

    def extractPackData(self, resp):
        return {
            'title': resp.css('h1.product-title::text'),
            'description': resp.css('div.single-product-description p').extract_first()
        }

    def parse(self, resp):
        for genre in self.genres(resp):
            samplePacks = scrapy.Request(genre['url'], callback=self.extractSamplePackURLs)
            yield samplePacks

但如果我将yield samplePacks行替换为:

    def parse(self, resp):
        for genre in self.genres(resp):
            samplePacks = scrapy.Request(genre['url'], callback=self.extractSamplePackURLs)
            for pack in samplePacks:
                yield pack

...我收到了上面发布的错误。

为什么会这样,我如何遍历回调的返回值?

1 个答案:

答案 0 :(得分:2)

Request回调中产生scrapy.Spider个对象只会告诉Scrapy框架将HTTP请求排入队列。它产生HTTP请求对象,就是这样。它不会立即下载它们。或者在下载之前给予控制权,即。在收益之后,你仍然没有结果。 Request对象不是承诺,期货,延期。 Scrapy的设计与各种异步框架的设计不同。

这些Request对象将最终由框架的下载程序处理,并且每个HTTP请求的响应正文将传递给关联的回调。 这是Scrapy异步编程模式的基础。

如果您想要执行更多“类似程序”的操作,yield request(...)在下次您拥有控制权时会获得HTTP响应,您可以查看https://github.com/rmax/scrapy-inline-requests/