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

Walmart — крупнейший в мире ритейлер с более чем 10,000 24 магазинов в XNUMX странах. Учитывая огромные запасы и обширные данные о продуктах, Walmart является чрезвычайно ценной целью для веб-парсинга.

В этом подробном руководстве мы расскажем, как создать веб-скребок для извлечения данных о продуктах Walmart в большом масштабе.

Обзор

Вот краткий обзор ключевых шагов, которые мы рассмотрим:

  • Поиск продуктов для очистки
    • Использование API поиска Walmart
    • Парсинг страниц категорий
    • Работа с ограничениями результатов
  • Парсинг страниц продуктов
    • Парсинг данных о товарах
    • Парсинг медиа, цен, спецификаций и т. д.
  • Как избежать блокировки
    • Рандомизированные задержки
    • Использование прокси
    • Имитация реальных браузеров
  • Собираем все вместе
    • API поиска → URL-адреса продуктов → очистка
    • Обработка больших наборов результатов

К концу у вас будет полностью функционирующий парсер Walmart на Python, готовый извлекать тысячи продуктов. Давайте начнем!

Установка

Мы будем использовать Питон а также несколько ключевых пакетов:

  • Запросы – для выполнения HTTP-запросов к API и веб-страницам Walmart
  • красивыйсуп4 — парсинг HTML
  • панд – для манипулирования данными

Установите их через pip:

pip install requests beautifulsoup4 pandas

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

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

Первым шагом является обнаружение URL-адресов или идентификаторов продуктов, которые можно загрузить в наш парсер. Есть несколько подходов, которые мы можем использовать:

Использование API поиска

Walmart предлагает API поиска, который возвращает структурированные данные JSON. Мы можем запросить этот API, чтобы найти продукты, соответствующие ключевым словам.

Давайте попробуем это для «ноутбука»:

import requests

api_url = "https://www.walmart.com/terra-firma/api/search"

params = {
  "query": "laptop", 
  "sort": "price_low",
  "page": 1,
  " affiliateId": "test",
}

response = requests.get(api_url, params=params)
data = response.json()

print(data["items"][0]["productId"])
# prints a product ID, e.g. 1GY23EA#ABA

Этот API возвращает результаты с разбивкой на страницы в структурированном формате JSON, содержащем:

  • productId – идентификатор Walmart для этого продукта
  • title — название продукта
  • description – краткое текстовое описание
  • price - текущая цена
  • И многое другое ...

Мы можем перебирать страницы для сбора идентификаторов и данных.

Одним из ограничений является то, что API позволяет получать до 1000 результатов. Чтобы получить больший охват, нам придется использовать и другие подходы.

Анализ страниц категорий

Walmart также предоставляет доступные для просмотра страницы категорий, которые мы можем проанализировать:

https://www.walmart.com/browse/electronics/laptops/3944_3951_132959?povid=113750++2019-11-04+15%3A05%3A24.517-06%3A00&povid=113750++2019-11-04+15%3A05%3A24.517-06%3A00&affinityOverride=default

Эти страницы содержат сетки продуктов, которые мы видим на сайте Walmart.

Для извлечения продуктов воспользуемся Beautiful Soup:

from bs4 import BeautifulSoup
import requests

url = "https://www.walmart.com/browse/electronics/laptops/3944_3951_132959"

response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

products = soup.select(".search-result-gridview-item")

for product in products:
  title = product.select_one(".search-result-product-title").text
  link = product.select_one(".search-result-product-title")["href"]

  print(title, link)

Это анализирует продукты представления сетки/списка, получая заголовок и URL-адрес.

Затем мы можем передать URL-адреса в наш парсер продуктов.

Страницы категорий могут содержать тысячи продуктов на многих страницах, поэтому этот метод имеет широкий охват.

Работа с ограничениями

Между API поиска и страницами категорий мы можем обнаружить 10,000 XNUMX продуктов. Но есть некоторые ограничения, которые следует учитывать:

  • API поиска позволяет получить только 1000 результатов.
  • Каждая страница категории имеет максимум 24 страницы, ~ 50 товаров на странице.

Итак, для комплексной очистки нам придется проявить творческий подход:

  • Используйте несколько поисковых запросов с сужающими фильтрами.
  • Скольжение по нескольким страницам категорий
  • Расширьте область применения, например. парсинг всех ноутбуков по электронике

После небольшой итерации мы можем создать большой массив из более чем 10,000 XNUMX URL-адресов продуктов, пригодных для загрузки в наш парсер.

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

Получив URL-адреса или идентификаторы продуктов, мы можем извлечь данные со страниц самих продуктов.

Страницы продуктов Walmart содержат богатый набор информации, которую мы можем извлечь:

  • Название Описание
  • Фотографии
  • Цена, данные о продажах
  • Характеристики
  • Информация о продавце
  • Отзывы
  • Возможно вам понравится
  • Наличие на складе

И многое другое.

Давайте пройдемся по очистке некоторых ключевых частей.

Парсинг сведений о продукте

Страницы продукта содержат объект JavaScript под названием window.__WML_REDUX_INITIAL_STATE__ с большей частью структурированных данных:

<script>
  window.__WML_REDUX_INITIAL_STATE__ = {
    "product": {
      "id": "1GY23EA#ABA",
      "usItemId": "497219257", 
      "name": "HP 14-inch Laptop, Intel Core i3-1005G1, 4GB SDRAM, 128GB SSD, Pale Gold, Windows 10 Home",
      "description": "A laptop with the performance you need and..."
      ...
    }
    ...
  }
</script>

Мы можем извлечь это и проанализировать JSON, чтобы получить такие поля, как:

import json
import requests
from bs4 import BeautifulSoup

product_url = "https://www.walmart.com/ip/497219257" 

response = requests.get(product_url)
soup = BeautifulSoup(response.text, ‘html.parser‘)

data = soup.find("script", {"id": "__WML_REDUX_INITIAL_STATE__"})
product_data = json.loads(data.contents[0])["product"]

title = product_data["name"]
walmart_id = product_data["usItemId"]
description = product_data["description"]

print(title)
# "HP 14-inch Laptop, Intel Core i3-1005G1, 4GB SDRAM, 128GB SSD, Pale Gold, Windows 10 Home" 

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

Очистка медиа

Носители продукта, такие как изображения, содержатся в другом блоке сценария. imageAssets:

<script>
window.__WML_REDUX_INITIAL_STATE__.pdpData.item.imageAssets = [
  {
    "assetSize": "medium",
    "assetUrl": "https://i5.walmartimages.com/...", 
    "baseAsset": {...},
    "thumbnailUrl": "https://i5.walmartimages.com/..." 
  },
  {...}
];
</script>

Мы можем очистить и перебрать ресурсы, чтобы найти URL-адреса разных размеров:

images = []

for asset in product_data["imageAssets"]:
  img_url = asset["assetUrl"]
  images.append(img_url)

print(images[0])
# "https://i5.walmartimages.com/asr/e95444a3-2e8b-41d2-a585-4f3ea9fc51b6.345fba144e9df8a6d290b2ed3857e90b.jpeg"

Это позволяет нам получать все изображения продуктов в разном разрешении.

Очистка цен и инвентаря

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

<script>
window.__WML_REDUX_INITIAL_STATE__.pdpData.item.priceInfo =  {
  "priceDisplayCodes": {
    "rollback": true,
    "reducedPrice": true    
  },
  "currentPrice": {
    "currencyUnit": "USD", 
    "price": 399
  }
  ...

Мы можем проанализировать поля цен:

price_data = product_data["priceInfo"]

regular_price = price_data["wasPrice"]["price"] # 499 
sale_price = price_data["currentPrice"]["price"] # 399
on_sale = "rollback" in price_data["priceDisplayCodes"] # True

print(f"On sale for {sale_price}, regular {regular_price}")

То же самое относится и к состоянию запасов, содержащемуся в availabilityStatus:

in_stock = product_data["availabilityStatus"] == "IN_STOCK"

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

Как избежать блоков

При масштабном парсинге Walmart мы, скорее всего, столкнемся с блокировками из-за слишком большого количества запросов. Вот несколько советов, как этого избежать:

  • Ограничить частоту запросов — придерживайтесь максимум 2-3 запросов в секунду

  • Рандомизировать задержки - вставлять случайные задержки в 2-5 секунд между запросами

  • Ротация пользовательских агентов - подделывать различные пользовательские агенты браузера настольного компьютера

  • Используйте прокси – маршрутизация трафика через резидентные прокси-сервисы

  • Повторить попытку с блоками – если заблокировано, приостановите очистку на 30+ минут

Принимая эти меры предосторожности, мы можем безопасно очистить тысячи продуктов Walmart.

Некоторые платные прокси-сервисы также предлагают расширенную ротацию IP-адресов и заголовков, чтобы избежать блоков. Это может помочь в более масштабном соскабливании.

Собираем все вместе

Наконец, давайте объединим ключевые компоненты в полноценный парсер Walmart.

Общий поток будет таким:

  1. Находите продукты с помощью API поиска и страниц категорий.
  2. Собирайте URL-адреса продуктов
  3. Перебирайте URL-адреса, чтобы очистить каждую страницу продукта.
  4. Извлекайте детали, медиа, цены, запасы и т. д.
  5. Сохраните очищенные данные о продукте в формате CSV/JSON.

Вот пример кода:

from bs4 import BeautifulSoup
import requests, json, time, random

# Product URL extraction functions...

def scrape_search_api(query):
  # Search API logic...

def scrape_category_pages(url):
  # Category parsing logic...  

product_urls = []

product_urls.extend(scrape_search_api("laptops"))
product_urls.extend(scrape_category_pages("https://www...")) 

# Add proxies here...

for url in product_urls:

  response = requests.get(url)

  soup = BeautifulSoup(response.text, ‘html.parser‘)

  # Extract product data...

  product = {
    "name": name,
    "description": description,
    "price": price,
    "images": images,
    "in_stock": in_stock
  }

  # Save product to CSV, database, etc...

  # Random delay  
  time.sleep(random.uniform(2, 5))

Это реализует ключевые моменты, которые мы рассмотрели:

  • Генерация URL-адресов продуктов для загрузки в парсер
  • Анализ каждой страницы продукта с помощью BeautifulSoup
  • Извлечение деталей, медиа, цен, инвентаря
  • Добавление прокси и случайных задержек во избежание блоков
  • Сохранение очищенных данных в файл

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

Полный код будет содержать более продвинутую обработку ошибок, многопоточность и т. д. Но это охватывает основную логику и рабочий процесс.

Обзор

В этом руководстве мы рассмотрели создание комплексного веб-скребка для данных о продуктах Walmart с использованием Python.

Ключевые техники включали в себя:

  • Использование API поиска Walmart и страниц категорий для создания URL-адресов продуктов.
  • Анализ страниц продуктов и извлечение подробностей, носителей, цен и запасов.
  • Как избежать блокировок с прокси, задержек и спуфинга
  • Объединение поиска → очистка продукта → сохранение рабочего процесса.

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

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

Теги:

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

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