перейти к содержанию

Как очистить данные электронной коммерции StockX с помощью Python

Парсинг веб-сайтов электронной коммерции, таких как StockX, может предоставить ценную информацию о доступности продуктов, тенденциях цен и многом другом. В этом подробном руководстве мы расскажем, как очистить данные о продуктах StockX с помощью Python.

Обзор StockX

Для непосвященных, StockX — это онлайн-торговая площадка, специализирующаяся на перепродаже кроссовок, уличной одежды, сумок и других товаров, пользующихся повышенным спросом. StockX часто называют «фондовым рынком вещей», поскольку он обеспечивает торги по продуктам в режиме реального времени, как фондовая биржа.

Некоторые ключевые вещи, которые нужно знать о StockX:

  • Продукты, как правило, представляют собой ограниченные серии от таких брендов, как Nike, Adidas, Supreme, Louis Vuitton и т. д.

  • Вместо фиксированных цен на товары делаются ставки, как на акции. Цены колеблются в зависимости от спроса и предложения.

  • StockX аутентифицирует и проверяет каждый товар на своем рынке.

  • Помимо торгов, покупатели также могут приобретать товары напрямую по самой низкой цене «Аск».

Учитывая ажиотаж вокруг многих продуктов на StockX, наличие актуальных данных о ценах и наличии может дать реселлерам значительное преимущество. Это делает StockX идеальной целью для парсинга веб-страниц.

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

В целом парсинг общедоступных веб-сайтов совершенно законен, если вы не делаете этого:

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

StockX's Условия использования не запрещайте явным образом парсинг веб-страниц или сбор данных. Пока мы ответственно относимся к парсингу и не публикуем повторно большие части контента StockX, парсинг их торговых площадок разрешен по закону.

Парсинг страниц продуктов StockX

Разобравшись с законностью, давайте посмотрим, как собирать данные со страниц продуктов StockX.

Вот пример страницы продукта для Толстовка Nike x Off-White:

Страница продукта StockX

Эта страница содержит все ключевые данные, которые мы хотели бы извлечь:

  • Название продукта, изображения, описание и т. д.
  • Цены спроса и предложения в режиме реального времени.
  • Исторический график цен.
  • Объем продаж с течением времени.
  • Доступные размеры и расцветки.

Простое сканирование HTML-кода этой страницы даст нам доступ к некоторым из этих данных. Однако StockX на самом деле загружает большую часть структурированных данных (цены, графики и т. д.) из объекта JSON, содержащегося в <script> тег.

Вот как выглядят скрытые данные JSON для примера с толстовкой Nike:

{
  "product": {
    "id": "0183b5c5-c4bd-47a7-9461-adc72b5acb39",
    "title": "Nike Sportswear Club Fleece Hoodie (Off-White / Black)",
    // ...other fields omitted for brevity

    "market": { 
      "lowestAsk": 289,
      "highestBid": 265,

      "volatility": {
        "week": 15.27
      },

      "charts": [
        {
          "name": "SALES",
          "series": [
            {
              "name": "DEADSTOCK",
              "data": [
                // historical sales data
              ]
            }  
          ]
        },
        {
          "name": "PRICE premium",
          "series": [
            {
              "name": "USED",
              "data": [
                // historical price data
              ]
            },
            {  
              "name": "NEW NO BOX",
              "data": []
            },
            {
              "name": "NEW NO LACES",
              "data": [] 
            }
          ]
        }
      ] 
    },

    "variants": [
      {
        "traits": { "size": "S" },
        "market": {
          // bid/ask data for Small size 
        }
      },
      {
        "traits": { "size": "M" },
        // etc...
      }
    ]
  }
}

Как видите, этот объект содержит множество структурированных данных о ценах, волатильности, истории продаж, графиках цен и вариантах продуктов. Парсинг этого будет гораздо полезнее, чем просто извлечение текста из HTML.

Вот пример кода для извлечения этих скрытых данных JSON со страницы с помощью Разборы библиотека:

import json
from parsel import Selector

def extract_json_data(html):
  sel = Selector(html)

  json_data = sel.css(‘script#__NEXT_DATA__::text‘).get()
  if json_data:
    return json.loads(json_data)

  return None

Чтобы получить и проанализировать страницу:

import requests
from extract_json_data import extract_json_data

url = ‘https://stockx.com/nike-sportswear-club-fleece-hoodie-off-white-black‘

response = requests.get(url)
data = extract_json_data(response.text)

print(data[‘product‘][‘title‘]) 
# Prints: Nike Sportswear Club Fleece Hoodie (Off-White / Black) 

И это основной метод извлечения ключевых данных со страниц продуктов StockX! Скрытый объект JSON содержит множество данных на нескольких вложенных уровнях, поэтому вам придется просмотреть его, чтобы извлечь нужные поля.

Несколько ключевых советов при парсинге страниц товаров:

  • Используйте заголовок с допустимым User-Agent чтобы имитировать настоящий браузер. Это помогает избежать блоков.

  • Установить Accept-Encoding заголовок, поэтому ответ сжимается (gzip), что экономит полосу пропускания.

  • Добавьте тайм-ауты, повторные попытки и другие рекомендации по обеспечению надежности. StockX очень популярен, так что ждите неудач.

  • Рассмотрите возможность использования асинхронных запросов при парсинге нескольких страниц.

  • Будьте осторожны со слишком агрессивным парсингом, так как это может привести к блокировке.

Поиск продуктов для очистки

Теперь, когда мы можем парсить отдельные продукты, нам нужен способ обнаружения продуктов, которые можно парсить.

У StockX есть две основные точки входа для этого:

Sitemaps – StockX предоставляет XML Sitemaps перечисление всех продуктов.

Поиск страницы – Мы можем собирать результаты поиска продуктов, соответствующих ключевым словам, брендам и т. д.

Давайте рассмотрим оба подхода:

Парсинг файлов Sitemap

Индекс карты сайта StockX находится по адресу https://stockx.com/sitemap_index.xml. При этом объединяются карты сайта для различных категорий и локалей.

Вот как мы могли бы очистить и проанализировать его в Python, используя Scrapy-библиотека:

import scrapy

class StockXSitemapSpider(scrapy.Spider):
  name = ‘stockx_sitemap‘

  def start_requests(self):
    yield scrapy.Request(‘https://stockx.com/sitemap_index.xml‘)

  def parse(self, response):
    for sitemap_url in response.xpath(‘//s:sitemap/s:loc/text()‘):
      yield response.follow(
        sitemap_url, 
        callback=self.parse_sitemap  
      )

  def parse_sitemap(self, response):
    for item_url in response.xpath(‘//s:url/s:loc/text()‘):
      yield {
        ‘url‘: item_url
      } 

Это рекурсивно сканирует все вложенные карты сайта, извлекая URL-адреса продуктов, которые мы можем передать в наш парсер продуктов.

В картах сайта представлен полный список всех продуктов StockX, поэтому этот подход отлично подходит для широкого сканирования. Однако он не позволяет фильтровать или запрашивать конкретные продукты. Для этого нам нужно очистить поиск StockX.

Парсинг страниц поиска

Поиск StockX позволяет искать товары по ключевым словам, фильтрам категорий (кроссовки, уличная одежда и т. д.), брендам, полу и т. д.

Например, вот поиск популярных красных кроссовок:

Результаты поиска StockX

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

И снова StockX загружает эти данные поиска из объекта JSON в файл. <script> ярлык. Это выглядит так:

{
  "results": {
    "products": [
      {
        "urlKey": "air-jordan-1-retro-high-dark-mocha",
        "title": "Air Jordan 1 Retro High Dark Mocha",
        "image": "https://image.goat.com/..." 
        //...
      },
      {
        "urlKey": "air-jordan-1-zoom-cmft-red-chili",
       //... 
      }
    ],
    "pageInfo": {
      "totalProducts": 223,
      "productsPerPage": 55,
      "page": 1, 
      "totalPages": 5      
    }
  }
}

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

Вот пример кода для очистки результатов поиска:

import math
import json 
from parsel import Selector

def extract_search_data(html):

  sel = Selector(html)
  data = sel.css(‘script[data-zrr-shared-data-key]::text‘).get()

  # Extract JSON
  return json.loads(data)

def scrape_search_results(search_url, max_pages=10):

  # Fetch first page
  response = requests.get(search_url)
  search_data = extract_search_data(response.text)

  products = []

  # Extract data from first page
  for product in search_data[‘results‘][‘products‘]:
    products.append(product)

  total_pages = min(max_pages, math.ceil(search_data[‘results‘][‘pageInfo‘][‘totalPages‘]))  

  # Fetch remaining pages concurrently
  with concurrent.futures.ThreadPoolExecutor() as executor:
    futures = [
      executor.submit(
        requests.get, 
        f"{search_url}&page={page+1}"  
      )
      for page in range(1, total_pages)
    ]

    for future in concurrent.futures.as_completed(futures):
      data = extract_search_data(future.result().text)
      for product in data[‘results‘][‘products‘]:
        products.append(product)

  return products # List of all products from all pages

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

Несколько советов по очистке поиска StockX:

  • Мониторинг totalPages поле, чтобы избежать попадания на несуществующие страницы.

  • Добавьте регулирование и повторные попытки, поскольку поиск может работать нестабильно.

  • Если возможно, подтвердите запрос, чтобы получить доступ к большему количеству результатов на странице.

  • Предпочитайте асинхронный парсинг при получении нескольких страниц.

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

Масштабирование с помощью сервиса парсинга

Хотя приведенные выше примеры отлично подходят для небольших парсеров, крупномасштабный парсинг создает дополнительные проблемы:

  • Избегайте блоков от агрессивного соскабливания.
  • Прокси и резидентные IP-адреса для парсинга из разных мест.
  • Встроенное кэширование, регулирование, повторные попытки и асинхронная обработка.
  • Рендеринг Javascript и решение проблем браузера.

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

Вот пример того, как парсер продуктов можно портировать для использования Scrapfly:

from webscrapingsite import ScrapeClient

client = ScrapflyClient(api_key=‘XXX‘)

def scrape_product(url):
  response = client.get(url) 

  # Call our existing parser
  data = extract_json_data(response.text)  

  return data[‘product‘]

# Usage:
product_data = scrape_product(‘https://stockx.com/...‘)

Обрабатывая всю инфраструктуру парсинга и устраняя блокировки, Scrapfly позволяет вам сосредоточиться на извлечении данных. Некоторые другие преимущества включают в себя:

  • Миллионы резидентных прокси будут выглядеть как реальные пользователи.
  • Автоматизация браузера для динамического контента.
  • Встроенное интеллектуальное кэширование и повторные попытки.
  • географический контроль региональных данных.

Scrapfly также предлагает полезные дополнения, такие как снимки экрана, загрузка HTML и соответствие GDPR, что делает его надежной платформой для парсинга.

Заключение

В этом посте мы рассмотрели различные методы очистки данных из StockX с помощью Python:

  • Страницы продукта могут быть проанализированы на наличие богатых скрытых данных JSON через <script> теги. Это предоставляет подробную информацию о вариантах, продажах, ценах, волатильности и многом другом.

  • Sitemaps дайте полный индекс всех продуктов на StockX, которые мы можем просканировать.

  • Страницы поиска позволяют искать продукты, соответствующие определенным ключевым словам, брендам и т. д. Удобно для целенаправленного парсинга.

  • Для крупномасштабной очистки, такие сервисы, как Scrapfly решать проблемы инфраструктуры и очистки данных, позволяя вам сосредоточиться на извлечении данных.

С помощью умного анализа и асинхронных рабочих процессов вы можете создать комплексный парсер данных StockX. Данные рынка предоставляют ценную информацию для реселлеров, розничных продавцов и т. д.

Надеемся, что этот пост предоставит вам схему создания собственного парсера StockX или использования сервисов для ускорения вашего проекта парсинга. Дайте мне знать, если у вас есть еще вопросы!

Теги:

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *