繁体   English   中英

Scrapy中对单个字段的多个请求

[英]Multiple Request to Single Field in Scrapy

我正在尝试使用Scrapy抓取一个网站。 示例链接是: 这里 我可以使用CSS选择器获取一些数据。 我还需要获取每个项目的所有图像网址。 现在,一个项目可以具有多种颜色。 当我们单击另一种颜色时,它实际上是从浏览器中的另一个URL获取图像。 因此,我需要生成手动请求(由于多种颜色),并附加“元”以将来自其他网址的图像网址存储到单个项目字段中

这是我的Scrapy代码:

def get_image_urls(self, response):
    item = response.meta['item']
    if 'image_urls' in item:
        urls = item['image_urls']
    else:
        urls = []
    urls.extend(response.css('.product-image-link::attr(href)').extract())
    item['image_urls'] = urls
    next_url = response.css('.va-color .emptyswatch a::attr(href)').extract()
    #print(item['image_urls'])
    yield Request(next_url[0], callback=self.get_image_urls, meta={'item': item})

def parse(self, response):
    output = JulesProduct()
    output['name'] = self.get_name(response)

    # Now get the recursive img urls
    response.meta['item'] = output
    self.get_image_urls(response)
    return output

理想情况下,我应该返回输出对象以拥有所有必需的数据。 我的问题是为什么我没有得到输出['image_urls']? 因为当我取消注释get_image_urls函数中的print语句时,我看到3个爬行的url和3个带有附加的url的打印语句。 我在解析函数中需要它们。 我不确定是否可以决定我的问题。 有人可以帮忙吗?

您的parse方法将在完成get_image_urls请求之前返回输出。

您只应在递归逻辑的末尾产生或返回最终项目。 这样的事情应该起作用:

def parse(self, response):
    output = JulesProduct()
    output['name'] = self.get_name(response)
    yield Request(response.url, callback=self.get_image_urls, meta={'item': item}, dont_filter=True)

def get_image_urls(self, response):
    item = response.meta['item']
    if 'image_urls' in item:
        urls = item['image_urls']
    else:
        urls = []
    urls.extend(response.css('.product-image-link::attr(href)').extract())
    item['image_urls'] = urls
    next_url = response.css('.va-color .emptyswatch a::attr(href)').extract()

    if len(next_url) > 0:
        yield Request(next_url[0], callback=self.get_image_urls, meta={'item': item})
    else:
        yield item

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM