При парсинге сайтов, автоматизации API-запросов или мониторинге цен конкурентов на маркетплейсах вы неизбежно столкнётесь с блокировками по IP. Утилиты curl и wget — стандартные инструменты для работы с HTTP-запросами в командной строке, и правильная настройка прокси в них критически важна для обхода ограничений. В этой статье разберём все способы использования прокси в curl и wget: от базовых команд до продвинутых сценариев с ротацией IP и обработкой ошибок.
Базовый синтаксис прокси в curl и wget
Начнём с самых простых команд для подключения через прокси. Оба инструмента поддерживают параметр для указания прокси-сервера, но синтаксис немного отличается.
Использование прокси в curl
В curl прокси указывается через параметр -x или --proxy. Базовый формат команды:
curl -x http://proxy-server:port http://example.com
Конкретный пример с реальным прокси-сервером:
curl -x http://45.130.123.45:8080 http://api.ipify.org
Эта команда отправит запрос на api.ipify.org (сервис, который возвращает ваш IP-адрес) через указанный прокси-сервер. Вы увидите IP прокси, а не ваш реальный адрес.
Использование прокси в wget
В wget прокси настраивается через параметр -e use_proxy=yes и переменные окружения, либо напрямую через опции:
wget -e use_proxy=yes -e http_proxy=http://45.130.123.45:8080 http://example.com
Или более короткий вариант через переменные окружения (об этом подробнее в разделе ниже):
export http_proxy="http://45.130.123.45:8080"
wget http://example.com
Авторизация на прокси-сервере
Большинство коммерческих прокси-сервисов требуют авторизацию по логину и паролю. Это защищает прокси от несанкционированного использования и позволяет отслеживать трафик каждого клиента. Рассмотрим, как передать учётные данные в curl и wget.
Авторизация в curl
В curl логин и пароль можно указать прямо в URL прокси-сервера или через отдельный параметр -U:
# Способ 1: логин и пароль в URL
curl -x http://username:password@proxy-server:port http://example.com
# Способ 2: через параметр -U
curl -x http://proxy-server:port -U username:password http://example.com
Конкретный пример с учётными данными:
curl -x http://user123:pass456@45.130.123.45:8080 http://api.ipify.org
Важный момент: если в пароле есть специальные символы (@, :, /, ?), их нужно закодировать в URL-формат. Например, символ @ заменяется на %40:
# Если пароль содержит @: pass@456
curl -x http://user123:pass%40456@45.130.123.45:8080 http://api.ipify.org
Авторизация в wget
В wget авторизация настраивается через параметры --proxy-user и --proxy-password:
wget --proxy-user=username --proxy-password=password \
-e use_proxy=yes -e http_proxy=http://45.130.123.45:8080 \
http://example.com
Или через переменные окружения с учётными данными в URL:
export http_proxy="http://username:password@45.130.123.45:8080"
wget http://example.com
Работа с разными типами прокси: HTTP, HTTPS, SOCKS5
Прокси-серверы работают по разным протоколам, и выбор типа зависит от задачи. HTTP-прокси подходят для простых запросов, HTTPS обеспечивают шифрование, а SOCKS5 работают на более низком уровне и поддерживают любой трафик. При парсинге маркетплейсов типа Wildberries или Ozon часто используют резидентные прокси, которые могут работать по любому из этих протоколов.
HTTP и HTTPS прокси
HTTP-прокси — самый распространённый тип. Они работают на уровне HTTP-протокола и подходят для большинства задач веб-парсинга:
# HTTP прокси в curl
curl -x http://proxy-server:8080 http://example.com
# HTTPS прокси в curl (для защищённых соединений)
curl -x https://proxy-server:8080 https://example.com
Важно: даже если целевой сайт использует HTTPS, прокси может быть HTTP. Curl автоматически установит туннель через метод CONNECT:
# HTTP-прокси для HTTPS-сайта (работает корректно)
curl -x http://proxy-server:8080 https://secure-site.com
SOCKS5 прокси
SOCKS5 — более универсальный протокол, который работает на уровне TCP и поддерживает любой тип трафика (HTTP, HTTPS, FTP, даже UDP). Это делает SOCKS5 идеальным выбором для сложных задач автоматизации:
# SOCKS5 в curl
curl -x socks5://proxy-server:1080 http://example.com
# SOCKS5 с авторизацией
curl -x socks5://username:password@proxy-server:1080 http://example.com
# SOCKS5h (резолвинг DNS через прокси)
curl -x socks5h://proxy-server:1080 http://example.com
Разница между socks5 и socks5h: в первом случае DNS-запросы идут с вашего компьютера, во втором — через прокси-сервер. Используйте socks5h, если хотите полностью скрыть свою активность, включая DNS-запросы.
В wget поддержка SOCKS5 ограничена, поэтому для таких задач лучше использовать curl или дополнительные утилиты типа proxychains.
Совет: Для парсинга маркетплейсов (Wildberries, Ozon, Яндекс.Маркет) рекомендуется использовать резидентные или мобильные прокси с HTTP/HTTPS протоколом — они реже попадают под блокировки, так как имеют IP реальных пользователей.
Настройка прокси через переменные окружения
Если вы регулярно работаете через прокси, удобнее настроить переменные окружения один раз, чем указывать параметры в каждой команде. Curl и wget автоматически читают эти переменные.
Настройка для текущей сессии
Экспортируйте переменные в терминале (действуют до закрытия сессии):
# Для HTTP-трафика
export http_proxy="http://username:password@proxy-server:8080"
# Для HTTPS-трафика
export https_proxy="http://username:password@proxy-server:8080"
# Для FTP-трафика
export ftp_proxy="http://username:password@proxy-server:8080"
# Для SOCKS5
export all_proxy="socks5://username:password@proxy-server:1080"
После этого curl и wget будут автоматически использовать прокси:
# Прокси применится автоматически
curl http://api.ipify.org
wget http://example.com
Постоянная настройка в .bashrc или .zshrc
Чтобы прокси применялись при каждом запуске терминала, добавьте переменные в конфигурационный файл вашей оболочки:
# Откройте файл в редакторе
nano ~/.bashrc # для bash
# или
nano ~/.zshrc # для zsh
# Добавьте в конец файла:
export http_proxy="http://username:password@proxy-server:8080"
export https_proxy="http://username:password@proxy-server:8080"
# Сохраните и примените изменения:
source ~/.bashrc
Исключения: no_proxy
Иногда нужно исключить определённые адреса из проксирования (например, localhost или внутренние сервисы):
export no_proxy="localhost,127.0.0.1,192.168.0.0/16,.local"
Теперь запросы к этим адресам будут идти напрямую, минуя прокси.
Ротация прокси в скриптах bash
При массовом парсинге (например, сбор цен с тысяч карточек товаров на Wildberries) использование одного прокси приведёт к блокировке. Решение — ротация IP-адресов. Рассмотрим, как реализовать это в bash-скриптах.
Простая ротация из списка прокси
Создайте файл proxies.txt со списком прокси-серверов (по одному на строку):
http://user1:pass1@proxy1.example.com:8080
http://user2:pass2@proxy2.example.com:8080
http://user3:pass3@proxy3.example.com:8080
Скрипт для последовательной ротации прокси:
#!/bin/bash
# Файл со списком URL для парсинга
urls_file="urls.txt"
# Файл со списком прокси
proxies_file="proxies.txt"
# Читаем прокси в массив
mapfile -t proxies < "$proxies_file"
proxy_count=${#proxies[@]}
current_proxy=0
# Обрабатываем каждый URL
while IFS= read -r url; do
# Выбираем прокси по кругу
proxy="${proxies[$current_proxy]}"
echo "Запрос к $url через $proxy"
curl -x "$proxy" -s "$url" -o "output_$(basename $url).html"
# Переключаемся на следующий прокси
current_proxy=$(( (current_proxy + 1) % proxy_count ))
# Пауза между запросами (1-3 секунды)
sleep $((RANDOM % 3 + 1))
done < "$urls_file"
Этот скрипт последовательно использует прокси из списка, возвращаясь к первому после последнего. Случайная пауза между запросами делает активность более естественной.
Случайный выбор прокси
Для большей непредсказуемости можно выбирать прокси случайным образом:
#!/bin/bash
proxies_file="proxies.txt"
mapfile -t proxies < "$proxies_file"
proxy_count=${#proxies[@]}
while IFS= read -r url; do
# Случайный выбор прокси
random_index=$((RANDOM % proxy_count))
proxy="${proxies[$random_index]}"
echo "Запрос к $url через прокси #$random_index"
curl -x "$proxy" -s "$url" -o "output_$(date +%s).html"
sleep $((RANDOM % 3 + 1))
done < "urls.txt"
Автоматическая ротация через API прокси-сервиса
Многие провайдеры прокси (включая сервисы, предоставляющие резидентные прокси) предлагают автоматическую ротацию через единую точку входа. Вы используете один адрес прокси, а IP меняется при каждом запросе или по таймеру:
# Прокси с автоматической ротацией
# IP меняется при каждом запросе
curl -x http://username:password@rotating.proxy.com:8080 http://api.ipify.org
curl -x http://username:password@rotating.proxy.com:8080 http://api.ipify.org
# Два запроса выше получат разные IP-адреса
Это самый удобный способ для масштабного парсинга — не нужно управлять списком прокси вручную.
Передача заголовков и User-Agent через прокси
Современные сайты анализируют не только IP-адрес, но и HTTP-заголовки запроса. Отсутствие User-Agent или подозрительные заголовки могут привести к блокировке даже при использовании качественных прокси. Рассмотрим, как правильно настроить заголовки в curl и wget.
User-Agent в curl
User-Agent — это заголовок, идентифицирующий браузер и операционную систему. Curl по умолчанию отправляет собственный User-Agent (curl/7.x.x), что сразу выдаёт автоматизацию. Замените его на реальный браузер:
# Chrome на Windows
curl -x http://proxy:8080 \
-A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" \
http://example.com
# Firefox на macOS
curl -x http://proxy:8080 \
-A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0" \
http://example.com
Дополнительные заголовки
Для более реалистичного запроса добавьте типичные браузерные заголовки:
curl -x http://proxy:8080 \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0" \
-H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \
-H "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8" \
-H "Accept-Encoding: gzip, deflate, br" \
-H "Connection: keep-alive" \
-H "Upgrade-Insecure-Requests: 1" \
http://example.com
User-Agent в wget
В wget User-Agent задаётся через параметр --user-agent:
wget --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0" \
-e use_proxy=yes -e http_proxy=http://proxy:8080 \
http://example.com
Рандомизация User-Agent в скриптах
Для масштабного парсинга полезно чередовать User-Agent, чтобы запросы выглядели как от разных пользователей:
#!/bin/bash
# Массив User-Agent
user_agents=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/605.1.15"
"Mozilla/5.0 (X11; Linux x86_64) Firefox/121.0"
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) Safari/604.1"
)
while IFS= read -r url; do
# Случайный User-Agent
random_ua=${user_agents[$RANDOM % ${#user_agents[@]}]}
curl -x http://proxy:8080 -A "$random_ua" -s "$url"
sleep 2
done < "urls.txt"
Диагностика проблем и обработка ошибок
При работе с прокси часто возникают ошибки: таймауты, отказы в подключении, неправильная авторизация. Рассмотрим, как диагностировать и обрабатывать эти ситуации.
Проверка работоспособности прокси
Простейший способ проверить прокси — запросить сервис, возвращающий ваш IP:
# Проверка HTTP прокси
curl -x http://proxy:8080 http://api.ipify.org
# Проверка SOCKS5 прокси
curl -x socks5://proxy:1080 http://api.ipify.org
# С выводом подробной информации
curl -x http://proxy:8080 -v http://api.ipify.org
Параметр -v (verbose) покажет детали соединения, включая заголовки и ошибки.
Обработка таймаутов
Медленные прокси или перегруженные серверы могут вызывать таймауты. Установите разумные лимиты времени:
# Таймаут подключения 10 секунд, общий таймаут 30 секунд
curl -x http://proxy:8080 --connect-timeout 10 --max-time 30 http://example.com
# В wget
wget --timeout=30 --tries=3 -e http_proxy=http://proxy:8080 http://example.com
Автоматическая обработка ошибок в скриптах
Скрипт для парсинга с автоматическим переключением на следующий прокси при ошибке:
#!/bin/bash
proxies_file="proxies.txt"
mapfile -t proxies < "$proxies_file"
fetch_with_retry() {
local url=$1
local max_attempts=3
for proxy in "${proxies[@]}"; do
echo "Попытка через прокси: $proxy"
if curl -x "$proxy" \
--connect-timeout 10 \
--max-time 30 \
-s -f "$url" -o output.html; then
echo "Успех с прокси: $proxy"
return 0
else
echo "Ошибка с прокси: $proxy, пробуем следующий"
fi
done
echo "Все прокси недоступны для $url"
return 1
}
# Использование
fetch_with_retry "http://example.com/page1"
Параметр -f заставляет curl возвращать ошибку при HTTP-статусах 4xx и 5xx, что позволяет обрабатывать не только сетевые ошибки, но и блокировки на уровне приложения.
Логирование для отладки
Сохраняйте подробные логи запросов для анализа проблем:
# Сохранение заголовков ответа
curl -x http://proxy:8080 -D headers.txt http://example.com
# Полный лог взаимодействия
curl -x http://proxy:8080 -v http://example.com 2>&1 | tee curl.log
# Только HTTP-статус
curl -x http://proxy:8080 -o /dev/null -s -w "%{http_code}\n" http://example.com
Практические сценарии использования
Рассмотрим реальные задачи, где curl и wget с прокси решают конкретные бизнес-проблемы.
Парсинг цен конкурентов на маркетплейсах
Задача: собрать цены на 500 товаров конкурентов с Wildberries для анализа ценовой стратегии. Wildberries активно блокирует массовые запросы с одного IP.
Решение: использование резидентных прокси с ротацией и рандомизацией User-Agent:
#!/bin/bash
# Прокси с автоматической ротацией
PROXY="http://user:pass@rotating-residential.proxy.com:8080"
# Массив User-Agent
user_agents=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0"
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0) Safari/604.1"
)
# Читаем ID товаров из файла
while IFS= read -r product_id; do
ua=${user_agents[$RANDOM % ${#user_agents[@]}]}
curl -x "$PROXY" \
-A "$ua" \
-H "Accept-Language: ru-RU,ru;q=0.9" \
-s "https://www.wildberries.ru/catalog/${product_id}/detail.aspx" \
-o "products/${product_id}.html"
echo "Скачан товар $product_id"
sleep $((RANDOM % 5 + 3)) # Пауза 3-8 секунд
done < product_ids.txt
Мониторинг доступности API из разных регионов
Задача: проверить, как API вашего сервиса работает для пользователей из разных стран (геоблокировки, скорость ответа).
Решение: прокси с IP из нужных стран:
#!/bin/bash
# Прокси из разных стран
declare -A proxies=(
["US"]="http://user:pass@us-proxy.com:8080"
["DE"]="http://user:pass@de-proxy.com:8080"
["JP"]="http://user:pass@jp-proxy.com:8080"
)
API_URL="https://api.yourservice.com/v1/status"
for country in "${!proxies[@]}"; do
echo "Проверка из $country..."
response_time=$(curl -x "${proxies[$country]}" \
-s -o /dev/null \
-w "%{time_total}" \
"$API_URL")
http_code=$(curl -x "${proxies[$country]}" \
-s -o /dev/null \
-w "%{http_code}" \
"$API_URL")
echo "$country: HTTP $http_code, время ответа ${response_time}s"
done
Скачивание файлов через wget с ротацией прокси
Задача: скачать архив файлов (изображения товаров, документы) с сайта, который ограничивает скорость для одного IP.
#!/bin/bash
proxies_file="proxies.txt"
mapfile -t proxies < "$proxies_file"
proxy_count=${#proxies[@]}
current=0
while IFS= read -r file_url; do
proxy="${proxies[$current]}"
filename=$(basename "$file_url")
echo "Скачивание $filename через прокси #$current"
wget --proxy-user=username --proxy-password=password \
-e use_proxy=yes -e http_proxy="$proxy" \
-O "downloads/$filename" \
"$file_url"
current=$(( (current + 1) % proxy_count ))
sleep 2
done < file_urls.txt
Тестирование рекламных креативов в разных GEO
Задача: проверить, как выглядят рекламные объявления Facebook Ads для пользователей из США, Канады и Великобритании (разные валюты, языки, доступность офферов).
#!/bin/bash
# Мобильные прокси из разных стран для реалистичности
declare -A mobile_proxies=(
["US"]="http://user:pass@us-mobile.proxy.com:8080"
["CA"]="http://user:pass@ca-mobile.proxy.com:8080"
["GB"]="http://user:pass@gb-mobile.proxy.com:8080"
)
AD_URL="https://www.facebook.com/ads/library/?id=YOUR_AD_ID"
for country in "${!mobile_proxies[@]}"; do
curl -x "${mobile_proxies[$country]}" \
-A "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0) Safari/604.1" \
-H "Accept-Language: en-US,en;q=0.9" \
-s "$AD_URL" \
-o "ads_preview_${country}.html"
echo "Сохранён превью для $country"
done
Для таких задач особенно эффективны мобильные прокси, так как они имитируют реальных пользователей смартфонов и реже вызывают подозрения у антифрод-систем Facebook.
Важно для арбитражников: При проверке рекламных креативов через прокси используйте мобильные IP и соответствующие User-Agent мобильных устройств. Facebook анализирует консистентность данных (тип устройства по User-Agent должен соответствовать типу IP).
Автоматизация проверки доступности сайта
Задача: мониторинг доступности вашего сайта каждые 5 минут, имитируя запросы от реальных пользователей (не с серверного IP).
#!/bin/bash
PROXY="http://user:pass@residential.proxy.com:8080"
SITE_URL="https://yoursite.com"
LOG_FILE="uptime.log"
while true; do
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
http_code=$(curl -x "$PROXY" \
-s -o /dev/null \
-w "%{http_code}" \
--max-time 10 \
"$SITE_URL")
if [ "$http_code" -eq 200 ]; then
echo "[$timestamp] OK - HTTP $http_code" >> "$LOG_FILE"
else
echo "[$timestamp] ERROR - HTTP $http_code" >> "$LOG_FILE"
# Отправка алерта (например, через Telegram API)
curl -s "https://api.telegram.org/botTOKEN/sendMessage" \
-d "chat_id=CHAT_ID&text=Сайт недоступен: HTTP $http_code"
fi
sleep 300 # 5 минут
done
Заключение
Curl и wget — мощные инструменты для автоматизации HTTP-запросов, а правильная настройка прокси делает их незаменимыми для парсинга, мониторинга и тестирования. Мы рассмотрели все ключевые аспекты: от базового синтаксиса до продвинутых сценариев с ротацией IP, обработкой ошибок и рандомизацией заголовков.
Основные выводы из статьи:
- Используйте параметр
-xв curl и переменные окружения для настройки прокси - Выбирайте тип прокси под задачу: HTTP для простых запросов, SOCKS5 для универсальности
- Всегда заменяйте стандартный User-Agent на реалистичный браузерный
- Реализуйте ротацию прокси для масштабного парсинга — это критично для обхода блокировок
- Добавляйте обработку ошибок и таймаутов в продакшен-скрипты
- Используйте случайные паузы между запросами для имитации человеческого поведения
Для задач, требующих высокого уровня анонимности и минимального риска блокировок (парсинг маркетплейсов, проверка рекламы, мониторинг конкурентов), рекомендуем использовать резидентные прокси. Они имеют IP реальных домашних пользователей, что делает ваши запросы неотличимыми от обычного трафика и значительно снижает вероятность попадания в бан-листы.
Теперь у вас есть полный набор инструментов и знаний для эффективной работы с прокси в curl и wget. Применяйте эти техники в своих проектах, адаптируйте примеры под конкретные задачи и масштабируйте автоматизацию без страха блокировок.