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.
Общий поток будет таким:
- Находите продукты с помощью API поиска и страниц категорий.
- Собирайте URL-адреса продуктов
- Перебирайте URL-адреса, чтобы очистить каждую страницу продукта.
- Извлекайте детали, медиа, цены, запасы и т. д.
- Сохраните очищенные данные о продукте в формате 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, готовое к крупномасштабному развертыванию.