AliExpress через IPv6 прокси: парсинг товаров и сравнение цен
Содержание
- Почему IPv4-прокси быстро сдыхают
- Что именно отдаёт AliExpress по гео
- Как работает IPv6-прокси в парсинге AliExpress
- Практика: запрос через IPv6-прокси
- Python: пул IPv6 с ротацией
- Парсинг цены из HTML
- Кейс: сравнение цен между регионами
- Кейс: обход капчи при частых запросах
- Кейс: парсинг авторизованной корзины
- Ошибки, которые ломают парсинг
- Инфраструктура: что нужно на стороне клиента
- Итоги по цифрам
AliExpress отдаёт разный контент в зависимости от региона. Цены, наличие товара, доступные способы доставки — всё это меняется, если зайти с российского, немецкого или бразильского IP. Для парсинга это критично: один и тот же SKU может стоить 1200 рублей из Москвы и 980 рублей из Алматы. Разбираем, как IPv6-прокси решают задачу сбора данных и сравнения цен.
Почему IPv4-прокси быстро сдыхают
AliExpress использует многоуровневую защиту. Первый слой — rate limiting по IP. Второй — поведенческий анализ. Третий — TLS fingerprinting. С обычными IPv4-прокси из датацентров вы упираетесь в бан через 200-400 запросов. Пул /24 быстро выжигается: платформа банит всю подсеть целиком, как только видит подозрительную активность с нескольких адресов.
IPv6 меняет расклад. Провайдер выдаёт /64 — это 18 квинтиллионов адресов. Даже /48 даёт 65536 подсетей по /64. Ротация идёт не по одному адресу, а по целым блокам. AliExpress физически не может забанить /64 без риска отрезать легитимных пользователей мобильных операторов, где IPv6 раздаётся массово.
Плюс IPv6 дешевле. Провайдеры сдают /64 в аренду за копейки, потому что адресное пространство не дефицитное. Для парсинга маркетплейсов это главный аргумент.
Что именно отдаёт AliExpress по гео
Платформа определяет регион по нескольким сигналам. IP — основной. Дальше идут Accept-Language, cookie `aep_usuc_f` (там хранятся country, region, currency), заголовок `x-forwarded-for` если он есть. Приоритет — за IP.
Вот что меняется:
| Параметр | RU | DE | BR |
|---|---|---|---|
| Валюта по умолчанию | RUB | EUR | BRL |
| НДС в цене | включён | включён (19%) | включён (ICMS) |
| Срок доставки | 14-30 дней | 7-14 дней | 20-45 дней |
| Доступные склады | RU, CN | DE, PL, CN | BR, CN |
| Способ оплаты | карты РФ, СБП | SEPA, карты | Boleto, Pix |
Цена на один и тот же товар формируется из базовой стоимости в USD, региональной наценки, локальных налогов и логистики. Разница между регионами достигает 40%. Без гео-ротации вы видите только одну цену и строите неверную аналитику.
Как работает IPv6-прокси в парсинге AliExpress
Схема простая. У вас есть пул IPv6-адресов, привязанных к разным гео. Клиент (скрипт-парсер) шлёт запрос через прокси, AliExpress видит IP из нужного региона и отдаёт контент для этого региона. Меняете адрес — меняете регион.
Ключевой момент: IPv6-адрес должен быть «чистым». Если он уже засветился в парсинге, AliExpress может отдавать капчу или заглушку. Хорошие провайдеры дают residential или mobile IPv6, которые не отличаются от адресов обычных пользователей.
Второй момент — стабильность сессии. AliExpress привязывает корзину и историю просмотров к cookie + IP. Если IP меняется на каждом запросе, платформа может сбросить сессию и показать капчу. Для сбора цен это не критично, для авторизованного парсинга — критично.
Практика: запрос через IPv6-прокси
Проверяем, что прокси действительно IPv6 и отдаёт нужный регион:
```bash
curl -6 -x "http://[2001:db8:1234::1]:8080" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
-H "Accept-Language: de-DE,de;q=0.9" \
"https://ipv6.icanhazip.com"
```
Флаг `-6` заставляет curl использовать IPv6. Адрес в квадратных скобках — обязательное требование для IPv6 в URL. Если прокси отдаёт IPv4, значит либо он не поддерживает IPv6, либо вы стучитесь не туда.
Теперь запрос к самому AliExpress с получением цены:
```bash
curl -x "http://[2001:db8:1234::1]:8080" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
-H "Accept-Language: de-DE,de;q=0.9" \
-H "Cookie: aep_usuc_f=site=glo&c_tp=EUR®ion=DE&b_locale=de_DE" \
"https://de.aliexpress.com/item/1005006123456789.html" \
-o product_de.html
```
Cookie `aep_usuc_f` здесь дублирует гео. Если IP немецкий, а cookie российская, AliExpress может выбрать что-то одно. На практике IP весит больше, но лучше синхронизировать оба сигнала.
Python: пул IPv6 с ротацией
Для массового парсинга нужен пул адресов и логика ротации. Вот рабочий пример на requests с round-robin:
```python
import requests
from itertools import cycle
from time import sleep
PROXIES = [
"http://[2001:db8:1234::1]:8080",
"http://[2001:db8:1234::2]:8080",
"http://[2001:db8:1234::3]:8080",
"http://[2001:db8:1234::4]:8080",
]
GEO_HEADERS = {
"DE": {"Accept-Language": "de-DE,de;q=0.9"},
"RU": {"Accept-Language": "ru-RU,ru;q=0.9"},
"BR": {"Accept-Language": "pt-BR,pt;q=0.9"},
}
proxy_pool = cycle(PROXIES)
def fetch_price(item_id, geo):
proxy = next(proxy_pool)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
**GEO_HEADERS[geo],
"Cookie": f"aep_usuc_f=site=glo&c_tp={'EUR' if geo=='DE' else 'RUB'}®ion={geo}",
}
url = f"https://{geo.lower()}.aliexpress.com/item/{item_id}.html"
try:
r = requests.get(url, headers=headers, proxies={"http": proxy, "https": proxy}, timeout=15)
return r.status_code, len(r.text)
except requests.RequestException as e:
return None, str(e)
for i in range(20):
status, size = fetch_price("1005006123456789", "DE")
print(f"request {i}: status={status} size={size}")
sleep(1.5)
```
Пауза 1.5 секунды — не паранойя. AliExpress триггерит защиту при частоте выше 1 запроса в секунду с одного адреса. С пулом из 4 адресов можно держать 2-3 запроса в секунду суммарно.
Парсинг цены из HTML
AliExpress рендерит цену в нескольких местах. Основной путь — JSON внутри `