Парсинг (web scraping) почти всегда упирается в одну и ту же стену: сайт видит, что с одного IP-адреса прилетает подозрительно много запросов, и начинает блокировать, показывать капчу или отдавать «пустые» страницы. Прокси решают эту проблему — они подменяют ваш реальный IP на чужой и распределяют нагрузку. Но прокси прокси рознь: их десятки видов, и от выбора зависит, пройдёт ваш парсер незаметно или сгорит на первой сотне запросов.
Ниже — разбор всех основных типов прокси, их свойств, уровней приватности, тарификации, а также примеры кода на нескольких языках.
Что такое прокси и зачем он при парсинге
Прокси-сервер — это посредник между вашим парсером и целевым сайтом. Запрос идёт не напрямую, а через прокси: сайт видит IP прокси, а не ваш. При парсинге это даёт три вещи:
- Сокрытие реального IP — вас сложнее идентифицировать и забанить лично.
- Распределение нагрузки — пул из сотен IP позволяет слать много запросов, не превышая лимиты на каждый отдельный адрес.
- Обход гео-ограничений — можно собирать данные так, будто вы находитесь в нужной стране (цены, выдача, контент часто зависят от региона).
Классификация по протоколу: HTTP, HTTPS, SOCKS
Это первое, что нужно понимать — на каком уровне работает прокси.
HTTP-прокси
Работает только с HTTP-трафиком. Он «понимает» структуру HTTP-запроса, может читать и модифицировать заголовки, кэшировать ответы. Для парсинга обычных сайтов этого часто достаточно.
HTTPS-прокси (HTTP CONNECT)
То же самое, но умеет туннелировать зашифрованный TLS-трафик через метод CONNECT. Прокси не видит содержимое (оно зашифровано), а просто пробрасывает байты. Сегодня почти весь веб на HTTPS, поэтому поддержка CONNECT обязательна.
SOCKS4 и SOCKS5
SOCKS работает на более низком уровне — это универсальный туннель для любого TCP-трафика (а SOCKS5 ещё и UDP). Прокси не вникает в содержимое: ему всё равно, HTTP это, FTP, WebSocket или что-то ещё.
В чём разница между SOCKS и HTTP-прокси:
| HTTP(S) | SOCKS5 | |
|---|---|---|
| Уровень | Прикладной (понимает HTTP) | Транспортный (просто гонит TCP/UDP) |
| Может читать/менять заголовки | Да | Нет |
| Кэширование | Возможно | Нет |
| Протоколы | Только HTTP/HTTPS | Любые TCP, плюс UDP |
| Скорость | Чуть выше накладные расходы | Обычно быстрее, «прозрачнее» |
| Аутентификация | Basic/Digest | Логин-пароль, GSSAPI |
Разница SOCKS4 vs SOCKS5:
- SOCKS4 — старый, не поддерживает аутентификацию по паролю, IPv6 и UDP, и не умеет резолвить DNS на стороне прокси (домен превращается в IP на вашей стороне — это утечка, по DNS-запросам можно понять, что вы парсите).
- SOCKS5 — поддерживает аутентификацию, IPv6, UDP и удалённый DNS-резолвинг (
socks5hв URL-схеме). Для парсинга предпочтительнее, потому что DNS не утекает.
Практическое правило: если выбираете между ними, берите SOCKS5 (а в коде используйте схему
socks5h://, чтобы DNS резолвился через прокси).
Классификация по источнику IP
Гораздо важнее протокола то, откуда взялся IP-адрес. Именно это определяет, насколько «человеческим» вы выглядите для антибот-систем.
Датацентр-прокси (Datacenter)
IP принадлежат хостинг-провайдерам и дата-центрам (AWS, OVH, Hetzner и т.д.).
- ➕ Дёшевые, очень быстрые, доступны тысячами.
- ➖ Легко детектятся: антибот-системы держат базы подсетей дата-центров. Многие сайты блокируют такие IP превентивно.
- Подходят для парсинга «лояльных» сайтов без серьёзной защиты.
Резидентные прокси (Residential)
IP реальных домашних пользователей, выданные интернет-провайдерами (ISP). Трафик идёт через устройства живых людей (часто через P2P-сети или SDK в приложениях).
- ➕ Выглядят как обычные пользователи, их трудно отличить от живого трафика.
- ➖ Дороже, медленнее, иногда нестабильны.
- Подходят для сайтов с серьёзной защитой (маркетплейсы, соцсети, поисковики).
Мобильные прокси (Mobile)
IP мобильных операторов (3G/4G/5G). Особенность: операторы используют CGNAT — за одним IP сидят сотни реальных абонентов.
- ➕ Самый высокий уровень доверия: забанить такой IP = забанить кучу реальных людей, поэтому сайты осторожны.
- ➖ Самые дорогие, скорость и стабильность ниже.
- Применяют там, где всё остальное банится моментально.
ISP-прокси (Static Residential)
Гибрид: IP формально принадлежат интернет-провайдеру (как резидентные), но физически размещены в дата-центре (как датацентр-прокси).
- ➕ Скорость дата-центра + репутация провайдера. Статичны (не меняются), что удобно для долгих сессий.
- ➖ Дороже датацентровых.
Краткое сравнение по «незаметности» и цене:
Датацентр → ISP → Резидентные → Мобильные
дешевле/ дороже/
заметнее незаметнее
IPv4 vs IPv6
Адресное пространство IPv4 закончилось — адресов мало, и они дорогие. IPv6 практически бесконечен, поэтому IPv6-прокси заметно дешевле.
Но есть подвох: прокси по IPv6 работают, только если целевой сайт поддерживает IPv6. Многие крупные сайты до сих пор только на IPv4 — тогда IPv6-прокси к ним просто не подключится.
| IPv4 | IPv6 | |
|---|---|---|
| Доступность адресов | Дефицит | Практически бесконечно |
| Цена прокси | Выше | Ниже |
| Совместимость с сайтами | Почти везде | Только если сайт на IPv6 |
| Детект | IPv4 «привычнее» антиботам | Огромные подсети одного провайдера легче банить целыми блоками |
Вывод: IPv6 выгоден по цене для парсинга сайтов, которые точно поддерживают IPv6 (Google, многие зарубежные сервисы). Для остального и для максимальной совместимости — IPv4.
Уровни приватности (анонимности) прокси
Прокси может «выдавать» вас разными способами — добавляя в запрос служебные HTTP-заголовки. По тому, что именно передаётся, выделяют три уровня.
1. Transparent (прозрачный)
Передаёт ваш реальный IP в заголовках и честно сообщает, что это прокси.
Via: 1.1 proxy
X-Forwarded-For: ВАШ_РЕАЛЬНЫЙ_IP
Для парсинга бесполезен — сайт видит и факт прокси, и вас. Часто такие прокси стоят в корпоративных/публичных сетях для кэширования.
2. Anonymous (анонимный)
Скрывает ваш реальный IP, но не скрывает сам факт использования прокси.
Via: 1.1 proxy
X-Forwarded-For: IP_ПРОКСИ (или отсутствует, но Via выдаёт прокси)
Реальный IP защищён, но антибот-система видит метку «это прокси» и может отнестись с подозрением.
3. Elite / High Anonymous (элитный)
Не передаёт ни ваш IP, ни признаков прокси. Запрос выглядит так, будто вы ходите напрямую.
(никаких Via, X-Forwarded-For, X-Real-IP, Proxy-Connection)
Почему одни прокси передают данные, а другие нет? Дело в конфигурации самого прокси-сервера. Транспарентные намеренно добавляют X-Forwarded-For, чтобы целевой сервер знал исходного клиента (так задумано для кэширующих/корпоративных прокси). Элитные настроены вычищать все эти заголовки. Заголовки, по которым палятся прокси: Via, X-Forwarded-For, X-Real-IP, Forwarded, Proxy-Connection, X-Proxy-ID.
Для парсинга нужны только Elite-прокси. Anonymous — на свой страх и риск, Transparent — никогда.
Ротация: статические и ротируемые прокси
- Статические (sticky) — один и тот же IP держится долго. Нужны там, где требуется сессия (логин, корзина), чтобы сайт не «терял» вас при смене IP.
- Ротируемые (rotating) — IP меняется автоматически: на каждый запрос или раз в N минут. Идеальны для массового сбора, где сессия не важна. Часто провайдер даёт один «шлюз»-endpoint, а ротацию делает на своей стороне из пула в тысячи адресов.
TOR как бесплатный прокси
TOR (The Onion Router) — анонимная сеть, в которой трафик проходит через цепочку из трёх узлов (нод): входной (guard/entry), промежуточный (middle) и выходной (exit). Каждый слой шифрования снимается на своём узле — отсюда «луковая» маршрутизация. Локально TOR поднимает SOCKS5-прокси (по умолчанию порт 9050), к которому можно подключить парсер.
Да, в TOR тоже есть выбор гео и нод. Через конфиг torrc можно управлять, через какие страны выходить в интернет:
# Выходить только через ноды в этих странах
ExitNodes {us},{de},{nl}
StrictNodes 1
# Можно жёстко задать входные/выходные узлы по странам
EntryNodes {de}
ExcludeNodes {ru},{cn}
ExcludeExitNodes {ru}
Коды стран — в фигурных скобках по ISO ({us}, {de}, {fr}). StrictNodes 1 запрещает выходить за пределы заданного списка. Сменить цепочку (получить новый выходной IP) можно отправив сигнал NEWNYM на управляющий порт.
Минусы TOR для парсинга:
- Медленный — три прыжка плюс перегруженность сети.
- Exit-ноды в чёрных списках — список выходных узлов публичен, многие сайты блокируют весь TOR превентивно.
- Маленький пул IP — выходных нод тысячи, а не миллионы, как у резидентных провайдеров. Ротация ограничена.
- Подходит для разовых задач и эксперимента, но не для промышленного парсинга.
Бесплатные списки прокси
В интернете полно сайтов с бесплатными списками прокси (free proxy lists) — тысячи IP:порт, которые можно скачать прямо сейчас. Звучит заманчиво, но качество у них стабильно плохое:
- Большинство мертвы уже к моменту, когда вы их скачали — живёт хорошо если 5–20%.
- Медленные и нестабильные — то отвечают, то нет.
- Часто транспарентные — сливают ваш IP.
- Уже в чёрных списках — их использовали тысячи людей до вас, серьёзные сайты их давно забанили.
- Риск безопасности — неизвестно, кто держит прокси; он может перехватывать/подменять трафик (особенно опасно для незашифрованного HTTP и при передаче логинов).
Вывод: бесплатные прокси годятся для учёбы и одноразовых экспериментов, но для любого серьёзного или коммерческого парсинга нужны платные. Именно поэтому любой публичный прокси перед использованием обязательно надо проверять (см. ниже).
Проверка (чекинг) прокси
Прокси нельзя просто взять и использовать — особенно из публичных списков. Их нужно чекать, потому что они постоянно «умирают», тормозят и меняют поведение. Что проверяют:
- Живой ли — отвечает ли вообще, какой код возврата.
- Скорость / задержка — время ответа (ping, время до первого байта). Медленные отбраковывают.
- Уровень анонимности — не сливает ли ваш реальный IP. Делается запросом на сервис-эхо (например, эндпоинт, возвращающий ваш IP и заголовки), и сверкой: виден ли
X-Forwarded-For,Via. - Реальное гео — IP может заявляться как «немецкий», а на деле быть в другой стране. Проверяют по GeoIP-базе.
- Тип/репутация — не в чёрных ли списках, не помечен ли как датацентр/прокси (через сервисы fraud-score).
- Поддержка HTTPS — проходит ли
CONNECT, не ломает ли TLS.
Простейший чекер на Python — пробуем достучаться до эхо-сервиса через прокси и смотрим, что вернулось:
import requests
def check_proxy(proxy: str, timeout: int = 8):
proxies = {"http": proxy, "https": proxy}
try:
r = requests.get("https://httpbin.org/get",
proxies=proxies, timeout=timeout)
data = r.json()
origin_ip = data.get("origin")
headers = data.get("headers", {})
leaked = any(h in headers for h in
("X-Forwarded-For", "Via", "X-Real-Ip"))
return {
"ok": True,
"ip": origin_ip,
"anonymous": not leaked, # True = реальный IP не утёк
"latency": r.elapsed.total_seconds(),
}
except Exception as e:
return {"ok": False, "error": str(e)}
print(check_proxy("http://user:pass@1.2.3.4:8080"))
Как прокси влияют на детект при парсинге
Сам по себе прокси — не «шапка-невидимка». Антибот-системы (Cloudflare, DataDome, PerimeterX/HUMAN, Akamai) смотрят на множество сигналов, и IP — лишь один из них.
Что выдаёт парсер по линии IP:
- Тип IP. Дата-центровые подсети известны и помечаются как «не человек». Резидентные и мобильные вызывают больше доверия. Это главный фактор, на который влияет выбор прокси.
- Репутация IP (fraud score). История адреса: спам, ботнеты, прошлые баны. «Грязный» IP палится даже если он резидентный.
- Частота запросов с одного IP (rate limiting). Слишком много запросов в секунду = бан. Пул прокси с ротацией размазывает нагрузку и снижает частоту на каждый адрес.
- Геораспределение. Если «один пользователь» за минуту прыгает из США в Бразилию и обратно — это явный бот. Поэтому в рамках одной сессии IP лучше держать стабильным.
- ASN. Номер автономной системы выдаёт, кому принадлежит IP (хостинг или реальный провайдер).
Чего прокси НЕ закрывают (и почему одного прокси мало):
- TLS/JA3-fingerprint — отпечаток вашего TLS-рукопожатия. У
requests/curlон не как у браузера, и его видно сквозь любой прокси. - HTTP-заголовки и их порядок — кривой или нестандартный
User-Agent, отсутствие привычных браузерных заголовков. - Browser fingerprint — Canvas, WebGL, шрифты, JS-окружение (актуально для headless-браузеров).
- Поведение — слишком быстрые, слишком ровные, «нечеловеческие» паттерны кликов и переходов.
Вывод: качественный прокси (резидентный/мобильный, elite, с хорошей репутацией) резко снижает детект по IP, но его нужно сочетать с правильными заголовками, реалистичным fingerprint и адекватной скоростью запросов. Прокси — необходимое, но не достаточное условие.
Тарификация: за что вы платите
Провайдеры берут деньги по-разному, и от модели зависит, что выгоднее под вашу задачу.
- За трафик (per GB). Платите за гигабайты прошедших данных, IP-пул при этом огромный и «бесплатный». Типично для резидентных/мобильных. Опасно при парсинге «тяжёлых» страниц с картинками/видео — счёт быстро растёт. Экономия: качать только HTML, блокировать загрузку медиа.
- За количество IP (per IP). Платите за конкретные адреса (например, 100 статических датацентр/ISP-прокси), трафик безлимитный. Выгодно при больших объёмах данных и стабильных IP.
- За порты/потоки (per port / per thread). Платите за число одновременных подключений, а не за объём. Часто у мобильных прокси.
- За запросы (per request) или подписка. Характерно для готовых scraping API, где провайдер сам крутит прокси и отдаёт готовый HTML.
Как выбрать: много мелких запросов лёгких страниц → выгоднее per-GB или per-request; перекачка больших объёмов → выгоднее per-IP с безлимитным трафиком.
Примеры кода: подключение к прокси на разных языках
Формат строки прокси почти везде одинаков:
схема://логин:пароль@хост:порт, например http://user:pass@1.2.3.4:8080.
Python — requests (синхронно)
import requests
proxies = {
"http": "http://user:pass@1.2.3.4:8080",
"https": "http://user:pass@1.2.3.4:8080",
}
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print(r.json())
# SOCKS5 с удалённым DNS (нужен пакет: pip install requests[socks])
socks = {"http": "socks5h://user:pass@1.2.3.4:1080",
"https": "socks5h://user:pass@1.2.3.4:1080"}
print(requests.get("https://httpbin.org/ip", proxies=socks).json())
Python — httpx (асинхронно, с ротацией)
import asyncio, httpx, random
POOL = [
"http://user:pass@1.2.3.4:8080",
"http://user:pass@5.6.7.8:8080",
]
async def fetch(url):
proxy = random.choice(POOL) # случайный IP из пула на каждый запрос
async with httpx.AsyncClient(proxy=proxy, timeout=10) as client:
resp = await client.get(url)
return resp.status_code, resp.text[:80]
async def main():
tasks = [fetch("https://httpbin.org/ip") for _ in range(5)]
for code, body in await asyncio.gather(*tasks):
print(code, body)
asyncio.run(main())
Python — TOR (SOCKS5 + смена цепочки)
import requests
from stem import Signal
from stem.control import Controller
proxies = {"http": "socks5h://127.0.0.1:9050",
"https": "socks5h://127.0.0.1:9050"}
print(requests.get("https://httpbin.org/ip", proxies=proxies).json())
# Запросить новый выходной IP (новую цепочку)
with Controller.from_port(port=9051) as c:
c.authenticate(password="ваш_пароль")
c.signal(Signal.NEWNYM)
Node.js — axios + HttpsProxyAgent
const axios = require("axios");
const { HttpsProxyAgent } = require("https-proxy-agent");
const agent = new HttpsProxyAgent("http://user:pass@1.2.3.4:8080");
axios.get("https://httpbin.org/ip", { httpsAgent: agent, httpAgent: agent })
.then(res => console.log(res.data))
.catch(err => console.error(err.message));
Node.js — SOCKS5
const axios = require("axios");
const { SocksProxyAgent } = require("socks-proxy-agent");
// socks5h:// — DNS резолвится на стороне прокси
const agent = new SocksProxyAgent("socks5h://user:pass@1.2.3.4:1080");
axios.get("https://httpbin.org/ip", { httpAgent: agent, httpsAgent: agent })
.then(res => console.log(res.data));
Node.js — Puppeteer (headless-браузер через прокси)
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({
args: ["--proxy-server=http://1.2.3.4:8080"],
});
const page = await browser.newPage();
// авторизация на прокси, если нужна
await page.authenticate({ username: "user", password: "pass" });
await page.goto("https://httpbin.org/ip");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();
})();
Go — net/http
package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
proxyURL, _ := url.Parse("http://user:pass@1.2.3.4:8080")
client := &http.Client{
Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)},
}
resp, err := client.Get("https://httpbin.org/ip")
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
PHP — cURL
<?php
$ch = curl_init("https://httpbin.org/ip");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_PROXY => "1.2.3.4:8080",
CURLOPT_PROXYUSERPWD => "user:pass",
CURLOPT_PROXYTYPE => CURLPROXY_HTTP, // или CURLPROXY_SOCKS5_HOSTNAME
CURLOPT_TIMEOUT => 10,
]);
echo curl_exec($ch);
curl_close($ch);
cURL из командной строки
# HTTP-прокси
curl -x http://user:pass@1.2.3.4:8080 https://httpbin.org/ip
# SOCKS5 с удалённым DNS
curl --proxy socks5h://user:pass@1.2.3.4:1080 https://httpbin.org/ip
Итоговый чеклист выбора прокси для парсинга
| Задача | Рекомендация |
|---|---|
| Лёгкие сайты без защиты | Датацентр-прокси, IPv4 |
| Сайты с антиботом (маркетплейсы, поиск) | Резидентные, elite, с ротацией |
| Максимально защищённые / соцсети | Мобильные прокси |
| Нужна сессия (логин, корзина) | Статические (sticky) ISP/резидентные |
| Только сайты с IPv6, экономия | IPv6-прокси |
| Разовый эксперимент / учёба | TOR или бесплатные списки (с проверкой) |
| DNS не должен утекать | SOCKS5 со схемой socks5h:// |
Главные правила:
- Берите elite-анонимность — никакой утечки
X-Forwarded-For/Via. - Любые публичные/бесплатные прокси обязательно чекайте перед боем.
- Под защищённые сайты — резидентные или мобильные, не датацентр.
- Прокси закрывают детект по IP, но не по fingerprint — сочетайте с правильными заголовками и адекватной скоростью.
- Считайте тарификацию под свою задачу: много лёгких запросов → per-GB/request, большие объёмы → per-IP.