【问题标题】:Scraping an URL that I scraped while parsing抓取我在解析时抓取的 URL
【发布时间】:2019-01-29 01:14:57
【问题描述】:

在我拥有的蜘蛛中,我从一个 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

所以,我想做的是,解析我得到的 url (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) 部分之前,程序运行良好。

【问题讨论】:

  • 你能提供你的完整代码吗? (在最后一个 sn-p clothesAmz_item 甚至没有定义)你有什么错误吗?你试过debugging吗?你知道Request.meta吗?

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


【解决方案1】:

试试这个:

response.xpath('//span[contains(@id, "priceblock")]/text()'.strip()).extract() - 这是错误的。必须是response.xpath('//span[contains(@id, "priceblock")]/text()').extract() 然后脱衣服Amz_item['precioProducto'] 数组

【讨论】:

  • 这不是我在这里遇到的真正问题,在我使用的 xpath 中,我刮掉的其他产品的价格很好。我遇到的问题,或者我想要实现的问题是抓取我在同一过程中抓取另一个页面获得的 URL。这个想法是使用 2 个解析器,但让这个解析器影响同一个scrapy Item
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
相关资源
最近更新 更多