从http和javaScript站点抓取数据

时间:2019-01-05 23:58:15

标签: python json web-scraping scrapy

我目前想从亚马逊页面上抓取一些数据,我有点卡住了。

例如,让我们进入此页面。

https://www.amazon.com/NIKE-Hyperfre3sh-Athletic-Sneakers-Shoes/dp/B01KWIUHAM/ref=sr_1_1_sspa?ie=UTF8&qid=1546731934&sr=8-1-spons&keywords=nike+shoes&psc=1

我想刮擦各种尺寸和颜色的鞋子。可以打开源代码并搜索“ variationValues”来找到该数据。

enter image description here

我们可以看到一个字典,其中包含所有大小和颜色,在其下方,在“ asinToDimentionIndexMap”中,每个带有数字的产品代码均带有表示variationValues“字典”的变体。

例如,在asinToDimentionIndexMap中,我们可以看到

"B01KWIUH5M":[0,0]

这意味着产品代码B01KWIUH5M与大小'8M US'(variationValues size_name部分中的位置0)和颜色'Teal'(与之前相同)相关联

我想同时抓取variationValues和asinToDimentionIndexMap,因此我可以将IndexMap数字与variantValues关联起来。

网站中的另一个人(感谢帮忙)建议采用这种方式。

script = response.xpath('//script/text()').extract_frist()
import re
# capture everything between {}
data = re.findall(script, '(\{.+?\}_') 

import json
d = json.loads(data[0])
d['products'][0]

我可以理解第一部分。我们获取所有作为字符串的“脚本”,然后获取{}之间的所有内容。问题是在那之后会发生什么。我对json的了解不是很好,阅读一些有关json的知识并没有太大帮助。

是否有一种方法可以从该数据中获取2个带有variationValues和asinToDimentionIndexMap的词典或列表? (也许在中间使用一些正则表达式从大字符串中获取一些数据)。或解释一下json部分会发生什么。

感谢您的帮助!

编辑:添加了variationValues和asinToDimensionIndexMap的照片

2 个答案:

答案 0 :(得分:1)

我认为您很亲密的曼努埃尔!

以下代码会将您抓取的资源变成易于选择的框:

import json
d = json.loads(data[0])

JSON是用于存储对象信息的通用格式。换句话说,它旨在将字符串数据解释为对象数据,而不管您使用的平台是什么。

https://www.w3schools.com/js/js_json_intro.asp

我假设您可能会在哪里找到一个挑战,那就是在访问json对象内部的特定“框”时是否存在任何错误。

您的代码格式看起来正确,但是您在“每个框”中的访问可能看起来不同。

例如。如果您的“ asinToDimentionIndexMap”对象嵌套在较大的“产品”对象的较小框中,那么您可以这样访问它(运行上面的代码后):

d['products'][0]['asinToDimentionIndexMap']

我已经砍了一点点,所以您可以更好地了解您的特定json文件的结构。看一下下面的链接。在右侧,您将看到“哪些框在彼此之间” –这正是访问所需内容时需要知道的。

JSON Object Viewer

例如,以下代码将产生“ companyCompliancePolicies_feature_div”:

import json
d = json.loads(data[0])
d['updateDivLists']['full'][0]['divToUpdate']

之前帮助您的人为您概述了一个一般情况,但是您需要以这种方式查看结构,才能真正找到所需的内容。

答案 1 :(得分:1)

variationValues = re.findall(r'variationValues\" : ({.*?})', ' '.join(script))[0]
asinVariationValues = re.findall(r'asinVariationValues\" : ({.*?}})', ' '.join(script))[0]
dimensionValuesData = re.findall(r'dimensionValuesData\" : (\[.*\])', ' '.join(script))[0]
asinToDimensionIndexMap = re.findall(r'asinToDimensionIndexMap\" : ({.*})', ' '.join(script))[0]
dimensionValuesDisplayData = re.findall(r'dimensionValuesDisplayData\" : ({.*})', ' '.join(script))[0]

现在,您可以轻松地将它们转换为json,并根据需要结合使用。