2016-02-10 81 views
1

我尝试从target.com获取产品评分信息。本产品的URL是使用scrapy抓取动态数据

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 (如果我错了步骤请告诉我)

我卡在第2步现在,我发现一个名为15258543 XHR包含评级分配,但我不知道我怎么能发送请求得到json。喜欢在哪里使用什么参数。

有人可以走过我吗? 谢谢!

回答

2

最棘手的是动态获取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

+0

我明白了,谢谢!只是一个后续问题。我注意到有另一个XHR获取商店ID的请求,它被命名为“v1?request_type = availability&key = ......”,所以我尝试使用相同的方式来获取该json文件,但返回消息说“请求方法”GET'不支持“。我的问题是,我可以清楚地看到在Chrome开发者工具中返回的json,所以肯定有办法得到它,我只是不知道如何。你能给我一个提示吗? – user2628641