Nano Hash - криптовалюты, майнинг, программирование

Как очистить всю обувь на странице Nike с помощью python

Я пытаюсь найти всю обувь на сайте https://www.nike.com/w/mens-shoes-nik1zy7ok. Как очистить всю обувь, включая ту, которая загружается при прокрутке страницы?

Точная информация, которую я хочу получить, находится внутри элементов div с классом product-card__body следующим образом:

<div class="product-card__body " data-el-type="Card"><figure><a class="product-card__link-overlay" href="https://www.nike.com/t/air-force-1-07-mens-shoe-TjqcX1/CJ0952-001">Nike Air Force 1 '07</a><a class="product-card__img-link-overlay" href="https://www.nike.com/t/air-force-1-07-mens-shoe-TjqcX1/CJ0952-001" aria-describedby="Nike Air Force 1 '07" data-el-type="Hero"><div class="image-loader css-zrrhrw product-card__hero-image is--loaded"><picture><source srcset="https://static.nike.com/a/images/c_limit,w_592,f_auto/t_product_v1/s12ff321cn2nykxhva9j/air-force-1-07-mens-shoe-TjqcX1.jpg" media="(min-width: 1024px)"><source srcset="https://static.nike.com/a/images/c_limit,w_592,f_auto/t_product_v1/s12ff321cn2nykxhva9j/air-force-1-07-mens-shoe-TjqcX1.jpg" media="(max-width: 1023px) and (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)"><source srcset="https://static.nike.com/a/images/c_limit,w_318,f_auto/t_product_v1/s12ff321cn2nykxhva9j/air-force-1-07-mens-shoe-TjqcX1.jpg" media="(max-width: 1023px)"><img src="https://static.nike.com/a/images/c_limit,w_318,f_auto/t_product_v1/s12ff321cn2nykxhva9j/air-force-1-07-mens-shoe-TjqcX1.jpg" alt="Nike Air Force 1 '07 Men's Shoe"></picture></div></a><div class="product-card__info"><div class="product_msg_info"><div class="product-card__titles"><div class="product-card__title " id="Nike Air Force 1 '07">Nike Air Force 1 '07</div><div class="product-card__subtitle ">Men's Shoe</div></div></div><div class="product-card__count-wrapper show--all"><div class="product-card__count-item"><button type="button" aria-expanded="false" class="product-card__colorway-btn"><div aria-label="Available in 3 Colors" aria-describedby="Nike Air Force 1 '07" class="product-card__product-count "><span>3 Colors</span></div></button></div></div><div class="product-card__price-wrapper "><div class="product-card__price"><div><div class="product-price css-11s12ax is--current-price" data-test="product-price">$90</div></div></div></div></div></figure></div>

Вот код, который я использую:

    html_data = requests.get("https://www.nike.com/w/mens-shoes-nik1zy7ok").text
    shoes = json.loads(re.search(r'window.INITIAL_REDUX_STATE=(\{.*?\});', html_data).group(1))

Прямо сейчас он извлекает только ту обувь, которая первоначально загружается на страницу. Как мне получить остальную часть обуви и добавить ее к переменной обуви?


  • Судя по тегам, которые вы использовали, вы уже знаете о BeautifulSoup и requests, так что вы готовы реализовать это. Какой код вы написали и где именно вы сталкиваетесь с проблемами? 20.07.2020
  • @ForceBru проверьте редактирование 20.07.2020
  • request.get() будет получать html-страницу. Обувь загружается на страницу с помощью JavaScript. Возможно, вы сможете вызывать API напрямую (используйте инструменты разработчика для изучения запросов и Postman, чтобы узнать, можете ли вы его вызвать). Или используйте пакет, например selenium. 20.07.2020
  • Привет, Грег, как узнать URL-адрес API для вызова? 20.07.2020

Ответы:


1

Изучив вызовы API, сделанные веб-сайтом, вы можете найти загадочный URL-адрес, начинающийся с https://api.nike.com/ . Этот URL-адрес также хранится в INITIAL_REDUX_STATE, который вы уже использовали для получения первой пары продуктов. Итак, я просто расширяю ваш подход:

import requests
import json
import re

# your product page
uri = 'https://www.nike.com/w/mens-shoes-nik1zy7ok'

base_url = 'https://api.nike.com'
session = requests.Session()

def get_lazy_products(stub, products):
"""Get the lazily loaded products."""
    response = session.get(base_url + stub).json()
    next_products = response['pages']['next']
    products += response['objects']
    if next_products:
        get_lazy_products(next_products, products)
    return products

# find INITIAL_REDUX_STATE
html_data = session.get(uri).text
redux = json.loads(re.search(r'window.INITIAL_REDUX_STATE=(\{.*?\});', html_data).group(1))

# find the initial products and the api entry point for the recursive loading of additional products
wall = redux['Wall']
initial_products = re.sub('anchor=[0-9]+', 'anchor=0', wall['pageData']['next'])

# find all the products
products = get_lazy_products(initial_products, [])

# Optional: filter by id to get a list with unique products
cloudProductIds = set()
unique_products = []
for product in products:
    try:
        if not product['id'] in cloudProductIds:
            cloudProductIds.add(product['id'])
            unique_products.append(product)
    except KeyError:
        print(product)

API также возвращает общее количество продуктов, хотя это число может варьироваться и зависит от параметра count в URL-адресе API.

Вам нужна помощь в анализе или агрегировании результатов?

20.07.2020
  • Это здорово, но как указать, хочу ли я мужскую или женскую обувь? 21.07.2020
  • Я только что отредактировал свой предыдущий подход, чтобы вы могли использовать URL-адрес в качестве точки входа (например, nike.com). /w/mens-shoes-nik1zy7ok), а затем найти все товары. 21.07.2020
  • Спасибо, но я продолжаю получать эту ошибку: redux = [скрипт для скрипта в скриптах if script.text.startswith('window.INITIAL_REDUX_STATE')][0] IndexError: индекс списка вне допустимого диапазона 21.07.2020
  • У меня это работает, но эта строка просто ищет переменную INITIAL_REDUX_STATE. Я заменил это регулярным выражением, которое вы использовали, оно, похоже, сработало для вас. 21.07.2020
  • Оно работает! Не знаю, почему у меня изначально были проблемы с запуском. Отличная работа @Грегор!! 21.07.2020
  • Извините, я внес еще одно изменение, так как понял, что продукты в INITIAL_REDUX_STATE имеют другой формат, чем те, которые возвращаются API. Формат теперь одинаков для всех продуктов. 21.07.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..