Очистка данных с сайта http & javaScript - PullRequest
0 голосов
/ 06 января 2019

В настоящее время я хочу почистить некоторые данные со страницы Amazon, и я застрял.

Например, давайте возьмем эту страницу.

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

Я хотел очистить каждый вариант размера и цвета обуви. Эти данные можно найти, открыв исходный код и выполнив поиск по варианту.

enter image description here

Там мы можем видеть своего рода словарь, содержащий все размеры и цвета, а под ним в «asinToDimentionIndexMap» - каждый код продукта с номерами, указывающими вариант из словаря varValues.

Например, в asinToDimentionIndexMap мы можем видеть

"B01KWIUH5M":[0,0]

Это означает, что код продукта B01KWIUH5M связан с размером '8M US' (позиция 0 в разделе varValues ​​size_name) и цветом 'Teal' (та же идея, что и раньше)

Я хочу очистить оба VariationValues ​​и asinToDimentionIndexMap, чтобы я мог связать числа IndexMap с одним Varivalue.

Другой человек на сайте (спасибо за помощь, кстати) предложил сделать это таким образом.

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 не так уж и хороши, и чтение некоторых вещей о них не очень помогло.

Есть ли способ получить из этих данных 2 словаря или списка с помощью varValues ​​и asinToDimentionIndexMap? (возможно, используя некоторые регулярные выражения в середине, чтобы получить некоторые данные из большой строки). Или объясните немного, что происходит с частью JSON.

Спасибо за помощь!

РЕДАКТИРОВАТЬ: Добавлено фото вариацииValues ​​и asinToDimensionIndexMap

Ответы [ 2 ]

0 голосов
/ 07 января 2019
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, используя их по своему усмотрению.

0 голосов
/ 06 января 2019

Я думаю, что вы близко, Мануэль!

Следующий код превратит ваш очищенный источник в простые для выбора поля:

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

JSON - это универсальный формат для хранения информации об объекте. Другими словами, он предназначен для интерпретации строковых данных в объектных данных независимо от платформы, с которой вы работаете.

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

Я предполагаю, что вы можете найти что-то непростое, если есть какие-либо ошибки при доступе к определенному «ящику» внутри вашего объекта json.

Ваш формат кода выглядит правильно, но ваш доступ в "каждом поле" может выглядеть по-другому.

Например. Если ваш объект «asinToDimentionIndexMap» вложен в меньший блок в более крупный объект «products», то вы можете получить к нему доступ следующим образом (после выполнения кода выше):

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

Я немного взломал и урезал, чтобы вы могли лучше понять структуру вашего конкретного файла JSON. Взгляните на ссылку ниже. Справа вы увидите, «какие ящики находятся внутри друг друга» - это именно то, что вам нужно знать для доступа к тому, что вам нужно.

JSON Object Viewer

Например, следующее выдает «companyCompliancePolicies_feature_div»:

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

Человек, помогавший вам раньше, обрисовал вам общий случай, но вам нужно будет взглянуть на структуру таким образом, чтобы действительно найти то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...