Руководства

Парсинг Lazada: как извлечь данные на Python, настроить прокси и выбрать сервис

Парсинг Lazada на Python: разбор сохранённого HTML, проверка товаров и экспорт в CSV. Настройка Socks5.IO, сравнение цен и выбор сервиса сбора данных.

Kevin LinKevin Lin17 мин. чтения

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

В руководстве есть полный локальный пример на Python: он разбирает HTML, проверяет поля и сохраняет CSV. Также разберём динамические страницы, настройку Socks5.IO и выбор сервиса сбора данных. Пример использует вымышленные товары и не подтверждает структуру действующей страницы Lazada. Загрузку страниц через браузер нужно реализовать отдельно для источника, который разрешено использовать.

Перед началом:

  • Согласуйте условия сравнения. Вариант товара, продавец, доставка и право на скидку влияют на итоговую цену.
  • Отделяйте сетевую часть от данных. Socks5.IO предоставляет прокси-маршрут, а не каталог товаров или разрешение на сбор.
  • Начните с небольшой выборки. Проверяйте охват, свежесть и пропуски, а не только число строк.
collection-contract

1. Сначала выберите способ доступа к данным Lazada

Для собственного магазина сначала проверьте официальный API. Для разрешённого сбора со страниц выбирайте между своим парсером, визуальным инструментом и подрядчиком — по нужным полям и ресурсам на поддержку.

Задача Первый вариант Что проверить
Каталог своего магазина и бизнес-интеграция Lazada Open Platform Права приложения, разрешение продавца, поля API и лимиты
Небольшой согласованный список товаров Python или браузерный сборщик Разрешённый объём, структуру страницы, рынок, вариант и время сбора
Сбор без разработки парсера Визуальный инструмент без кода Совместимость шаблона, пагинацию и экспорт
Регулярная поставка готовых данных Сервис сбора данных Охват, задержку, определения полей, права на источник и приёмку

Документация Lazada об авторизации продавца описывает доступ к его бизнес-данным. Такая интеграция не открывает автоматически сведения обо всех конкурентах. Проверяйте права для конкретного API: наличие ключа не означает доступ ко всему маркетплейсу.

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

2. Какие поля нужны для парсинга товаров Lazada

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

Группа Что сохранять Типичная ошибка
Источник и время Рынок, URL, время сбора, ID запуска, способ получения Считать старую цену актуальной
Идентификация ID товара, SKU или ID варианта, продавец, бренд, количество и упаковку Объединять разные варианты по названию
Цена на странице Сумму, валюту, тип цены, выбранный вариант Принимать цену «от» или зачёркнутую цену за текущую
Условия покупки Доставку, налоги, адрес назначения, купоны и условия программы лояльности Выдавать цену на странице за полную стоимость
Наличие Явный статус, вариант, время проверки Считать пропуск поля отсутствием товара
Оценки Значение, верхнюю границу шкалы, число оценок или отзывов, объект оценки Приписывать товару рейтинг магазина
Изображения URL и связь с товаром или вариантом Считать ссылку на CDN разрешением на публикацию

LazMall, отправление и акции: что учитывать отдельно

Эти поля описывают разные свойства предложения. Не заполняйте их по косвенным признакам.

Поле Как заполнять Если сведений нет
listing_type Видимая отметка LazMall или подтверждённая категория Marketplace с основанием unknown: отсутствие отметки в части ответа не доказывает Marketplace
cross_border Явно указанная трансграничная продажа unknown: не определять по названию магазина
ship_from_country Страна отправления отдельно от рынка и продавца Пустое значение, не выбранный рынок
shipping_fee / shipping_currency Сумма и валюта для конкретного адреса, количества и способа доставки Пустое значение, не ноль
lead_time_days Диапазон дней, дата проверки, адрес назначения и исходная формулировка Пустое значение, без выдуманной точной оценки
platform_voucher / seller_voucher Право на купон, минимальная сумма, предел скидки, срок и условия — отдельно для каждого типа Пустое значение, без автоматического вычета
bundle_offer Состав набора, количество, варианты и условия скидки Пустое значение, не цена одной единицы
lazada-specific-fields

Отметка LazMall не доказывает местную отправку и не гарантирует одинаковую доставку для всех заказов. Страница услуг LazMall описывает преимущества с условиями применения. Проверяйте их для выбранного предложения. Название магазина также не показывает, откуда отправят посылку.

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

Условия Lazada для Сингапура также разделяют стоимость и условия доставки. Не переносите правила одного рынка на другой без проверки.

local-vs-crossborder

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

Рынок, адрес доставки и выходной IP — разные настройки

Типичные пары: Сингапур — SGD, Малайзия — MYR, Филиппины — PHP, Таиланд — THB, Индонезия — IDR, Вьетнам — VND. Записывайте фактический сайт и валюту. Замена страны в CSV не превращает сингапурскую запись в данные малайзийского рынка.

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

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

3. Как разобрать данные Lazada на Python и выгрузить CSV

Сначала проверьте извлечение из сохранённого HTML, затем подключайте загрузку страниц. Пример локально разбирает JSON-LD, проверяет поля и создаёт CSV с журналом запуска.

Поддерживается ограниченная часть Schema.org Product и Offer:

  • Product находится в корне документа или в @graph.
  • На каждый Product приходится один конкретный Offer.
  • Развёртывание контекста JSON-LD и разрешение ссылок @id не выполняются.
  • Для AggregateOffer, нескольких Offer, вложенных ItemList или ProductGroup нужен отдельный адаптер — код сопоставления структуры источника с полями выгрузки.

Это учебный формат, а не подтверждённая схема текущей страницы Lazada.

Шаг 1. Подготовьте виртуальное окружение

Используйте Python 3.10 или новее. Windows PowerShell:

powershellpowershell
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install "beautifulsoup4>=4.13,<5"

macOS или Linux:

bashbash
python3 -m venv .venv
.venv/bin/python -m pip install "beautifulsoup4>=4.13,<5"

Дальше команды обращаются к Python из виртуального окружения напрямую. Активировать его отдельно не нужно. Полный код приведён ниже; дополнительный пакет с программой скачивать не требуется.

Шаг 2. Сохраните программу

Схема обработки: сохранённый HTML → Product в JSON-LD → один Offer → проверка полей → CSV.

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

Сохраните программу в lazada_extract.py. Имена полей, коды ошибок и сообщения оставлены без изменений для сверки с выводом.

pythonpython
import argparse
import csv
import hashlib
import json
import re
import sys
from datetime import datetime, timezone
from decimal import Decimal
from pathlib import Path
from urllib.parse import urlsplit, urlunsplit
from uuid import uuid4
from bs4 import BeautifulSoup

MAX_BYTES = 2_000_000
MARKETS = {
    "SG": ("www.lazada.sg", "SGD"), "MY": ("www.lazada.com.my", "MYR"),
    "PH": ("www.lazada.com.ph", "PHP"), "TH": ("www.lazada.co.th", "THB"),
    "ID": ("www.lazada.co.id", "IDR"), "VN": ("www.lazada.vn", "VND")}
FIXTURE_PRODUCTS = [
    {"@type": "Product", "productID": "DEMO-ITEM-01", "sku": "DEMO-BLUE",
     "name": "Fictional travel mug - blue, 350 ml",
     "url": "https://catalog.example.invalid/mug-blue",
     "image": "https://images.example.invalid/mug-blue.jpg",
     "aggregateRating": {"ratingValue": "4.6", "bestRating": "5", "ratingCount": "12"},
     "offers": {"@type": "Offer", "price": "24.90", "priceCurrency": "SGD",
                "seller": {"name": "Demo Seller"},
                "availability": "https://schema.org/InStock"}},
    {"@type": "Product", "productID": "DEMO-ITEM-02", "sku": "DEMO-RED",
     "name": "Fictional travel mug - red, 350 ml",
     "url": "https://catalog.example.invalid/mug-red",
     "offers": {"@type": "Offer", "price": "26.50", "priceCurrency": "SGD",
                "seller": {"name": "Demo Seller"}}}]
FIXTURE = ('<html><script type="application/ld+json">' +
           json.dumps({"@context": "https://schema.org", "@graph": FIXTURE_PRODUCTS}) +
           '</script></html>').encode()

def fail(code):
    raise ValueError(code)

def typed(node, expected):
    value = node.get("@type", []) if isinstance(node, dict) else []
    return value == expected or (isinstance(value, list) and expected in value)

def text(value):
    return str(value).strip() if isinstance(value, (str, int, float, Decimal)) and not isinstance(value, bool) else ""

def safe_url(value, host=None):
    p = urlsplit(text(value))
    if p.scheme != "https" or not p.hostname or p.username or p.password or p.port not in (None, 443):
        fail("FIELD_URL")
    if host and p.hostname.lower() != host:
        fail("MARKET_HOST")
    return urlunsplit((p.scheme, p.netloc, p.path, "", ""))

def products_from_html(data):
    if len(data) > MAX_BYTES:
        fail("INPUT_SIZE")
    nodes = []
    for tag in BeautifulSoup(data, "html.parser").select('script[type="application/ld+json"]'):
        parsed = json.loads(tag.get_text(), parse_float=Decimal,
                            parse_constant=lambda value: fail("JSON_NUMBER"))
        roots = parsed if isinstance(parsed, list) else [parsed]
        for root in roots:
            if not isinstance(root, dict):
                continue
            if typed(root, "Product"):
                nodes.append(root)
            graph = root.get("@graph", [])
            if not isinstance(graph, list):
                fail("JSON_GRAPH")
            nodes.extend(node for node in graph if typed(node, "Product"))
    if not nodes:
        fail("NO_PRODUCT_ADAPTER")
    return nodes

def extract(data, market, kind, observed_at, run_id):
    host, currency = MARKETS[market]
    if kind == "synthetic_fixture":
        host = "catalog.example.invalid"
    rows, seen = [], set()
    for product in products_from_html(data):
        offer = product.get("offers")
        if isinstance(offer, list) and len(offer) == 1:
            offer = offer[0]
        if not typed(offer, "Offer"):
            fail("OFFER_ADAPTER")
        amount = text(offer.get("price"))
        if not re.fullmatch(r"\d+(?:\.\d+)?", amount) or Decimal(amount) <= 0:
            fail("FIELD_AMOUNT")
        if text(offer.get("priceCurrency")) != currency:
            fail("MARKET_CURRENCY")
        name = text(product.get("name"))
        url = safe_url(product.get("url"), host)
        if not name or url in seen:
            fail("IDENTITY_OR_DUPLICATE")
        seen.add(url)
        seller = offer.get("seller", {})
        seller = text(seller.get("name")) if isinstance(seller, dict) else ""
        availability = text(offer.get("availability"))
        stock = {"https://schema.org/InStock": "in_stock",
                 "https://schema.org/OutOfStock": "out_of_stock"}.get(availability, "unknown")
        rating = product.get("aggregateRating", {})
        if not isinstance(rating, dict):
            rating = {}
        image = product.get("image", "")
        if isinstance(image, list):
            image = image[0] if image else ""
        image = safe_url(image) if image else ""
        item_id, sku = text(product.get("productID")), text(product.get("sku"))
        review = ["purchase_conditions_unverified"]
        for missing, label in [(not item_id, "item_id_missing"), (not sku, "sku_missing"),
                               (not seller, "seller_missing"), (stock == "unknown", "availability_unknown")]:
            if missing:
                review.append(label)
        rows.append(dict(item_id=item_id, sku=sku, title=name, seller=seller,
                         display_price=str(Decimal(amount)), currency=currency,
                         availability=stock, listing_type="unknown", cross_border="unknown",
                         ship_from_country="", shipping_fee="", shipping_currency="",
                         lead_time_days="", platform_voucher="", seller_voucher="", bundle_offer="",
                         rating_value=text(rating.get("ratingValue")),
                         rating_scale=text(rating.get("bestRating")),
                         rating_count=text(rating.get("ratingCount")), image_url=image,
                         source_url=url, requested_market=market, source_kind=kind,
                         source_observed_at_utc=observed_at, run_id=run_id,
                         comparison_eligible=False, review_reason=";".join(review)))
    return rows

def main():
    p = argparse.ArgumentParser()
    p.add_argument("--input", type=Path)
    p.add_argument("--approved", action="store_true")
    p.add_argument("--market", choices=MARKETS, default="SG")
    p.add_argument("--observed-at")
    p.add_argument("--out", type=Path, required=True)
    a = p.parse_args()
    log_path = a.out.with_suffix(".run.json")
    if a.out.exists() or log_path.exists():
        fail("OUTPUT_EXISTS")
    if a.input:
        if not a.approved or not a.observed_at:
            fail("REQUIRE_APPROVAL_AND_CAPTURE_TIME")
        stamp = datetime.fromisoformat(a.observed_at.replace("Z", "+00:00"))
        if stamp.tzinfo is None:
            fail("CAPTURE_TIME_ZONE")
        observed = stamp.astimezone(timezone.utc).isoformat()
        with a.input.open("rb") as handle:
            data = handle.read(MAX_BYTES + 1)
        kind = "approved_saved_html"
    else:
        if a.market != "SG":
            fail("FIXTURE_IS_SG_ONLY")
        data, kind, observed = FIXTURE, "synthetic_fixture", "2026-10-27T00:00:00+00:00"
    run_id = uuid4().hex
    rows = extract(data, a.market, kind, observed, run_id)
    log = dict(run_id=run_id, source_kind=kind, requested_market=a.market,
               source_observed_at_utc=observed,
               processed_at_utc=datetime.now(timezone.utc).isoformat(),
               input_sha256=hashlib.sha256(data).hexdigest(),
               records_exported=len(rows), proxy_tested=False)
    with log_path.open("x", encoding="utf-8") as handle:
        json.dump(log, handle, indent=2)
    with a.out.open("x", encoding="utf-8", newline="") as handle:
        writer = csv.DictWriter(handle, fieldnames=list(rows[0]))
        writer.writeheader()
        writer.writerows(rows)
    print(f"Exported {len(rows)} records; inspect review_reason before analysis.")

if __name__ == "__main__":
    try:
        main()
    except Exception as error:
        allowed = {"INPUT_SIZE", "FIELD_URL", "MARKET_HOST", "JSON_NUMBER", "JSON_GRAPH",
                   "NO_PRODUCT_ADAPTER", "OFFER_ADAPTER", "FIELD_AMOUNT", "MARKET_CURRENCY",
                   "IDENTITY_OR_DUPLICATE", "OUTPUT_EXISTS", "REQUIRE_APPROVAL_AND_CAPTURE_TIME",
                   "CAPTURE_TIME_ZONE", "FIXTURE_IS_SG_ONLY"}
        code = str(error) if isinstance(error, ValueError) and str(error) in allowed else "INPUT_OR_OUTPUT_ERROR"
        print("Stopped:", code, "- inspect input and configuration privately.", file=sys.stderr)
        sys.exit(1)

Ограничения результата:

  • productID и sku берутся из источника. Перед объединением таблиц проверьте, соответствуют ли они идентификаторам товара и варианта на Lazada.
  • Рейтинг сохраняется как исходный текст. Программа не проверяет достоверность оценок и не пересчитывает их. Если верхняя граница шкалы отсутствует, она не подставляет 5.
  • Столбцы Lazada подготовлены, но общий JSON-LD-парсер их не заполняет. listing_type и cross_border остаются unknown, а отправление, доставка и скидки — пустыми.
  • comparison_eligible остаётся False до реализации отдельной проверки условий покупки.

Дедупликация использует URL без строки запроса и фрагмента. Разные варианты с одним путём могут считаться дублями, а один товар по разным путям — разными записями. Для рабочего сбора задайте ключ из проверенных идентификаторов товара, варианта и продавца с учётом задачи.

Шаг 3. Запустите пример и проверьте CSV

Windows PowerShell:

powershellpowershell
.\.venv\Scripts\python.exe lazada_extract.py --out lazada-demo.csv

macOS или Linux:

bashbash
.venv/bin/python lazada_extract.py --out lazada-demo.csv

Ожидаемые значения:

Товар
SKU
Цена на странице
Наличие
Допуск к сравнению
DEMO-ITEM-01
DEMO-BLUE
SGD 24.90
in_stock
False
DEMO-ITEM-02
DEMO-RED
SGD 26.50
unknown
False

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

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

local-csv
local-provenance

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

Шаг 4. Адаптируйте парсер под разрешённую страницу

Сначала изучите сохранённый ответ. Если есть подходящие Product и Offer, сверьте поля с выбранным предложением. Если используется другая встроенная структура или DOM после JavaScript, измените адаптер под неё. Не подставляйте предполагаемые CSS-селекторы, закрытые API или JSON-поля из старого руководства.

После настройки обработайте сохранённую сингапурскую страницу. Замените дату в команде фактическим временем получения файла.

Windows PowerShell:

powershellpowershell
.\.venv\Scripts\python.exe lazada_extract.py --input approved-product.html --approved --market SG --observed-at "2026-10-27T09:00:00+08:00" --out approved-sg.csv

macOS или Linux:

bashbash
.venv/bin/python lazada_extract.py --input approved-product.html --approved --market SG --observed-at "2026-10-27T09:00:00+08:00" --out approved-sg.csv

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

Из URL в CSV удаляются строка запроса и фрагмент. Если они содержат вариант или параметры сбора, храните полный разрешённый URL и сведения о выборе отдельно, с ограничением доступа и привязкой по run_id. Не восстанавливайте вариант по очищенной ссылке и не публикуйте токены аккаунта. Хеш HTML связывает выгрузку с файлом, но не подтверждает содержание действующей страницы.

4. Что делать, если данные появляются после JavaScript

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

  1. Откройте разрешённый URL в новом браузерном контексте с заданными настройками. Запишите рынок, адрес доставки и вариант.
  2. Проверьте ответ основной навигации и конечный URL. При отказе, проверке доступа, требовании входа или неожиданном переходе остановитесь. Не решайте ограничение повторными запросами через новые IP.
  3. Дождитесь конкретного признака готовности товара или варианта, проверенного на этом источнике. Фиксированная пауза и наличие body недостаточны.
  4. Сопоставьте название, продавца, вариант, цену и валюту. Сохраните разрешённый HTML после отрисовки и время получения в защищённом хранилище.
  5. Запустите адаптированный парсер и сверьте CSV с предложением. Только затем добавляйте другие URL или пагинацию.

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

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

Раздел описывает порядок сбора. Готового браузерного сборщика и универсальных селекторов для текущих страниц Lazada в примере нет.

5. Как настроить прокси Socks5.IO для парсинга Lazada

Socks5.IO используют, когда задаче нужен определённый регион выхода или резидентский маршрут. Сначала проверьте протокол и авторизацию, затем подтвердите маршрут в том же браузере, который собирает данные.

Можно рассмотреть резидентские прокси с ротацией. Перед покупкой проверьте доступность страны, режим сессии и условия продукта. Заявленный географический охват не равен успешному тесту подключения к конкретной странице Lazada.

В панели управления:

  1. Выберите резидентский продукт.
  2. Откройте Proxy Setup.
  3. Настройте пользователя прокси и способ авторизации.
  4. Укажите регион и режим сессии.
  5. Выберите совместимый протокол.
  6. Получите хост, порт и учётные данные.

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

Согласуйте протокол с возможностями браузера

Документация Playwright по сети описывает HTTP(S) и SOCKSv5, но поля имени пользователя и пароля указывает для HTTP(S)-прокси. Строка авторизованного SOCKS5-подключения, работающая в Requests, не обязательно заработает без изменений в Chromium.

Используйте фрагмент ниже, только если продукт выдаёт совместимый HTTP(S)-шлюз. Здесь указан именно HTTP-шлюз. Скопируйте его хост и порт в соответствующие переменные окружения, а не из строки SOCKS-only.

pythonpython
# Configuration excerpt inside your approved Playwright collector, not a standalone scraper.
import os
proxy = {
    "server": "http://" + os.environ["SOCKS5IO_HTTP_HOST"] + ":" + os.environ["SOCKS5IO_HTTP_PORT"],
    "username": os.environ["SOCKS5IO_USER"],
    "password": os.environ["SOCKS5IO_PASSWORD"],
}
# browser = playwright.chromium.launch(proxy=proxy)

Это конфигурация для существующего сборщика Playwright, а не самостоятельный парсер. Нельзя превратить SOCKS-only в HTTP заменой префикса URL. Для SOCKS-only проверьте поддерживаемый клиент и авторизацию отдельно: этот словарь их не реализует.

Храните пароль в защищённом окружении или менеджере секретов. Не выводите proxy в журнал и не отключайте проверку TLS-сертификатов.

Схема адреса прокси задаёт подключение к шлюзу, а не протокол целевой страницы. HTTPS в URL товара не требует автоматически указывать https:// в server. Используйте схему провайдера с учётом возможностей клиента.

http-vs-socks

Проверьте выходной IP в рабочем браузерном контексте

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

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

Если нужна непрерывная сессия, выберите поддерживаемый режим sticky session — удержание выходного IP в рамках сессии. Проверяйте срок её действия, доступность шлюза и фактический адрес. Один экземпляр браузера не гарантирует постоянный IP. SOCKS5 не становится автоматически быстрее или безопаснее для Lazada, а смена протокола не исправляет неверные правила извлечения.

6. Как разбирать ошибки и оценивать качество

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

Ситуация Следующее действие
HTTP 401/403, запрос входа или проверка доступа Остановить сбор, проверить права и фактический ответ
HTTP 429 Остановить сбор, проверить лимит и допустимые повторы для всех рабочих процессов
NO_PRODUCT_ADAPTER Изучить файл и адаптировать разбор под найденную структуру
OFFER_ADAPTER Отдельно обработать диапазоны цен, несколько Offer или иной формат
MARKET_HOST / MARKET_CURRENCY Проверить рынок, ссылку и фактическую валюту
FIELD_AMOUNT Различить обычную, справочную цену и диапазон; отклонить пустые и неположительные значения
Неизвестны вариант, продавец или условия Оставить запись на проверке, не включать в сравнение
Изменились разметка или JSON Обновить версию адаптера и проверить на разрешённых сохранённых примерах

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

Лимит 2 000 000 байт ограничивает чтение файла, а не общий расход памяти и CPU при произвольном вредоносном вводе. Для рабочих задач нужны ограничения времени выполнения и поддерживаемые зависимости.

Считайте отдельно:

  • запланированные проверки источников;
  • успешные ответы;
  • записи, прошедшие проверку структуры;
  • предложения, допущенные к сравнению;
  • дубли;
  • время с момента получения данных.

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

Формула затрат:

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

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

7. Парсинг Lazada на заказ, собственный код или инструмент без кода

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

Подход Когда подходит Что спросить
API собственного магазина Нужны данные авторизованного продавца Доступны ли операции и поля приложению и продавцу?
Свой Python-код и браузер Нужны собственные проверки и есть ресурсы на разработку Кто поддерживает рынки, измеряет свежесть и охват?
Визуальный инструмент Нужен небольшой процесс без значительной разработки Работает ли шаблон с текущей страницей, вариантами и пагинацией?
Сервис сбора Важнее получать выгрузку, чем поддерживать сборщик Что считается принятой записью, неудачной проверкой и единицей оплаты?

Руководство Octoparse по Lazada показывает визуальную настройку и экспорт. Страница Actowiz описывает сбор под заказ и варианты через API.

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

reference-no-code

Зафиксируйте пять групп требований:

  1. Охват: страна, сайт, список источников или способ поиска, варианты, продавцы и исключения.
  2. Поля: идентификаторы, отображаемая и полная цена, валюта, оценки, наличие, пропуски.
  3. Свежесть: время получения, срок передачи, периодичность, действия при недоступности.
  4. Качество: дедупликация, выборочная сверка, записи на проверке, знаменатель охвата, реакция на изменения сайта.
  5. Оплата и использование: единица тарификации, минимальный объём, неудачные проверки, исправления, замены, хранение и повторное использование.

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

8. Пример: мониторинг цен на Lazada в Сингапуре

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

Допустим, бренд согласовал список из 20 товаров или вариантов сингапурского рынка и получил разрешение проверять каждый товар или вариант один раз в день. Цель — отслеживать изменения своего сопоставленного ассортимента, а не собирать всех продавцов и все отзывы.

20 проверок не равны 20 браузерным запросам: страница может загружать много ресурсов. Неудачные проверки тоже учитываются в охвате.

Команда связывает товар источника, вариант и продавца с внутренним номером каталога. Сохраняет цену, SGD и наличие, а доставку и купоны учитывает отдельно. В этом бизнес-примере синяя кружка 350 мл и красная 500 мл не считаются одинаковыми предложениями. Это отдельная иллюстрация, не описание двух товаров из кода. Пропущенный статус наличия вызывает проверку, а не уведомление об отсутствии.

Дополнительно команда:

  • сохраняет listing_type, cross_border, ship_from_country, shipping_fee и lead_time_days;
  • различает LazMall и Marketplace, но не определяет страну отправления по отметке;
  • не включает зарубежный товар с долгой доставкой в группу местных предложений с быстрой доставкой;
  • откладывает сравнение, если отправление, стоимость или срок доставки неизвестны.

Модуль скидок обрабатывает platform_voucher, seller_voucher и bundle_offer раздельно. Для одинакового количества товара проверяет варианты, минимальную сумму, предел скидки, срок и совмещение. Без этих условий отчёт показывает только цену на странице, без расчёта экономии с доставкой и купонами.

voucher-conditions

Отдельный этап разрешает уведомления только после проверки условий покупки. В коде comparison_eligible остаётся False: оформление заказа и расчёт купонов не реализованы. Проверенные отображаемые цены всё же подходят для анализа динамики, если явно указать условия анализа.

Если нужен выход из Сингапура, команда выбирает доступный маршрут и проверяет его в рабочем клиенте. Затем измеряет принятые записи и расходы на сопровождение. Это проектный пример, не клиентский кейс и не утверждение о проверенном подключении Socks5.IO к Lazada.

9. Итог: проверяйте данные до расширения сбора

Надёжный парсинг Lazada начинается с прав доступа и правил обработки. Для каждой записи должны быть известны товар, вариант, время получения и смысл цены.

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

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

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

Для анализа ассортимента, исследования товаров и мониторинга цен по разрешённым источникам. Сохраняйте рынок, URL, время и конкретный вариант. Для динамики отображаемой цены и сравнения полной стоимости нужны разные поля. Число строк показывает объём, но не охват, свежесть или качество обработки пропусков.

Последние статьи

Иллюстрация глобальной прокси-сети

Подключитесь к глобальной прокси-сети — каждое соединение будет быстрее и стабильнее

Начни бесплатно