【问题标题】:Multiple Request to Single Field in ScrapyScrapy中对单个字段的多个请求
【发布时间】:2017-07-05 17:23:37
【问题描述】:

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

这是我的 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 函数中取消注释打印语句时,我看到 3 个已抓取的 url 和 3 个打印语句,其中 url 一个接一个地附加。我在解析函数中需要它们。我不确定我是否能够决定我的问题。有人可以帮忙吗?

【问题讨论】:

标签: python scrapy


【解决方案1】:

您的 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

【讨论】:

  • 您确定我们不需要更改解析函数中的某些内容吗?因为我已经尝试过了,但它一无所获。有什么线索吗?
  • 我已经编辑了我的答案。对不起,我错了。正如你所知,由于我不知道你正在抓取的页面,我正在对同一页面进行第二次请求,因此使用 dont_filter=True,并假设你的解析逻辑是好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2011-11-08
  • 2019-12-05
相关资源
最近更新 更多