我试图遍历从传递给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
...我收到了上面发布的错误。
为什么会这样,我如何遍历回调的返回值?
答案 0 :(得分:2)
在Request
回调中产生scrapy.Spider
个对象只会告诉Scrapy框架将HTTP请求排入队列。它产生HTTP请求对象,就是这样。它不会立即下载它们。或者在下载之前给予控制权,即。在收益之后,你仍然没有结果。 Request
对象不是承诺,期货,延期。 Scrapy的设计与各种异步框架的设计不同。
这些Request
对象将最终由框架的下载程序处理,并且每个HTTP请求的响应正文将传递给关联的回调。
这是Scrapy异步编程模式的基础。
如果您想要执行更多“类似程序”的操作,yield request(...)
在下次您拥有控制权时会获得HTTP响应,您可以查看https://github.com/rmax/scrapy-inline-requests/。