使用scrapy抓取动态数据
crawl dynamic data using scrapy
我尝试从 target.com 获取产品评级信息。产品的 URL 是
看了response.body,发现评分信息不是静态加载的。所以我需要使用其他方式。我发现一些类似的问题说为了获得动态数据,我需要
- 找出正确的 XHR 以及向何处发送请求
- 使用FormRequest获取正确的json
- 解析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
.
我尝试从 target.com 获取产品评级信息。产品的 URL 是
看了response.body,发现评分信息不是静态加载的。所以我需要使用其他方式。我发现一些类似的问题说为了获得动态数据,我需要
- 找出正确的 XHR 以及向何处发送请求
- 使用FormRequest获取正确的json
- 解析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
.