抓取我在解析时抓取的网址

时间:2019-01-29 01:14:58

标签: python-3.x web-scraping scrapy

在蜘蛛网中,我从Excel文件中获取了startURL。

我要在这里刮擦的是从亚马逊网站上买到的鞋子的不同版本。我首先刮擦了普通的鞋子,例如耐克女式鞋子(Nike Woman Shoe),一旦进入该页面,我就会得到所有的变体(鞋子的尺寸和颜色)。

类似于此页面

https://www.amazon.com/gp/product/B01F2M4EUM?pf_rd_p=1581d9f4-062f-453c-b69e-0f3e00ba2652&pf_rd_r=97H1JYZTD1M7YN7GRJW2

在此页面上,我可以获取每个变体以及与该变体相关的每个产品代码,但是在此URL中,我无法抓取价格和图片,因为该数据仅在选择特定的鞋子尺码和颜色时才会显示。

我试图刮擦价格的方式是格式化一个亚马逊链接,该链接使价格出现(尝试从亚马逊的网址中找到有效的方法)

例如,通过以下网址: https://www.amazon.com/gp/product/B01F2M4EUM?pf_rd_p=1581d9f4-062f-453c-b69e-0f3e00ba2652&pf_rd_r=97H1JYZTD1M7YN7GRJW2

我手动选择大小和颜色,然后得到:

https://www.amazon.com/gp/product/B0187Q0XWS?pf_rd_p=1581d9f4-062f-453c-b69e-0f3e00ba2652&pf_rd_r=97H1JYZTD1M7YN7GRJW2&th=1&psc=1

此网址我可以格式化(插入其他产品代码),然后显示价格。

很抱歉,冗长的解释,只是想尽可能地描述性。

我的蜘蛛看起来像这样:

def parse(self,response):
    variationValues = re.findall(r'variationValues\" : ({.*?})', ' '.join(script))[0]
    asinToDimensionIndexMap = re.findall(r'asinToDimensionIndexMap\" : ({.*})', ' '.join(script))[0]
    variationValuesDict = json.loads(variationValues)
    asinToDimensionIndexMapDict = json.loads(asinToDimensionIndexMap)
    productKeys = asinToDimensionIndexMapDict.keys()

    for key in productKeys:

        numeroTalle = asinToDimensionIndexMapDict[key][0]
        numeroColor = asinToDimensionIndexMapDict[key][1]

        clothesAmz_item['codigoGenericoProducto'] = codigoUUID
        clothesAmz_item['codigoEspecificoProducto'] = key
        clothesAmz_item['nombreProducto'] = response.xpath('normalize-space(//span[contains(@id, "productTitle")]/text())').extract()
        clothesAmz_item['urlProducto'] = 'https://www.amazon.com/gp/product/{}?pf_rd_p=1581d9f4-062f-453c-b69e-0f3e00ba2652&pf_rd_r=48QP07X56PTH002QVCPM&th=1&psc=1'.format(key)                    
        clothesAmz_item['talleProducto'] = variationValuesDict["size_name"][numeroTalle]
        clothesAmz_item['modeloProducto'] = variationValuesDict["color_name"][numeroColor]

        yield clothesAmz_item

所以,我想做的是解析我得到的网址(urlProducto),而不是产生商品,以便我可以获取变体的价格

我试图做这样的事情

    yield Request(urlProducto, callback = self.parse_specific)

def parse_specific(self,response):

    clothesAmz_item['precioProducto'] = response.xpath('//span[contains(@id, "priceblock")]/text()'.strip()).extract()

    yield clothesAmz_item

这样做,实际上什么也没发生,在控制台中,我可以看到蜘蛛正在浏览从文件中获取的startURL,但没有收集任何数据。

我想补充一点,如果我运行我在这个问题上写的第一个蜘蛛,该程序可以正常运行,但是我无法获得单个价格

有什么想法吗?

items.py

class ClothesItem(scrapy.Item):

#DatosProducto
codigoGenericoProducto = scrapy.Field()
codigoEspecificoProducto = scrapy.Field()
categoriaProducto = scrapy.Field()
nombreProducto = scrapy.Field()
precioProducto = scrapy.Field()
urlProducto = scrapy.Field()
talleProducto = scrapy.Field()
modeloProducto = scrapy.Field()

#Imagenes
img0Producto = scrapy.Field()
img1Producto = scrapy.Field()
img2Producto = scrapy.Field()
img3Producto = scrapy.Field()
img4Producto = scrapy.Field()
img5Producto = scrapy.Field()

pass

编辑:添加了items.py和更多蜘蛛代码。运行程序时我没有任何错误。程序运行良好,直到我添加了Request。(url,callback = parse_specific)部分。

1 个答案:

答案 0 :(得分:0)

请尝试:

response.xpath('//span[contains(@id, "priceblock")]/text()'.strip()).extract()-此错误。必须response.xpath('//span[contains(@id, "priceblock")]/text()').extract()然后穿上衣服Amz_item ['precioProducto']阵列