使用scrapy爬行动态数据

时间:2016-02-10 21:57:07

标签: web-scraping xmlhttprequest scrapy

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

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. 使用FormRequest获取正确的json
  3. 解析json (如果我对步骤有误,请告诉我)
  4. 我现在卡在第2步,我发现一个名为15258543的XHR包含评级分布,但我不知道如何发送请求以获取json。喜欢在哪里使用什么参数。

    有人可以带我走过这个吗? 谢谢!

1 个答案:

答案 0 :(得分:2)

最棘手的是动态获取15258543产品ID,然后在网址中使用它来获取评论。此产品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