Walmart является одним из крупнейших интернет-ритейлеров в мире, и данные о товарах, которые он предоставляет: названия, цены, рейтинги и наличие, действительно полезны, если вы занимаетесь ценовыми исследованиями, мониторингом рынка или созданием розничного продукта. Проблема в том, что Walmart рендерит большую часть контента на стороне клиента и активно защищается от ботов, поэтому обычный HTTP-запрос выдаёт вам пустую оболочку или страницу блокировки. В этом руководстве показано, как скрапить страницу товара Walmart с помощью Selenium: небольшая, работающая Python-сборка, которая управляет безголовым Firefox, маршрутизирует трафик через Crawlbase Smart AI Proxy, чтобы запрос воспринимался как настоящий посетитель, извлекает публичные поля товара и записывает их на диск.

Чтобы сохранить честность и обоснованность подхода, всё руководство ограничено публичными данными: названием товара, ценой, рейтингом и количеством отзывов, которые может видеть любой пользователь без входа в систему. Оно не затрагивает аккаунты пользователей, контент за логином, действия в оформлении заказа или персональные данные. Раздел о законности ближе к концу не является шаблонным текстом, поэтому прочитайте его, прежде чем направить инструмент на производственный объём.

Зачем использовать Selenium и прокси вместе

Selenium, инструмент автоматизации браузера. Он программно управляет реальным браузером, поэтому запускает JavaScript страницы и видит тот же отрендеренный DOM, что и человек. Это решает проблему рендеринга: Walmart заполняет детали товара на стороне клиента, и Selenium ждёт появления этих элементов перед их чтением. Что Selenium не решает, это сетевую часть. По умолчанию он отправляет запросы с вашего собственного IP, а Walmart быстро помечает трафик датацентров и повторные посещения, ограничивая или блокируя его ещё до того, как страница успеет полностью загрузиться.

Именно этот пробел заполняет прокси. Crawlbase Smart AI Proxy, это единственная прокси-точка, которая ротирует запросы через пул жилых IP на стороне сервера. Вы один раз направляете Firefox на неё, и каждый запрос Selenium выходит через свежий, реальный пользовательский адрес. Вы получаете рендеринг от Selenium и разблокирование от прокси, где каждый инструмент выполняет ту часть, в которой действительно хорош. Вы могли бы собрать собственную ротацию IP с помощью списка ротируемых жилых прокси, но поддержание этого пула в рабочем состоянии и корректная ротация, это и есть большая часть работы, которую Smart AI Proxy уже выполняет за вас.

Who does what

Держите границы чёткими в уме. Selenium рендерит и читает страницу: запускает JavaScript, ждёт элементов и извлекает поля. Smart AI Proxy обрабатывает сеть: ротирует жилые IP, чтобы запрос выглядел как реальный посетитель, а не бот. Смешение этих обязанностей или полный отказ от прокси, самая распространённая причина, по которой скрапер Walmart возвращает пустые поля или страницу блокировки.

Что вы создадите

Небольшой, работающий Python-скрипт, который принимает URL товара Walmart, запускает безголовый Firefox, настроенный на маршрутизацию через Smart AI Proxy, ждёт отрисовки названия и цены, извлекает публичные поля, повторяет попытку при таймауте и выводит структурированный результат. Вы можете запускать каждый фрагмент кода как написано; просто подставьте свой токен доступа и URL товара.

Настройка Firefox, Python и geckodriver

Selenium требует трёх вещей на вашей машине: браузера для управления, Python-привязок и драйвера, который их соединяет. Для Firefox этот драйвер называется geckodriver.

Сначала установите Mozilla Firefox с официального сайта, если у вас его ещё нет. Затем убедитесь, что у вас установлен Python 3.8 или выше.

bash
python --version

Затем скачайте geckodriver. Он служит мостом между Selenium и Firefox: перейдите на страницу релизов geckodriver на GitHub, возьмите сборку для вашей операционной системы и распакуйте её туда, где сможете на неё ссылаться. Запомните путь, так как скрипту он понадобится. Современный Selenium часто может находить geckodriver автоматически, если он находится в вашем PATH, но передача явного пути является надёжным вариантом по умолчанию и именно таким подходом пользуется это руководство.

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

bash
python -m venv walmart_env
source walmart_env/bin/activate

pip install selenium random-user-agent

В Windows активируйте среду командой walmart_env\Scripts\activate вместо строки с source. Две зависимости выполняют основную работу: selenium управляет Firefox, а random-user-agent генерирует реалистичные строки user-agent, чтобы каждая сессия немного отличалась. User agent, небольшой штрих; именно прокси берёт на себя основную нагрузку по обходу блокировок.

Получение конечной точки Smart AI Proxy

Создайте аккаунт Crawlbase и откройте панель управления, чтобы найти токен доступа Smart AI Proxy. Прокси, это единственная конечная точка, на которую вы направляете Firefox, и она имеет следующий вид.

bash
http://[email protected]:8012

Хост: smartproxy.crawlbase.com, порт: 8012, ваш токен размещается на позиции пользователя перед @. Каждый запрос Firefox, отправленный через эту конечную точку, получает ротируемый жилой IP, так что вам не нужно самостоятельно управлять списком прокси. Бесплатного тарифа достаточно для прохождения всего этого руководства с публичной страницей, прежде чем вы примете решение о тарифе.

Keep your token out of source control

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

Настройка безголового Firefox для работы через Smart AI Proxy

Это ядро настройки: создайте объект параметров Firefox, который работает в безголовом режиме, несёт случайный user agent и маршрутизирует каждый запрос через Smart AI Proxy. Firefox принимает настройки прокси как предпочтения браузера, поэтому вы устанавливаете тип прокси в значение «manual» и указываете каждый протокол на хост и порт прокси.

python
import selenium.webdriver as webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from random_user_agent.user_agent import UserAgent
from random_user_agent.params import SoftwareName, OperatingSystem

user_agent_rotator = UserAgent(
    software_names=[SoftwareName.FIREFOX.value],
    operating_systems=[OperatingSystem.WINDOWS.value, OperatingSystem.LINUX.value],
    limit=100,
)
user_agent = user_agent_rotator.get_random_user_agent()

firefox_options = Options()
firefox_options.add_argument("--headless")
firefox_options.add_argument("--no-sandbox")
firefox_options.add_argument("--window-size=1420,1080")
firefox_options.add_argument("--disable-gpu")
firefox_options.add_argument(f"user-agent={user_agent}")

proxy_host = "http://[email protected]"
proxy_port = 8012

firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", proxy_host)
firefox_options.set_preference("network.proxy.http_port", proxy_port)
firefox_options.set_preference("network.proxy.ssl", proxy_host)
firefox_options.set_preference("network.proxy.ssl_port", proxy_port)
firefox_options.set_preference("network.http.use-cache", False)

Флаг --headless запускает Firefox без видимого окна, что нужно на сервере и обеспечивает низкое потребление ресурсов. Значение network.proxy.type, равное 1, означает «ручная настройка прокси», а следующие строки маршрутизируют HTTP и HTTPS (SSL) трафик через хост и порт Smart AI Proxy. Отключение кэша гарантирует, что каждый запуск получает свежую страницу, а не отдаёт устаревший контент. В прежней версии этой настройки также конфигурировались предпочтения FTP и SOCKS, но страница товара Walmart, это обычный HTTPS, поэтому от них можно отказаться.

Проверка работы прокси

Прежде чем направлять трафик на Walmart, убедитесь, что он действительно проходит через прокси. Самая простая проверка, обратиться к сервису, который отражает обратно запрашивающий IP. Загрузите httpbin.org/ip и выведите тело ответа: если рендеринг и маршрутизация работают, вы увидите один из жилых адресов прокси, а не свой собственный.

python
import os
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

driver_path = os.path.join(os.getcwd(), "drivers", "geckodriver")
service = Service(driver_path)
driver = webdriver.Firefox(service=service, options=firefox_options)

driver.get("https://httpbin.org/ip")

try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.TAG_NAME, "body"))
    )
    print(driver.find_element(By.TAG_NAME, "body").text)
finally:
    driver.quit()

Здесь WebDriverWait в паре с presence_of_element_located ждёт, пока на странице не появится элемент body, но не более десяти секунд, чтобы вы не читали DOM до его появления. Блок finally всегда закрывает сессию браузера, даже если ожидание истекло, что предотвращает накопление лишних процессов Firefox. При успешном запуске выводится примерно следующее.

json
{
  "origin": "51.15.242.202"
}

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

Crawlbase Walmart Scraper

Selenium рендерит страницы, но не скрывает ваш IP. Smart AI Proxy закрывает этот пробел как единственная подключаемая конечная точка: один раз направьте Firefox на неё, и каждый запрос будет ротировать жилые IP на стороне сервера, так что Walmart будет воспринимать ваш скрапер как реального посетителя, а не бота. Никакого списка прокси для управления, никакой логики ротации для написания. Сначала направьте его на публичную страницу товара на бесплатном тарифе.

Понимание структуры страницы товара Walmart

Чтобы извлечь поля со страницы товара Walmart, нужно знать, где они находятся в отрендеренном DOM. Самый чистый способ найти текущие селекторы, открыть страницу товара в браузере, щёлкнуть правой кнопкой мыши на нужном значении и выбрать «Inspect». Поля, которые извлекает это руководство, и разумные селекторы для них приведены ниже.

  • Product title самый заметный элемент на странице, h1 с атрибутом itemprop="name", поэтому XPath //h1[@itemprop="name"] его находит.
  • Product price отрендеренная в блоке покупки, обычно внутри элемента с itemprop="price", доступного через //span[@itemprop="price"].
  • Rating средний звёздный рейтинг, обычно отображается в aria label или специальном элементе рейтинга рядом с заголовком.
  • Review count количество отзывов покупателей, как правило, ссылка или span рядом с рейтингом.
Selectors drift

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

Извлечение полей товара

Проверив маршрутизацию и имея в руках селекторы, напишите функцию, которая переходит по URL товара, ждёт отрисовки названия и цены, и считывает поля. Цикл повторных попыток оборачивает всё это, чтобы один таймаут или временная блокировка не прерывали запуск; он пробует снова в новой сессии браузера до настраиваемого предела.

python
from selenium.common.exceptions import TimeoutException
from time import sleep

TITLE_XPATH = '//h1[@itemprop="name"]'
PRICE_XPATH = '//span[@itemprop="price"]'

def scrape_walmart_product(url, max_retries=3, retry_delay=5):
    for attempt in range(1, max_retries + 1):
        driver = webdriver.Firefox(service=service, options=firefox_options)
        try:
            driver.get(url)

            WebDriverWait(driver, 15).until(
                EC.presence_of_element_located((By.XPATH, TITLE_XPATH))
            )

            title = driver.find_element(By.XPATH, TITLE_XPATH).text.strip()
            price = read_optional(driver, PRICE_XPATH)

            return {"url": url, "title": title, "price": price}
        except TimeoutException:
            print(f"Timeout on attempt {attempt} for {url}")
        except Exception as error:
            print(f"Error on attempt {attempt}: {error}")
        finally:
            driver.quit()

        if attempt < max_retries:
            print(f"Retrying in {retry_delay}s...")
            sleep(retry_delay)

    return None

def read_optional(driver, xpath):
    try:
        return driver.find_element(By.XPATH, xpath).text.strip()
    except Exception:
        return None

Несколько решений делают этот код надёжным. Скрипт ждёт название перед чтением чего-либо ещё, поскольку название надёжно присутствует на каждой странице товара и сигнализирует о том, что страница отрендерилась. Цена, рейтинг и количество отзывов читаются через небольшой вспомогательный метод read_optional, который возвращает None, когда элемент отсутствует, вместо генерации исключения, поскольку не каждый товар имеет каждое поле. И каждая попытка создаёт и закрывает собственный браузер, чтобы повтор начинался с чистой сессии с новым IP прокси, а не повторно использовал скомпрометированный.

Полный скрипт

Вот всё, собранное в один работающий файл. Заполните токен доступа, укажите путь к geckodriver, измените URL товара и запустите.

python
import os
import json
from time import sleep
import selenium.webdriver as webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from random_user_agent.user_agent import UserAgent
from random_user_agent.params import SoftwareName, OperatingSystem

ACCESS_TOKEN = os.getenv("CRAWLBASE_PROXY_TOKEN", "YOUR_ACCESS_TOKEN")
PROXY_HOST = f"http://{ACCESS_TOKEN}@smartproxy.crawlbase.com"
PROXY_PORT = 8012

TITLE_XPATH = '//h1[@itemprop="name"]'
PRICE_XPATH = '//span[@itemprop="price"]'


def build_options():
    rotator = UserAgent(
        software_names=[SoftwareName.FIREFOX.value],
        operating_systems=[OperatingSystem.WINDOWS.value, OperatingSystem.LINUX.value],
        limit=100,
    )
    user_agent = rotator.get_random_user_agent()

    options = Options()
    options.add_argument("--headless")
    options.add_argument("--no-sandbox")
    options.add_argument("--window-size=1420,1080")
    options.add_argument("--disable-gpu")
    options.add_argument(f"user-agent={user_agent}")

    options.set_preference("network.proxy.type", 1)
    options.set_preference("network.proxy.http", PROXY_HOST)
    options.set_preference("network.proxy.http_port", PROXY_PORT)
    options.set_preference("network.proxy.ssl", PROXY_HOST)
    options.set_preference("network.proxy.ssl_port", PROXY_PORT)
    options.set_preference("network.http.use-cache", False)
    return options


def read_optional(driver, xpath):
    try:
        return driver.find_element(By.XPATH, xpath).text.strip()
    except Exception:
        return None


def scrape_walmart_product(url, service, options, max_retries=3, retry_delay=5):
    for attempt in range(1, max_retries + 1):
        driver = webdriver.Firefox(service=service, options=options)
        try:
            driver.get(url)
            WebDriverWait(driver, 15).until(
                EC.presence_of_element_located((By.XPATH, TITLE_XPATH))
            )
            return {
                "url": url,
                "title": driver.find_element(By.XPATH, TITLE_XPATH).text.strip(),
                "price": read_optional(driver, PRICE_XPATH),
            }
        except TimeoutException:
            print(f"Timeout on attempt {attempt} for {url}")
        except Exception as error:
            print(f"Error on attempt {attempt}: {error}")
        finally:
            driver.quit()

        if attempt < max_retries:
            print(f"Retrying in {retry_delay}s...")
            sleep(retry_delay)

    return None


def main():
    driver_path = os.path.join(os.getcwd(), "drivers", "geckodriver")
    service = Service(driver_path)
    options = build_options()

    product_url = "https://www.walmart.com/ip/Ozark-Trail-Basic-Mesh-Chair-Blue-Adult/577309300"
    result = scrape_walmart_product(product_url, service, options)

    if result:
        with open("walmart_product.json", "w") as f:
            json.dump(result, f, indent=2)
        print(json.dumps(result, indent=2))
    else:
        print("Could not scrape the product after all retries.")


if __name__ == "__main__":
    main()

Как выглядит результат

Запустите командой python walmart_scraper.py и получите чистые структурированные данные, записанные в walmart_product.json и выведенные в консоль.

json
{
  "url": "https://www.walmart.com/ip/Ozark-Trail-Basic-Mesh-Chair-Blue-Adult/577309300",
  "title": "Ozark Trail Basic Mesh Chair, Blue, Adult",
  "price": "$12.98"
}

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

Как оставаться незаблокированным при большом объёме

Smart AI Proxy берёт на себя ротацию IP, но несколько привычек помогают поддерживать здоровье более масштабного запуска, и они применимы к любой сложной коммерческой цели.

  • Регулируйте темп запросов. Интенсивная работа с Walmart в тесном цикле, самый быстрый способ получить ограничение. Распределяйте запросы и варьируйте товары, вместо того чтобы зацикливаться на одном URL.
  • Используйте ротацию. Smart AI Proxy распределяет ваш трафик по множеству реальных пользовательских IP, чтобы ни один адрес не превысил ограничение скорости. Это та часть, которую иначе пришлось бы собирать и поддерживать самостоятельно.
  • Читайте коды статусов. Запуск, который начинает возвращать запросы или пустые страницы, сообщает вам, что текущая скорость слишком высока. Воспринимайте коды ошибок статуса прокси как сигнал, а не шум, и снижайте нагрузку при их появлении.

Для получения более широкого руководства смотрите статью о том, как скрапить сайты без блокировок. Если вы предпочитаете полностью отказаться от безголового браузера и позволить API возвращать парсированные данные о товарах, сравните эту сборку с Crawling API, который возвращает предварительно парсированный JSON для поддерживаемых сайтов, или с Crawling API для получения отрендеренного HTML без самостоятельного запуска Selenium. Тот же паттерн Selenium работает и на других ритейлерах; скрапинг Amazon по ASIN описывает closely related job.

Законно ли скрапить Walmart?

Скрапинг крупного коммерческого ритейлера находится в правовой серой зоне, и ответ на вопрос «разрешено ли это» зависит от условий использования Walmart, вашей юрисдикции и того, что вы делаете с данными. Условия использования Walmart ограничивают автоматизированный доступ, поэтому скрапинг может противоречить этим условиям независимо от того, насколько тщательно настроен ваш инструментарий. Ни один из кодов здесь не меняет этого; он просто обеспечивает работоспособность технической части.

Несколько принципов, которых стоит придерживаться. Собирайте только публичные данные: название, цену, рейтинг и количество отзывов, которые любой может видеть без аккаунта. Соблюдайте файл robots.txt Walmart и его заявленные ожидания по скорости, и держите объём запросов достаточно низким, чтобы не перегружать чьи-либо серверы. Если вы планируете коммерческое повторное использование данных, получите разрешение или официальное соглашение об использовании данных, а не считайте молчание согласием. И никогда не собирайте персональные данные, включая всё, что связано с отдельными клиентскими аккаунтами или отзывами, атрибутируемыми реальным людям.

Это руководство намеренно ограничено публичными данными о товарах, поскольку это та черта, которая обеспечивает обоснованность работы. Оно не охватывает ничего за логином, данные аккаунтов или заказов, платёжные или кассовые действия, или любые попытки обойти аутентификацию или CAPTCHA, связанную с аккаунтом. Если вашему проекту нужно больше, чем публичные поля товаров, правильным шагом является официальный API или соглашение об использовании данных с Walmart, а не более умный скрапер.

Итоги

Ключевые выводы

  • Разделите задачу. Selenium рендерит и читает страницу; Smart AI Proxy обрабатывает сеть. Каждый инструмент выполняет свою часть, и именно это разделение делает скрапер надёжным.
  • Направьте Firefox через прокси. Установите network.proxy.type в режим manual и направьте HTTP и SSL на smartproxy.crawlbase.com:8012 с вашим токеном, затем проверьте через httpbin.org/ip перед скрапингом.
  • Дождитесь, затем читайте. Используйте WebDriverWait на название перед извлечением, и читайте необязательные поля через вспомогательный метод, который возвращает None при отсутствии элемента.
  • Ожидайте дрейфа селекторов. Walmart меняет разметку без предупреждения, поэтому повторно проверяйте и обновляйте XPath, когда извлечение возвращает пустые строки.
  • Оставайтесь в рамках публичных данных. Соблюдайте ToS и robots.txt Walmart; никаких аккаунтов, персональных данных, кассовых или авторизационных действий.

Часто задаваемые вопросы

Почему простой запрос не возвращает данные со страницы товара Walmart?

Против обычного HTTP-запроса работают два фактора. Во-первых, Walmart рендерит большую часть деталей товара на стороне клиента, поэтому исходный HTML является оболочкой, которая заполняется только после того, как JavaScript страницы выполняется в реальном браузере. Во-вторых, Walmart быстро помечает автоматизированный трафик и ограничивает или блокирует его. Selenium решает проблему рендеринга, управляя реальным Firefox, а маршрутизация этого браузера через Smart AI Proxy даёт вам IP, который сайт воспринимает как реального посетителя.

Нужен ли прокси для скрапинга Walmart с помощью Selenium?

Для всего, что выходит за рамки одного тестового запроса, да. Selenium рендерит страницу, но по умолчанию отправляет запросы с вашего собственного IP, а Walmart быстро ограничивает или блокирует повторный автоматизированный трафик. Маршрутизация Firefox через Smart AI Proxy ротирует ваши запросы через жилые IP на стороне сервера, чтобы ни один адрес не превысил ограничение скорости. Это разница между демонстрацией, работающей один раз, и скрапером, который продолжает работать.

Как направить Firefox на Smart AI Proxy в Selenium?

Установите предпочтение Firefox network.proxy.type в 1 для ручной конфигурации, затем установите network.proxy.http и network.proxy.ssl в http://[email protected] с соответствующими предпочтениями _port, установленными в 8012. Передайте эти параметры при создании драйвера, и каждый запрос Firefox будет выходить через прокси. Проверьте это, загрузив httpbin.org/ip и убедившись, что возвращённый адрес не ваш собственный.

Мои XPath-селекторы возвращают пустые строки. Что изменилось?

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

Что лучше использовать для скрапинга Walmart: Selenium или API?

Используйте Selenium, когда вам нужен полный контроль над реальным браузером, необходимо взаимодействовать со страницей или вы изучаете, как рендеринг и прокси сочетаются между собой. Если вы предпочитаете отказаться от безголового браузера, Scraper API возвращает предварительно парсированный JSON о товарах для поддерживаемых сайтов, а Crawling API возвращает отрендеренный HTML в одном вызове без самостоятельного запуска флота браузеров. Для разовых или нестандартных макетов сборка Selenium из этого руководства является гибким вариантом.

Законно ли скрапить Walmart?

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

Начать создавать

Обходите любой сайт в масштабе, без борьбы с инфраструктурой.

Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.

Самообслуживание · Звонок отдела продаж не требуется · Доступны корпоративные объёмы краулинга