簡體   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