Google Search через IPv6 прокси: парсинг выдачи и обход капчи
Содержание
- Почему Google упирается рогом именно на IPv6
- Как Google детектит IPv6-прокси
- Настройка прокси-пула на IPv6
- Ротация: подсети, адреса, сессии
- Разбор капчи: что реально работает
- Кейс: парсинг выдачи для SEO-агентства
- Кейс: обход sorry/index при интенсивном парсинге
- Кейс: когда IPv6 хуже IPv4
- Сравнение подходов
- Rate limiting: сколько не жалко
- Заголовки, которые нельзя забыть
- Мониторинг и что смотреть
- Итог
Почему Google упирается рогом именно на IPv6
Google — это, пожалуй, самый сложный目标 для любого прокси-пула. И дело не только в капче. Основная беда в том, что Google видит IPv6-подсети целиком. Если у вас /64, а тем более /48, Google прекрасно понимает, что все адреса из этого блока принадлежат одному провайдеру. И начинает резать.
На IPv4 ситуация иная. Там адреса давно дефицит, провайдеры выдают их поштучно, и Google не может так нагло банить целые /24. А вот IPv6 — это бесконечный океан адресов, и Google об этом знает. Поэтому для IPv6-прокси порог входа в бан ниже в разы.
Практика показывает: чистый /64 от какого-нибудь хостинга выдерживает 200-400 запросов до первого 429. Если использовать /48 с равномерным распределением по /64, лимит растёт до 2000-3000. Дальше — только ротация подсетей.
Как Google детектит IPv6-прокси
Тут работает несколько механизмов одновременно. Первый — ASN. Google смотрит на номер автономной системы. Если это Hetzner, OVH, DigitalOcean — флаг сразу. Жилые IPv6 от Comcast или Deutsche Telekom проходят куда легче.
Второй — rDNS. Если PTR-запись выглядит как `host-123-45.isp.net`, это одно. Если `vps-12345.cloudprovider.com` — совсем другое. Google читает PTR и делает выводы.
Третий — поведенческий анализ. С одного /64 адреса приходит 500 запросов в минуту с одинаковыми User-Agent и без cookies. Это палево. Настоящий пользователь так не делает.
Четвёртый — TLS fingerprint. JA3/JA4 хеш от Python requests отличается от Chrome. Google это видит на уровне ClientHello. Даже если IP чистый, а fingerprint палевный — получите капчу.
Настройка прокси-пула на IPv6
Правильная схема — это не один прокси, а пул с ротацией. Минимум 50-100 подсетей /64. Каждая подсеть даёт 2^64 адресов, но использовать все не нужно — Google запомнит паттерн.
Вот пример на Python с ротацией через SOCKS5:
```python
import requests
import random
from itertools import cycle
PROXIES = [
"socks5://user:pass@[2a01:4f8:1c1c:1234::1]:1080",
"socks5://user:pass@[2a01:4f8:1c1c:5678::1]:1080",
"socks5://user:pass@[2a01:4f8:1c1c:9abc::1]:1080",
]
proxy_pool = cycle(PROXIES)
def google_search(query):
proxy = next(proxy_pool)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
}
try:
r = requests.get(
"https://www.google.com/search",
params={"q": query, "num": 20},
proxies={"https": proxy},
headers=headers,
timeout=15,
)
return r.status_code, len(r.text)
except requests.RequestException as e:
return None, str(e)
```
Ключевой момент — таймауты. IPv6 через SOCKS5 иногда даёт задержки 300-800 мс против 80-150 мс на IPv4. Это нормально, но нужно учитывать в rate limit.
Ротация: подсети, адреса, сессии
Ротация бывает трёх уровней. Первый — по адресам внутри одной /64. Это почти бесполезно против Google, потому что он видит /64 как единицу. Второй — по /64 внутри /48. Вот это работает. Третий — по ASN, самый надёжный, но требует пула от разных провайдеров.
Схема ротации зависит от задачи. Если парсите 10 000 запросов в сутки — хватит 20-30 /64. Если 500 000 — нужно 200+ /64 и минимум 5 разных ASN.
Сессии тоже важны. Google ставит cookies (NID, CONSENT, 1P_JAR). Если вы каждый запрос идёте с нового IP и без cookies — выглядите как бот. Если сохраняете cookies на 5-10 запросов с одного IP — выглядите как человек.
Прокси-сервис вроде lexic.ml как раз даёт пул IPv6-адресов с ротацией на уровне /64, что снимает головную боль с ручным управлением подсетями. Но даже с хорошим пулом нужно правильно настраивать поведение клиента.
Разбор капчи: что реально работает
Капча от Google бывает трёх видов. Первый — простой чекбокс «I'm not a robot». Второй — выбор картинок. Третий — полностью заблокированная страница с `sorry/index`.
Первый вид обходится относительно легко. Достаточно правильного fingerprint браузера и чистого IP. Второй — сложнее, нужен либо сервис решения капчи (2captcha, Anti-Captcha), либо эмуляция реального браузера через Playwright.
Третий вид — это уже бан. Тут ничего не поможет, кроме смены IP и паузы на 24-48 часов.
Вот пример с Playwright и stealth-плагином:
```python
from playwright.sync_api import sync_playwright
def search_with_browser(query, proxy):
with sync_playwright() as p:
browser = p.chromium.launch(
headless=True,
proxy={"server": proxy},
args=[
"--disable-blink-features=AutomationControlled",
"--disable-features=IsolateOrigins,site-per-process",
],
)
context = browser.new_context(
user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36",
viewport={"width": 1440, "height": 900},
locale="en-US",
)
page = context.new_page()
page.goto(f"https://www.google.com/search?q={query}")
page.wait_for_timeout(2000)
results = page.query_selector_all("div.g")
data = [r.inner_text() for r in results]
browser.close()
return data
```
Playwright решает проблему TLS fingerprint, но жрёт в 10-20 раз больше ресурсов. На одном ядре — 3-5 параллельных сессий, не больше.
Кейс: парсинг выдачи для SEO-агентства
Задача — собирать топ-100 по 5000 запросов ежедневно. Клиент — SEO-агентство, нужно мониторить позиции своего сайта и конкурентов.
Первый запуск на одном /64 от Hetzner: 247 запросов, потом 429. Пауза 60 секунд — снова 429. Через час — бан на сутки.
Причина — Google увидел один /64 с 247 запросами за 12 минут без cookies и с одинаковым User-Agent. Плюс JA3 от Python requests.
Решение: пул из 40 /64 от трёх разных ASN (Hetzner, OVH, мелкий региональный провайдер). Ротация по /64 каждые 30 запросов. Cookies сохраняются на 10 запросов в рамках одного IP. User-Agent меняется из пула в 50 штук. Задержка между запросами — 3-7 секунд рандомно.
Результат: 5000 запросов за 6 часов, 0 капч, 12 временных 429 (все прошли после паузы 30 сек). Стоимость — 40 IPv6-адресов от хостера, около \$2 в месяц.
Кейс: обход sorry/index при интенсивном парсинге
Другой клиент — сервис мониторинга цен. Нужно 200 000 запросов в сутки к Google Shopping.
Начали с 100 /64, ротация каждые 10 запросов. Через 3 часа — массовые sorry/index. Google забанил 60% подсетей.
Причина — интенсивность. 200 000 / 24 = 8333 запросов в час. Даже с 100 подсетями это 83 запроса в час на подсеть. Для Google это подозрительно много с одного /64.
Решение — увеличили пул до 400 /64, снизили интенсивность до 5000 запросов в час, добавили Playwright для 10% запросов (когда Google показывает капчу). Плюс проксирование через residential IPv6 от мобильных операторов для самых сложных запросов.
Результат: 200 000 запросов за 40 часов, sorry/index на 3% запросов, из них 90% решены через Playwright + 2captcha. Стоимость выросла до \$80 в месяц.
Кейс: когда IPv6 хуже IPv4
Бывает и наоборот. Один клиент парсил Google для узкого региона — Германия, баварский диалект запросов. Использовал IPv6 от немецкого хостера.
Google отдавал выдачу на английском, хотя `hl=de&gl=de` в параметрах. Причина — GeoIP для IPv6 часто менее точен, чем для IPv4. Хостер зарегистрирован в Берлине, но блок /64 мог числиться за Франкфуртом или даже Амстердамом.
Решение — переключились на IPv4 от немецкого residential-провайдера. Дороже в 5 раз, но выдача стала корректной. IPv6 оставили только для запросов без геопривязки.
Сравнение подходов
| Подход | Скорость | Стоимость/мес | Капча, % | Когда использовать |
|--------|----------|---------------|----------|-------------------|
| Один IPv6 /64 | 500 req/h | \$1 | 80+ | Тесты, малые объёмы |
| Пул 40 /64 | 3000 req/h | \$2-5 | 5-10 | SEO, средние объёмы |
| Пул 400 /64 | 5000 req/h | \$20-40 | 3-5 | Мониторинг цен |
| Residential IPv4 | 2000 req/h | \$100+ | 1-2 | Геозависимые задачи |
| Мобильные IPv6 | 1000 req/h | \$150+ | <1 | Сложные случаи |
Цифры приблизительные, зависят от ASN, гео и поведения клиента.
Rate limiting: сколько не жалко
Универсального числа нет. Но есть эмпирические границы. С одного /64 — не больше 10-15 запросов в минуту. С одного /48 — 50-80 в минуту. С одного ASN — 200-300 в минуту.
Задержки между запросами: минимум 2 секунды, оптимально 4-8. Рандомизация обязательна, иначе паттерн виден. Google анализирует интервалы и легко ловит равномерные 5.000 секунд.
Cookies — обязательно. Хотя бы CONSENT и NID. Без них Google считает каждый запрос первым визитом, что подозрительно.
Заголовки, которые нельзя забыть
Accept-Language должен совпадать с GeoIP. Если IP немецкий, а Accept-Language `en-US` — палево. Accept-Encoding — обязательно gzip, br. Без этого Google отдаёт обрезанную выдачу.
Sec-Fetch-* заголовки — Chrome их отправляет с версии 76. Если их нет, fingerprint палевный. Referer — для поиска обычно пустой или `https://www.google.com/`.
Connection: keep-alive — да, но с ротацией IP это работает только внутри одной сессии.
Мониторинг и что смотреть
Смотреть нужно на три метрики. Первая — доля 429 в общем потоке. Больше 5% — проблема с rate limit. Вторая — доля капч. Больше 10% — проблема с fingerprint или IP. Третья — доля sorry/index. Больше 1% — пора менять пул.
Логировать нужно IP, ASN, время, статус, наличие капчи. Без этого невозможно понять, какие подсети работают, а какие сожжены.
Пауза после бана — минимум 24 часа для /64, 6-12 часов для /48. Меньше — Google запомнит и продлит бан.
Итог
IPv6 для Google — палка о двух концах. С одной стороны, адресов много и они дешёвые. С другой — Google режет подсети целиком, и один /64 выгорает за пару часов.
Рабочая схема — пул из 40+ /64 от разных ASN, ротация по подсетям, cookies на сессию, реалистичные заголовки, задержки 4-8 секунд. С этим можно парсить 3000-5000 запросов в час без серьёзных проблем.
Если объёмы больше — либо расширять пул, либо добавлять residential IPv4, либо использовать Playwright для сложных случаев. Универсального рецепта нет, каждый случай требует подстройки под конкретный ASN, гео и паттерн запросов.