Слабо «скачать интернет»? Конечно, это невозможно, у вас просто не хватит никаких носителей. Но у разработчиков бесплатного ПО с открытым исходным кодом всегда интересное чувство юмора. Простой пример – утилита wget. Её название расшифровывается как «www get», где WWW – это World Wide Web (Всемирная паутина, она же Интернет), а «get» переводится на русский как «получить» или «скачать». Вот и получается «скачать Интернет».
Но речь в материале ниже пойдёт не столько о самой утилите, сколько о том, как заставить её работать через прокси. Обычно это нужно для организации многопоточных соединений и операций парсинга.
Ранее мы уже рассказывали об аналогичной утилите – о cURL (она вполне успешно сочетается с прокси при умелом подходе). Поэтому ниже дополнительно сравним обе утилиты и расскажем об их отличиях.
Что такое wget и как его использовать
Wget – это штатная утилита командной строки, которая поставляется в комплекте практически всех популярных дистрибутивов Linux, она предназначена для быстрого скачивания файлов и другого контента по различным интернет-протоколам.
При желании утилиту можно установить и использовать на других платформах, так как программа имеет открытый исходный код, который может быть скомпилирован для разных сред исполнения.
Wget может похвастаться очень простым синтаксисом и потому идеально подходит для повседневного использования, в том числе для новичков. Благодаря тому, что wget поставляется в базовом окружении Linux-сборок, с её помощью можно быстро и просто скачивать другие программы и пакеты, а также включать в задания планировщика cron (скрипты и команды, выполняемые по расписанию). Плюс, wget можно включить в состав любых других скриптов и консольных команд.
Например, с помощью wget можно полностью скачать целевой сайт, если правильно выставить опции обхода URL-адресов (с рекурсией).
Wget поддерживает работу с HTTP, HTTPS, FTP и FTPS-протоколами (+ с некоторыми другими, менее популярными).
Более правильное название – GNU Wget (официальный сайт и документация).
Обратите внимание, существует параллельная реализация wget – wget2. Она имеет ряд небольших нововведений и особенностей.
Пример использования wget для скачивания архива:
- wget https://ваш.сайт/каталог/архив.zip
Файлы можно скачивать сразу большими партиями, достаточно указать все их имена (ссылки) через пробел:
- wget https://ваш.сайт/каталог/архив1.zip https://ваш.сайт/каталог/архив2.zip https://ваш.сайт/каталог/архив3.zip
Утилита будет скачивать файлы последовательно с отображением прогресса прямо в консоли.
Имена целевых файлов (список URL-адресов) можно сохранить в отдельный документ и «скормить» такой документ wget:
- wget --input-file=~/urls.txt
Или то же самое с сокращёнными опциями:
- wget -i ~/urls.txt
Если доступ защищён логином и паролем, то wget тоже может справиться (пару user и password нужно заменить на актуальные):
- wget ftp://user:password@host/path
Вот так можно создать локальную версию конкретного сайта (он будет скачан в виде HTML-страниц со всем связанным содержимым):
- wget --mirror -p --convert-links -P /home/user/site111 исходный-сайт.com
С сайта можно скачать только файлы определённого типа:
- wget -r -A “*.png” домен.зона
Обратите внимание! Wget не умеет работать с JavaScript, то есть утилита будет загружать и сохранять только стандартный HTML-код. Все динамически подгружаемые элементы будут проигнорированы.
Вариантов применения wget масса.
Полный список всех опций и ключей для утилиты можно найти в документации к программе, а также на официальном сайте. В частности, можно:
- Ограничивать скорость загрузки и устанавливать другие квоты
- Изменять user-agent на своё значение (например, можно представиться сайту браузером Chrome)
- Возобновлять загрузку
- Задавать смещение при чтении файла
- Анализировать время создания/модификации, MIME-тип
- Использовать постоянные и случайные задержки между запросами
- Рекурсивно обходить указанные каталоги подкаталоги
- Использовать сжатие на уровне web-сервера
- Переключаться в фоновый режим
- Задействовать прокси
Естественно, последний пункт нам наиболее интересен.
При парсинге wget вполне может помочь с сохранением HTML-содержимого, которое позже можно разобрать и проанализировать другими инструментами и скриптами. Подробнее смотрите в материалах про библиотеки для парсинга на Python и на языке Go.
Зачем использовать прокси с wget
Прокси – это сервер-посредник. Основная его задача – организация альтернативного маршрута при обмене запросами между клиентом и сервером.
Прокси могут использовать разные схемы подключения и разные технологии. Например, прокси могут быть анонимными и нет, работать на базе разных типов устройств (серверные, мобильные, резидентные), платные или бесплатные, с обратной связью (backconnect-прокси), со статическими или с динамическими адресами, и т.д.
Но какими бы они ни были, их задачи остаются примерно одними и теми же: переадресация, изменение местоположения, модификация содержимого (сжатие, очистка и т.п.).
При парсинге, а соответственно, и при использовании wget, прокси нужны для того, чтобы можно было скрыть реальный адрес владельца и организовать множественные параллельные подключения, например, чтобы ускорить процедуру сбора данных (скрапинг, не путать с web-краулингом).
Как установить wget
Во многих Linux-дистрибутивах wget является предустановленной утилитой. Если команда wget возвращает ошибку, то установить wget легко и просто можно с помощью штатного менеджера пакетов.
Debian-based дистрибутивы, включая Ubuntu:
- sudo apt-get install wget
Fedora, CentOS и RHEL:
- yum install wget
ArchLinux и аналоги:
- pacman -Sy wget
В MacOS wget устанавливается либо из исходников (с командами make и make install), либо с помощью менеджера пакетов Homebrew. Для новичков последний вариант будет наиболее удобным (обратите внимание, используется утилита cURL, которая в MacOS предустановлена по умолчанию):
- /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- brew install wget
В Windows последних версий (10 и 11) установка wget возможна в подсистеме Linux (WSL), напрямую из скомпилированных исходников (например, их можно найти здесь) или с помощью сторонних менеджеров пакетов, таких как Chocolatey. Команда установки для Chocolatey:
- choco install wget
Если вы установите wget в Windows на уровне бинарного файла, то для правильного вызова апплета в командной строке нужно будет прописать ссылку на программу в переменной PATH. Иначе придётся каждый раз обращаться к файлу напрямую «.\каталог\wget.exe», а далее список опций и параметров.
Запуск wget
Когда утилита установлена, её можно запустить либо из командной строки, либо обратиться к ней на уровне shell-скриптов.
Типовой запуск:
- wget https://сайт.зона/каталог/файл.zip
Сразу после нажатия ввода утилита начнёт скачивание файла в домашний каталог пользователя (или в иной каталог, в соответствии с настройками окружения).
Прямо в консоли wget показывает текущую скорость и общий прогресс скачивания.
Имя файла при загрузке можно изменить:
- wget -O новое-название.zip https://сайт.зона/каталог/исходный-файл.zip
Если вам потребуется вызов справки по набору опций, напишите:
- wget -h
Настройка wget для работы через прокси
Самый простой способ указания прокси для wget – специальные опции в командной строке:
- Если прокси без необходимости авторизации:
wget -e use_proxy=on -e http_proxy=адрес.прокси.или.его.IP.адрес:порт https://целевой.сайт/каталог/файл.zip
- Если требуется обязательная авторизация с логином и паролем:
wget -e use_proxy=on -e http_proxy=132.217.171.127:1234 --proxy-user=ЛОГИН --proxy-password=ПАРОЛЬ https://целевой.сайт/каталог/файл.zip
В некоторых случаях вместо опции «use_proxy=on» может использоваться комбинация «use_proxy=yes».
Если вам неудобно каждый раз прописывать опции в консоли, то можно добавить прокси на уровне конфигурационного файла. Сделать это можно либо в общем каталоге конфигов (/etc/wgetrc), либо в конфиге локального пользователя («~.wgetrc», если такого файла нет, то его можно создать вручную). Достаточно изменить опции на следующие (если пользовательский конфиг создаётся с нуля, то опции нужно просто добавить в пустой файл):
use_proxy=on
http_proxy=155.217.170.121:12345
https_proxy=155.217.170.121:12345
Естественно, вместо 155.217.170.121:12345 нужно указать актуальный IP-адрес и номер порта.
Если имеется привязка к авторизации с логином и паролем, то можно использовать следующую конструкцию:
use_proxy = on
http_proxy = http://ЛОГИН:ПАРОЛЬ@155.217.170.121:12345
Теперь можно запускать wget без дополнительных ключей, утилита постоянно будет работать через прокси.
Ротация прокси для wget
Встроенных инструментов для ротации прокси у wget нет. Поэтому, если вы хотите каждый новый экземпляр wget запускать через отдельный прокси, то нужно написать bash-скрипт или использовать опцию «-e».
Пример:
wget -e use_proxy=on -e http_proxy=104.254.41.36:1234 --proxy-user=ЛОГИН-один --proxy-password=ПАРОЛЬ-один https://сайт-один.зона/каталог/файл-один.zip
wget -e use_proxy=on -e http_proxy=26.104.52.225:2234 --proxy-user=ЛОГИН-два --proxy-password=ПАРОЛЬ-два https://сайт-два.зона/каталог/файл-два.zip
wget -e use_proxy=on -e http_proxy= 70.174.89.3:44444 --proxy-user=ЛОГИН-три --proxy-password=ПАРОЛЬ-три https://сайт-три.зона/каталог/файл-три.zip
А вот так может выглядеть вариант bash-скрипта принудительной ротации прокси в случайном порядке из списка, хранящегося в файле proxies.txt (условно 10 строк):
for i in {1..10}
do
proxy=$(shuf -n 1 proxies.txt)
wget -e use_proxy=on -e http_proxy=$proxy --proxy-user=ЛОГИН --proxy-password=ПАРОЛЬ https://целевой-сайт.зона/подкаталог/какой-то-файл
done
Если скрипты вы писать не умеете, то есть ещё один элегантный выход – использование прокси с обратной связью. На примере прокси Froxy:
- В личном кабинете настраивается порт (определяется локация и условия ротации выходных IP-адресов, например, при каждом новом запросе).
- Копируются данные прокси-порта (для wget это будет обычный прокси).
- Далее запросы выполняются по аналогии с обычным штучным прокси (wget -e use_proxy=on -e http_proxy=255.89.155.178:1234 --proxy-user=ЛОГИН --proxy-password=ПАРОЛЬ https://целевой.сайт/каталог/файл.zip).
- Ротация IP-адресов осуществляется на стороне провайдера прокси. При этом входной порт остаётся одним и тем же (ничего дополнительно во wget прописывать или обновлять не нужно).
cURL или wget
И cURL, и wget – утилиты с открытым исходным кодом, обе используются для загрузки файлов и другого контента по HTTP-протоколу и по FTP. Вполне неплохо справляются с отправкой HTTP-запросов POST и GET, cookies, умеют работать с защищёнными версиями сайтов (по протоколу HTTPS), их можно включать в свои bash-скрипты.
Но есть у них и отличия.
Начнём с cURL.
- Это не только утилита, но и программная библиотека, которую можно задействовать на уровне кода.
- В отличие от wget, cURL поддерживает огромное количество дополнительных протоколов (интересующимся подробная таблица сравнения).
- cURL умеет работать через SOCKS-прокси (wget только через HTTP).
- Здесь реализовано больше возможностей для авторизации на сайтах и для поддержки SSL-подключений.
- Помимо POST и GET поддерживаются некоторые другие методы (например, PUT).
В противовес cURL wget тоже есть что предложить:
- Возможна рекурсивная загрузка содержимого каталогов.
- Доступно сохранение (создание) копий сайтов.
- Прерванную загрузку можно возобновить (не нужно скачивать большие файлы заново).
- Набор опций меньше, как следствие управление и настройка wget проще.
Наш материал о том, как cURL подружить с прокси.
Выводы и рекомендации
Wget – простая, но мощная утилита для скачивания файлов и HTML-страниц. Её вполне можно приспособить для задач парсинга. Обратиться к утилите можно в консоли или на уровне bash-скриптов. Из минусов – её невозможно задействовать как библиотеку. А ещё она не умеет самостоятельно ротировать прокси.
Найти качественные резидентные и мобильные прокси с автоматической ротацией можно в нашем сервисе. Froxy – это более 8 млн. IP-адресов, удобный интерфейс и таргетинг до уровня города (уверенное покрытие во всех странах мира). Оплачивается только трафик. Для тестирования возможностей есть специальный trial-пакет.