Python Веб-парсинг, содержащий элемент javascript - PullRequest
0 голосов
/ 13 июля 2020

Я не пытаюсь получить информацию о размере и наличии на складе, нет в наличии или нет. https://limitededt.com/collections/footwear/products/adidas-originals-jonah-hill-superstar-fw7577

Похоже, мне нужно нажимать на каждый размер вручную, и на кнопке будет отображаться либо «ПРОДАНО», либо «Добавить в КОРЗИНУ».

Я могу получить базовую информацию c со страницы HTML, но это выглядит как событие JS.

Когда я нажимаю на размер, URL-адрес меняется на

https://limitededt.com/collections/footwear/products/adidas-originals-jonah-hill-superstar-fw7577?variant=32432939466823

Есть дополнительный вариант «option = 32432939466823»

Я думал, что могу вручную выяснить, что это за вариант, а затем использовать запрос для повторной загрузки страницы а затем попытайтесь получить информацию о кнопке и определить, есть ли она в наличии или нет.

Есть ли какие-либо альтернативы, которые я могу запросить один раз и взаимодействовать с размерами для проверки запасов?

url = "https://limitededt.com/collections/footwear/products/adidas-originals-jonah-hill-superstar-fw7577"

source = requests.get(url).text

soup = BeautifulSoup(source, 'lxml')

1 Ответ

0 голосов
/ 27 июля 2020

Посмотрев на вкладку сети в вашем браузере, вы найдете JSON, который содержит все продукты - вы можете загрузить эти данные, просто добавив .json к URL-адресу. Тем не менее, он не содержит информации о запасах, поскольку эти данные загружаются из магазина, который, по-видимому, является канадской международной компанией электронной коммерции со штаб-квартирой в Оттаве (согласно Википедии). Эти данные загружаются в тег скрипта в DOM, который вы можете легко извлечь с помощью BeautifulSoup (хотя я на самом деле не использую его - мы могли бы просто использовать регулярные выражения).

from bs4 import BeautifulSoup
import requests
import re

# define both URLs: for the JSON and the actual website for the shopify stock
url = 'https://limitededt.com/collections/footwear/products/adidas-originals-jonah-hill-superstar-fw7577'
product_info = url + '.json'

# fetch both data sources
with requests.Session() as session:
    soup = BeautifulSoup(session.get(url).text, 'html.parser')
    swym = soup.find('script', {'id': 'swym-snippet'})
    info = session.get(product_info).json()

# this will contain all the products and their stock
products = dict()

# get the data for each product from the json
for variant in info['product']['variants']:
    products[variant['id']] = variant

# find the shopify data using a regular expression
regex = re.compile(r'SwymProductVariants\[[0-9]+\] = ({[^(;)]+)')
inventory = re.findall(regex, swym.text)

# add the inventory information to the previously constructed product dictionary
for inv in inventory:
    indices = [key.strip().split(':')[1] for index, key in enumerate(inv.split(',')) if index in [1, 5]]
    products[int(indices[0])]['stock'] = int(indices[1])
...