Когда речь заходит о парсинге или об автоматизации рутинных задач в интернете, бородатые сисадмины и web-программисты (как начинающие, так и профи) всегда знают волшебный рецепт, который сможет решить практически любые «хотелки» – это великий и ужасный cURL.
Всех слабонервных просьба отойти от экранов и переключиться на что-то более позитивное. Ниже речь о хардкор-решениях для профи, а также для тех, кто задумывается о создании своего собственного парсера.
Ранее мы рассказывали о разных библиотеках и фреймворках для Python, а также о библиотеках для парсинга на языке Go. Сейчас о command-like интерфейсе и о том, как использовать cURL через прокси.
cURL – это связка из кроссплатформенной библиотеки (libcurl) и программы, управляемой с помощью интерфейса командной строки, предназначенной для обмена информацией и файлами посредством различных интернет-протоколов. В списке поддерживаемых протоколов более десятка наименований, но всех их объединяет работа с адресами на основе разметки URL.
Собственно, сURL – это анаграмма от слов «Client URL». Аббревиатура URL расшифровывается как Uniform Resource Locator, что в переводе означает «единый/унифицированный указатель ресурса».
Многие обыватели привыкли называть URL-адреса ссылками. Типовая структура URL-адреса выглядит следующим образом:
<протокол_или_схема>://<логин>:<пароль>@<хост>:<номер_порта>/<символьный_путь>?<дополнительные_параметры>#<якорь>
Если какие-то элементы не используются, то они опускаются (то есть убираются из URL).
Вот так выглядят URL-адреса для известного многим протокола HTTP:
http://www.домен.зона/путь/до/страницы/
Тот же адрес может выглядеть заметно сложнее, если используется передача дополнительных параметров и якорных ссылок:
http://www.домен.зона/путь/до/страницы/?параметр1=значение1&параметр2=значение2#якорь_для_перемещения_к _нужному_идентификатору_элемента
Если используется протокол SOCKS5 и параметры авторизации, как в случае с нашими резидентными или мобильными прокси, то URL будет выглядеть примерно так:
socks5://login:password@123.123.123.123:port
Обратите внимание, вместо домена здесь используется конкретный IP-адрес.
cURL поддерживает следующие протоколы:
Но что самое приятное, cURL умеет работать через HTTP и SOCKS-прокси.
Спектр задач, для которых можно применять cURL, просто нереальный. Это почти что текстовый браузер, только управлять его работой нужно из консоли. И именно поэтому очень важно знать ключевые аргументы cURL и порядок указания их параметров.
cURL обычно используют:
Давайте разбираться в деталях.
Для Windows-систем
Во всех последних версиях операционных систем Windows, начиная со сборки 1803 (Windows 10) и выше, есть встроенный клиент cURL. Но тут есть нюансы. Системное решение работает как командлет Invoke-WebRequest. Соответственно, предполагается использование изменённого синтаксиса, вследствие чего будут недоступны многие параметры командной строки.
Поэтому, если вы хотите использовать стандартный интерфейс cURL, нужно выбрать одно из нескольких решений:
Для Linux-дистрибутивов
Установка cURL в большинстве случаев не потребуется. Во всех популярных дистрибутивах связка из библиотеки и утилиты есть в наличии.
Если при вызове команды curl в терминале система ругается на отсутствующий исполняемый файл, то можно установить программу с помощью штатного пакетного менеджера, например:
Для MacOS
cURL установлена во всех Mac OS по умолчанию. Чтобы начать использование утилиты, просто откройте приложение «Терминал» и начните вводить команды.
Чтобы обратиться к программе в консоли (в терминале или в командной строке), достаточно просто ввести её имя: curl.
Но, к сожалению, команда без аргументов не даст абсолютно никакого результата. Максимум, отобразит подсказку о том, как вызвать помощь (справочный раздел).
Чтобы увидеть базовый список доступных аргументов, нужно ввести команду:
curl --help
или для Windows:
curl.exe --help
Если вам нужен максимально полный обзор всех опций, введите команду:
curl --help all
Обратите внимание, аргументы можно указывать двумя способами:
Если использовать утилиту без аргументов, но с указанием URL-адреса, то это будет аналогом GET-запроса. Пример на пальцах:
curl https://blog.froxy.com/ru/what-is-data-parsing
Это то же самое, что и:
curl --request GET https://blog.froxy.com/ru/what-is-data-parsing
На всякий случай, cURL прекрасно работает с SSL-сертификатами (то есть с httpS-протоколом) и с другими типами запросов: PUT, POST, DELETE, HEAD.
В ответ на GET-запрос cURL получит полное содержимое HTML-страницы по указанному адресу.
Вот так будет выглядеть команда для работы cURL с HTTP-заголовками:
curl -I https://blog.froxy.com/ru/what-is-data-parsing
А так полученные данные можно сохранить в файл:
curl -o what-is-data-parsing.html “https://blog.froxy.com/ru/what-is-data-parsing”
Среди общего списка аргументов cURL есть:
Что интересно, cURL поддерживает функции подстановки и перестановки.
Например, можно использовать такой синтаксис:
curl “http://домен.{один,два,три}.com”
Данные, записанные в фигурных скобках через запятую, будут последовательно перебираться скриптом.
Если нужно обозначить диапазон числовых значений, можно задействовать квадратные скобки, например, так:
"http://домен.зона/archive[2000-2022]/vol[1-4]/part{a,b,c}.html"
Скрипт сам последовательно укажет все комбинации от 2000 до 2022 (для archive) и от 1 до 4 (для vol). Если использовать двоеточие, то можно указать шаг автоматического перебора, например, так [2000-2022:3], в итоге скрип будет использовать порядок 2000, 2003, 2006 и т.п.
Начиная с версии cURL 8.3 в утилиту добавлена поддержка переменных. Создание переменных реализовано через атрибут --variable.
Например:
--variable '%DATA@default'
--expand-url = "https://example.com/api//method"
Крайне важно задействовать именно двойные кавычки, так как одинарные не поддерживают работу с переменными (они будут восприниматься как обычный текст).
В приведённом выше примере мы сначала объявили переменную DATA и сразу же присвоили ей дефолтное значение default (значение по умолчанию будет использовано утилитой в случае, если переменная будет пустой на момент обращения к ней).
Обращение к переменной выполняется с помощью конструкции .
Плюс, при работе cURL можно задействовать переменные, которые объявляются на уровне оболочки (в shell-скриптах). Тут тоже главное не забыть о двойных кавычках:
your-variable = XXX
curl -X GET "http://домен.com:8080/details/${your-variable}"
Для работы с прокси в cURL используется атрибут «-x» или «--proxy».
Например, так:
curl --proxy "http://login:password@123.123.123.123:port" "http://домен.com/целевая-страница"
Или так:
curl -x "http://login:password@123.123.123.123:port" "http://домен.com/целевая-страница"
Но согласитесь, что каждый раз вводить одни и те же данные не очень удобно. А что, если данные прокси вообще каждый раз меняются?
Для этих ситуаций есть несколько типовых решений. О них ниже.
Если нет задачи полного перебора списка с прокси-серверами, то можно обойтись максимально простой записью.
Пример:
Для Linux-систем
export yourproxy=http://LOGIN:PASSWORD@proxy-url.com:8080
Для Windows-систем
set yourproxy=http://LOGIN:PASSWORD@proxy-url.com:8080
Так мы создали переменную и заполнили её значением.
Осталось вызывать переменную там, где это нужно. В случае с прокси это может выглядеть так:
curl -x $yourproxy https://blog.froxy.com/ru/what-is-data-parsing
Вариант с перебором списка прокси будет заметно сложнее – см. раздел выше про использование переменных окружения.
Если вам нужен SOCKS-протокол, то его можно указать явно внутри адреса прокси, например, --proxy "socks5://login:password@123.123.123.123:port".
Ну или вместо атрибута «--proxy» или «-x» можно использовать специальные атрибуты:
Синтаксис у них аналогичный.
Теперь представим, что вам нужно работать с командной строкой, но не хочется каждый раз вводить параметры коннекта cURL к одному и тому же прокси-серверу.
Наиболее интересный выход для такой рутины – создание ссылки (алиаса или псевдонима). Выполняется это командой alias (в Linux-системах).
Пример ярлыка с готовыми параметрами подключения прокси:
alias xcurl=”curl --proxy http://LOGIN:PASSWORD@proxy-url.com:8080”
Теперь, чтобы выполнить запрос к нужному сайту или задействовать иные параметры утилиты, вместо стандартного вызова curl достаточно обратиться к нашему алиасу:
xcurl https://blog.froxy.com/ru/what-is-data-parsing
Вместо xcurl вы можете использовать любое другое имя, главное, чтобы оно не совпадало с именами других системных утилит и легко запоминалось/вводилось в терминале.
В Windows тоже есть команда alias, но работает она совсем по-другому. Чтобы создать ярлык для новой команды, нужно будет поработать с реестром и с .bat/.cmd файлами.
Все настройки утилиты cURL, которые связаны с конкретным пользователем, сохраняются в его домашнем каталоге:
Для Linux-систем
/home/user/.curlrc
Обратите внимание, точка в начале файла говорит о том, что он является скрытым. Чтобы отобразить его в проводнике (файловом менеджере), нужно активировать опцию показа скрытых файлов.
Ну, или можно напрямую обратиться к редактированию конфига через командную строку:
nano /home/user/.curlrc
или
nano ~/.curlrc
Nano – это текстовый редактор для консоли, вместо него можно использовать софт с графическим интерфейсом, например, Gedit.
Если файл не существует, просто создайте его (фактически, команда, приведённая выше для консоли, никак не изменится).
Впишите настройку прокси в файл и сохраните его:
proxy="http://ЛОГИН:ПАРОЛЬ@123.123.123.123:1234"
Готово, теперь можно использовать cURL как обычно, параметры прокси будут подтягиваться по умолчанию:
curl https://blog.froxy.com/ru/what-is-data-parsing
Для Windows-систем файл настроек должен храниться к папке C:\Users\<ИМЯ-ВАШЕГО-ПОЛЬЗОВАТЕЛЯ>\AppData\Roaming, а называться должен _curlrc.
cURL – это действительно мощный и функциональный инструмент в умелых руках. С одной только этой утилитой можно собрать и выгрузить заголовки страниц целевого сайта, скачать с него весь контент и HTML-страницы. Всё, что вам понадобится – только консоль и несколько стандартных команд.
С библиотекой cURL бесшовно интегрируются многие языки веб-программирования. Пример документации для PHP. Поэтому скрипты автоматизации парсинга смогут заиграть новыми красками буквально в несколько дополнительных строк кода.
Вместе с тем, обывателям cURL точно не подойдёт ввиду сложности синтаксиса и тяжёлого понимания принципов работы.
Каким бы простым ни был ваш скрипт парсинга, с большой вероятностью его могут заблокировать из-за повторяющихся запросов с одного и того же IP-адреса хоста. Чтобы избежать таких блокировок, нужны прокси. cURL умеет работать с ними «из коробки».
Единственная проблема – найти качественный сервис. Мы предлагаем лучшие мобильные и резидентные прокси с автоматической ротацией. В наличии API и простая выгрузка списков, таргетинг до уровня города и оператора связи. В пуле более 8 млн. IP-адресов. Для тестирования есть специальный триал-пакет.