Назад к блогу

Настройка прокси в curl и wget: полное руководство с примерами для парсинга

Подробное руководство по использованию прокси в curl и wget: примеры команд, настройка авторизации, обход блокировок при парсинге и автоматизации запросов.

📅14 февраля 2026 г.

При парсинге сайтов, автоматизации 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. Применяйте эти техники в своих проектах, адаптируйте примеры под конкретные задачи и масштабируйте автоматизацию без страха блокировок.