Как скачивать файлы с помощью cURL

Узнайте, как эффективно скачивать файлы с помощью cURL: от базового синтаксиса до расширенных опций, а также ознакомьтесь с кратким сравнением cURL с Wget.
4 min read
How to download files with curl blog image

Из этого руководства вы узнаете:

  • Базовый синтаксис скачивания файлов cURL
  • Как обрабатывать более сложные сценарии при скачивании файлов с помощью cURL
  • Как скачивать несколько файлов одновременно
  • Некоторые рекомендации по эффективному использованию cURL
  • Краткое сравнение cURL и Wget

Давайте рассмотрим эти вопросы подробнее!

Базовый синтаксис скачивания файлов с помощью cURL

Это самый простой синтаксис скачивания файлов с помощью cURL:

curl -O <file_url>

Примечание: в Windows замените curl на curl.exe. Это необходимо, потому что curl является псевдонимом для Invoke-WebRequest в Windows PowerShell, а curl.exe явно запускает средство командной строки cURL.

Флаг -O предписывает cURL сохранить скачанный файл с исходным именем по URL-адресу, указанному в <file_url>. Аналогично, вы можете использовать --remote-name:

curl --remote-name <file_url>

Например, рассмотрим следующую команду скачивания файла cURL:

curl -O "https://i.imgur.com/CSRiAeN.jpg"

В результате появится индикатор выполнения скачивания, как показано ниже:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 35354  100 35354    0     0   155k      0 --:--:-- --:--:-- --:--:--  158k

Когда прогресс достигнет 100%, в папке, где вы выполнили команду cURL, появится файл с именем CSRiAeN.jpg:

Скачанный файл CSRiAeN.jpg в папке, где был запущен cURL

Для получения дополнительной информации о том, что такое cURL и какие возможности он предлагает, прочитайте наше руководство по cURL. Пора изучить более сложные сценарии!

Использование cURL для скачивания файла: дополнительные параметры

Теперь, когда вы знаете базовый синтаксис скачивания файлов с помощью cURL, вы готовы научиться настраивать команду с помощью дополнительных опций.

Изменение имени скачанного файла

По умолчанию опция -O скачивает файл, указанный в целевом URL-адресе, под исходным именем. Если удаленный файл, указанный в URL-адресе, не содержит имени, cURL создает файл без расширения с именем curl_response:

Файл curl_response по умолчанию в папке, где был запущен cURL

cURL также напечатает предупреждение, информирующее вас о таком поведении:

Warning: No remote file name, uses "curl_response"

Чтобы указать собственное имя для скачивемого файла, используйте флаг -o (или --output), как показано здесь:

curl "https://i.imgur.com/CSRiAeN.jpg" -o "logo.jpg"

Эта команда предписывает cURL выполнить запрос GET к указанному URL-адресу файла. Затем скачанное содержимое сохраняется под именем, указанным после -o, а не печатает его в stdout.

На этот раз выходным файлом будет файл logo.jpg:

Скачанный файл logo.jpg в папке, где был запущен cURL

Следите за перенаправлениями

Некоторые URL-адреса не указывают напрямую на нужный файл и требуют автоматической переадресации для получения конечного адреса.

Чтобы научить cURL следовать перенаправлениям, вам необходимо использовать опцию -L:

curl -O -L "<file_url>"

Без флага -L cURL выводит заголовки ответа на перенаправление (например, 301 Перемещено навсегда или 302 Найдено). В частности, оно не будет автоматически следовать новому местоположению, указанному в заголовке Location.

Аутентификация на сервере

Некоторые серверы ограничивают доступ к своим ресурсам и требуют аутентификации пользователя. Для выполнения базовой аутентификации HTTP или FTP вы можете использовать опцию -u (или --user). Она позволяет указать имя пользователя и пароль в следующем формате:

<username>:<password>

Имя пользователя и пароль разделены двоеточием (:), что делает невозможным включение двоеточия в имя пользователя. Вместо этого пароль может содержать двоеточие.

Строка <password> является необязательной. Если вы укажете только имя пользователя, cURL предложит ввести пароль.

Ниже приведен синтаксис скачивания файла с помощью cURL с использованием аутентификации сервера:

curl -O -u <username>:<password> <file_url>

Например, вы можете скачать файл .png с URL-адреса с аутентификацией с помощью следующей команды:

curl -O -u "myUser:myPassword" "https://example.com/secret.txt"

cURL выполнит аутентификацию на сервере, используя myUser и myPassword в качестве учетных данных. Затем он скачает файл secret.txt.

Установка ограничений пропускной способности

По умолчанию cURL скачивает файл, используя полную доступную полосу пропускания, что не всегда желательно. Для управления скоростью скачивания вы можете использовать опцию --limit-rate, а затем максимальную скорость скачивания, которую вы хотите установить:

curl -O --limit-rate 5k "https://i.imgur.com/CSRiAeN.jpg"

Результат будет выглядеть примерно так:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 35354  100 35354    0     0   5166      0  0:00:06  0:00:06 --:--:--  5198

Обратите внимание, что скорость скачивания (5198 байт в секунду, что соответствует 5 КБ в секунду) соответствует скорости, указанной в опции. Это происходит, даже если обычная скорость скачивания вашего компьютера превышает значение, заданное параметром --limit-rate.

--limit-rate полезно для управления использованием полосы пропускания, чтобы избежать перегрузки сети, соблюдения ограничений полосы пропускания или моделирования более медленных сетевых условий для тестирования.

Скачивание через прокси-сервер

Когда вы выполняете запрос на скачивание с помощью cURL, ваш IP-адрес передается целевому серверу. Это проблема, если вы хотите сохранить конфиденциальность или избежать мер по борьбе с ботами, таких как ограничение скорости.

Чтобы скрыть свой IP-адрес и направить запрос через прокси-сервер, используйте опцию -x (или --proxy) в команде cURL:

curl -x <proxy_url> -O <file_url>

<proxy_url> необходимо указать в следующем формате:

[protocol://]host[:port]

Обратите внимание, что URL-адрес прокси-сервера может отличаться в зависимости от того, используете ли вы прокси-сервер HTTP, HTTPS или SOCKS. Более подробные инструкции см. в нашем руководстве по интеграции прокси-сервера cURL.

Например, если вы используете прокси-сервер HTTP, команда будет выглядеть следующим образом:

curl -x "http://proxy.example.com:8080" -O "https://i.imgur.com/CSRiAeN.jpg"

Выполнение скачивания в фоне

По умолчанию команда «cURL download file» отображает индикатор выполнения или сообщение об ошибке в случае сбоя. Чтобы отключить эти выводы, вы можете включить «молчаливый» или «тихий» режим, используя опцию -s (или --silent):

curl -O -s "https://i.imgur.com/CSRiAeN.jpg"

Это заставит cURL работать без выдачи сообщений. В случае успешного скачивания файл появится в текущем каталоге, но в терминале не будет обратной связи.

Печать подробной словесной информации

В случае ошибки или для лучшего понимания того, что cURL делает за кулисами, рекомендуется включить режим словесной информации, используя опцию -v (или --verbose):

curl -O -v "https://i.imgur.com/CSRiAeN.jpg"

При выполнении команды вы увидите дополнительные выходные данные, содержащие подробную информацию о процессе отправки запроса и получения ответа:

* IPv6: (none)
* IPv4: 146.75.52.193
*   Trying 146.75.52.193:443...
* schannel: disabled automatic use of client certificate
* ALPN: curl offers http/1.1
* ALPN: server accepted http/1.1
* Connected to i.imgur.com (146.75.52.193) port 443
* using HTTP/1.x
> GET /CSRiAeN.jpg HTTP/1.1
> Host: i.imgur.com
> User-Agent: curl/8.10.1
> Accept: */*
>
* Request completely sent off
* schannel: failed to decrypt data, need more data
< HTTP/1.1 200 OK
< Connection: keep-alive
< Content-Length: 35354
< Content-Type: image/jpeg
< Last-Modified: Wed, 08 Jan 2025 08:02:49 GMT
< ETag: "117b93e0521ba1313429bad28b3befc8"
< x-amz-server-side-encryption: AES256
< X-Amz-Cf-Pop: IAD89-P1
< X-Amz-Cf-Id: wTQ20stgw0Ffl1BRmhRhFqpCXY_2hnBLbPXn9D8LgPwdjL96xarRVQ==
< cache-control: public, max-age=31536000
< Accept-Ranges: bytes
< Age: 2903
< Date: Wed, 08 Jan 2025 08:51:12 GMT
< X-Served-By: cache-iad-kiad7000028-IAD, cache-lin1730072-LIN
< X-Cache: Miss from cloudfront, HIT, HIT
< X-Cache-Hits: 1, 0
< X-Timer: S1736326272.410959,VS0,VE1
< Strict-Transport-Security: max-age=300
< Access-Control-Allow-Methods: GET, OPTIONS
< Access-Control-Allow-Origin: *
< Server: cat factory 1.0
< X-Content-Type-Options: nosniff
<
{ [1371 bytes data]
100 35354  100 35354    0     0   212k      0 --:--:-- --:--:-- --:--:--  214k
* Connection #0 to host i.imgur.com left intact

Сюда входят сведения о подключении, заголовки запросов, заголовки ответов и дополнительная информация о ходе скачивания.

Настройка упрощенного индикатора выполнения

Стандартный индикатор выполнения скачивания файла cURL может не соответствовать вашим потребностям. Вы можете включить более простой индикатор выполнения с помощью опции -# (или --progress-bar):

curl -O -# "https://i.imgur.com/CSRiAeN.jpg"

Появится индикатор выполнения с символом #, который будет постепенно заполняться по мере скачивания файла:

########################################################### 100.0%

Панель # обеспечивает более минималистичное представление о ходе скачивания по сравнению с выводом прогресса cURL по умолчанию.

Как скачать несколько файлов с помощью cURL

Вы только что видели, как скачать файл с помощью cURL, но что насчет скачивания нескольких файлов с помощью одной команды? Уделите время изучению этого!

Скачивание файлов из диапазона

cURL поддерживает скачивание нескольких файлов одновременно с помощью расширения URL-адресов. В частности, можно скачать несколько файлов с одним и тем же удаленным URL-адресом, указав их в фигурных скобках {}:

curl -O "https://example.com/images/{1.jpg,2.jpg,3.jpg}"

Это позволит скачать три указанных файла:

1.jpg
2.jpg
3.jpg

Обратите внимание, что файлы, указанные в {}, могут иметь разные расширения.

Аналогично, вы можете использовать синтаксис с квадратными скобками []:

curl -O "https://example.com/files/file[1-3].jpg"

Это даст тот же результат, что и в первом примере. В этом случае все файлы в [] должны иметь одно и то же расширение.

Примечание: если вы включите собственные параметры (например, -s для беззвучного режима или --limit-rate для ограничения полосы пропускания), они будут применены ко всем скачиваемым файлам.

Скачивание нескольких файлов

Чтобы скачать файлы с разных URL-адресов, вам необходимо несколько раз указать опцию -O:

curl -O "https://i.imgur.com/CSRiAeN.jpg" -O "https://brightdata.com/wp-content/uploads/2020/12/upload_blog_20201220_153903.svg"

Эта команда скачает CSRiAeN.jpg с сайта i.imgur.com и upload_blog_20201220_153903.jpg с сайта brightdata.com.

Выходные данные будут содержать панель скачивания для каждого заданного URL-адреса:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 35354  100 35354    0     0   271k      0 --:--:-- --:--:-- --:--:--  276k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 22467    0 22467    0     0  34657      0 --:--:-- --:--:-- --:--:-- 34724

Аналогичным образом можно использовать несколько опций -o:

curl "https://i.imgur.com/CSRiAeN.jpg" -o "logo.jpg" "https://brightdata.com/wp-content/uploads/2020/12/upload_blog_20201220_153903.svg" -o "blog_post.svg"

Вышеуказанная команда скачает CSRiAeN.jpg и сохранит его как logo.jpg, а затем скачает upload_blog_20201220_153903.svg и сохранит его как blog_post.svg.

Имейте в виду, что вы также можете совмещать варианты -O и -o:

curl "https://i.imgur.com/CSRiAeN.jpg" -o "logo.jpg" -O "https://brightdata.com/wp-content/uploads/2020/12/upload_blog_20201220_153903.svg"

При этом скачивается logo.jpg, как и раньше, и upload_blog_20201220_153903.svg с исходным именем файла.

Обратите внимание, что другие опции, такие как -v-s или --limit-rate, применяются ко всем URL-адресам по-разному, поэтому их необходимо указать один раз.

Рекомендации по загрузке скачиванию с помощью cURL

Ниже приведен список некоторых наиболее важных рекомендаций по скачиванию файлов с помощью cURL:

  • Используйте curl.exe вместо curl в Windows: в Windows используйте curl.exe вместо curl , чтобы избежать конфликта с командлетом Invoke-WebRequest.
  • Игнорируйте ошибки HTTPS и SSL/TLS (с осторожностью): используйте опцию -k (или --insecure), чтобы игнорировать ошибки проверки сертификатов SSL/TLS. В то же время имейте в виду, что это ставит под угрозу безопасность и должно использоваться только в доверенных средах.
  • Указывайте правильные методы HTTP: при выполнении запросов используйте соответствующий HTTP-метод, например GET, POST или PUT. Этот метод влияет на то, как сервер отвечает на ваш запрос. Используйте опцию -X, чтобы указать метод.
  • Заключайте URL-адреса в кавычки и избегайте специальных символов: для правильной обработки специальных символов всегда заключайте URL-адреса в одинарные или двойные кавычки. Используйте символы escape (\), чтобы избежать проблем с пробелами, амперсандами и другими специальными символами в URL-адресах.
  • Укажите прокси-сервер для защиты вашей личности: используйте опцию -x (или --proxy) для маршрутизации запросов cURL через прокси-сервер. Это помогает защитить ваш IP-адрес и сохранить конфиденциальность при парсинге или скачивании файлов.
  • Сохраняйте и повторно используйте файлы cookie в разных запросах: используйте опции -c и -b для сохранения и повторного использования файлов cookie в последующих запросах. Это помогает поддерживать постоянство сеанса и может быть полезно для аутентификации или отслеживания.
  • Ограничьте скорость скачивания для лучшего контроля: используйте опцию --limit-rate , чтобы контролировать скорость скачивания и не перегружать сетевое соединение и предотвратить активацию ограничений частоты скорости на сервере.
  • Добавьте подробный вывод для отладки: включите подробный режим с помощью опции -v, чтобы получить подробную информацию о запросе и ответе. Это может быть полезно для отладки и устранения неполадок.
  • Проверка ответов на ошибки: всегда проверяйте коды ответов HTTP, используя опцию -w, чтобы убедиться, что скачивание файла прошло успешно (например, 200 OK) или произошла ли ошибка (например, 404 Не найдено).

cURL и Wget для скачивания файлов

cURL и Wget являются инструментами командной строки для получения файлов с удаленных серверов. Основное различие между ними заключается в следующем:

  • Wget предназначен для скачивания файлов из Интернета. Он поддерживает HTTP, HTTPS, FTP и многие другие протоколы. Wget известен своей способностью рекурсивно скачивать файлы, возобновлять прерванные закачки и хорошо работать в фоновом режиме. Посмотрите, как использовать его для скачивания веб-страниц с помощью Python.
  • cURL — это универсальный инструмент командной строки, используемый для передачи данных на сервер и с сервера с использованием различных интернет-протоколов. Он обычно используется для тестирования конечных точек, выполнения простых HTTP-запросов и скачивания отдельных файлов. cURL также можно использовать для веб-парсинга.

Основное различие между cURL и Wget заключается в том, что cURL обеспечивает более детальный контроль над передачей данных. В частности, он поддерживает настраиваемые заголовки, аутентификацию и другие протоколы. Напротив, Wget проще и лучше подходит для массовых скачиваний, рекурсии и обработки прерванных передач.

Заключение

Из этого руководства вы узнали, как скачивать файлы с помощью cURL. Вы начали с базового синтаксиса скачивания файлов с помощью cURL и изучили более сложные сценарии и варианты использования. Теперь вы знаете, как выполнить парсинг одного или несколько файлов с помощью cURL.

Имейте в виду, что каждый раз, когда вы делаете HTTP-запрос, вы оставляете следы в Интернете. Чтобы защитить свою личность, конфиденциальность и повысить безопасность, вам следует рассмотреть возможность интеграции прокси-сервера с cURL. К счастью, Bright Data поможет вам!

Bright Data управляет лучшими прокси-серверами в мире, обслуживая компании из списка Fortune 500 и более 20 000 клиентов. Ее всемирная сеть прокси-серверов включает в себя:

В целом, это одна из крупнейших и самых надежных на рынке прокси-сетей, ориентированных на парсинг.

Зарегистрируйтесь сейчас и протестируйте наши прокси и решения для парсинга бесплатно!

Кредитная карта не требуется