使用scrapy抓取动态数据

crawl dynamic data using scrapy

我尝试从 target.com 获取产品评级信息。产品的 URL 是

http://www.target.com/p/bounty-select-a-size-paper-towels-white-8-huge-rolls/-/A-15258543#prodSlot=medium_1_4&term=bounty

看了response.body,发现评分信息不是静态加载的。所以我需要使用其他方式。我发现一些类似的问题说为了获得动态数据,我需要

  1. 找出正确的 XHR 以及向何处发送请求
  2. 使用Fo​​rmRequest获取正确的json
  3. 解析json (如果我对步骤有误,请告诉我)

我现在卡在第 2 步,我发现一个名为 15258543 的 XHR 包含评级分布,但我不知道如何发送请求来获取 json。喜欢去哪里,用什么参数。

有人可以帮我解决这个问题吗? 谢谢!

最棘手的事情是动态获取 15258543 产品 ID,然后在 URL 中使用它来获取评论。这个产品 ID 可以在产品页面的多个地方找到,例如,我们可以使用一个 meta 元素:

<meta itemprop="productID" content="15258543">

这是一个工作蜘蛛,它发出单独的 GET 请求以获取评论,通过 json.loads() 加载 JSON 响应并打印整体产品评级:

import json

import scrapy

class TargetSpider(scrapy.Spider):
    name = "target"
    allowed_domains = ["target.com"]
    start_urls = ["http://www.target.com/p/bounty-select-a-size-paper-towels-white-8-huge-rolls/-/A-15258543#prodSlot=medium_1_4&term=bounty"]

    def parse(self, response):
        product_id = response.xpath("//meta[@itemprop='productID']/@content").extract_first()

        return scrapy.Request("http://tws.target.com/productservice/services/reviews/v1/reviewstats/" + product_id,
                              callback=self.parse_ratings,
                              meta={"product_id": product_id})

    def parse_ratings(self, response):
        data = json.loads(response.body)

        print(data["result"][response.meta["product_id"]]["coreStats"]["AverageOverallRating"])

打印 4.5585.