Использование Python и Wget для загрузки веб-страниц и файлов

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

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

В этой статье на простых примерах будут показаны преимущества использования Wget в Python. Вы также узнаете об ограничениях и альтернативах Wget.

Зачем использовать Wget?

Wget - это удобный и широко поддерживаемый инструмент для загрузки файлов по трем протоколам: HTTP, HTTPS и FTP. Своей популярностью Wget обязан двум основным характеристикам: рекурсивности и надежности.

Рекурсивность: При использовании соответствующих параметров Wget может работать как веб-краулер. Вместо загрузки одного файла он может рекурсивно загружать файлы, связанные с определенной веб-страницей, пока не будут исчерпаны все ссылки или пока не будет достигнута заданная пользователем глубина рекурсии. В этом случае Wget сохраняет загруженные файлы в структуре каталогов, напоминающей сервер, с которого они были загружены. Данная возможность является очень настраиваемой:

  • поддерживает подстановочные знаки в сетевых расположениях и именах файлов
  • предлагает проверку временных меток, так что скачиваются только новые или обновленные файлы
  • соблюдает стандарт исключения robots

Надежность: Wget может восстанавливаться после обрыва передачи, что делает его хорошим решением для загрузки файлов по нестабильным или медленным сетям. Wget использует HTTP-заголовок Range для продолжения загрузки с того места, где она была прервана, до тех пор, пока не будет получен весь файл. Это не требует вмешательства со стороны пользователя.

Wget2 был выпущен в 2021 году. Хотя он поддерживает примерно те же функции, в нем сделан упор на распараллеливание, благодаря чему он работает гораздо быстрее своего предшественника.

Почему Wget с Python?

Python - это язык программирования общего назначения, используемый в финансовой сфере, академических кругах, облачных технологиях/инженерии данных, науке о данных, веб-разработке и автоматизации рабочих процессов. Он не только широко используется в различных областях и сферах деятельности, но и имеет огромное сообщество, является самым популярным языком программирования в Google и возглавляет список самых востребованных языков программирования в вакансиях.

Используя Wget, вы можете легко превратить скрипты на Python в полноценные решения для поиска информации в Интернете. Интересные примеры использования::

  • Создание наборов данных для академических и бизнес-задач. С помощью Wget можно легко спарсить содержимое одного или нескольких сайтов. Такие большие наборы данных могут быть очень важны для исследований в области машинного обучения. Например, последние модели НЛП были бы невозможны без миллиардов фрагментов контента.
  • Мониторинг крупных веб-сайтов. Автоматизируйте работу Wget для проверки доступности веб-страниц и файлов из различных сетей и мест по всему миру.
  • Сопоставление контента. Множество веб-страниц генерируют персонализированный контент. Настроив Wget на поведение различных персон, можно получить представление о том, какой контент показывается тем или иным пользователям.

Хотя в Python существует множество способов запуска команд и программ оболочки (таких как Wget), в данном учебном пособии для взаимодействия с оболочкой операционной системы будет использоваться пакет subprocess.

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

Использование Wget в Python

Далее вы настроите Wget для загрузки файлов в Python.

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

  • Если вы используете Linux, то, возможно, он уже предустановлен.
  • Если вы используете Mac, то проще всего установить Wget с помощью Homebrew.
  • Пользователи Windows могут загрузить исполняемый файл инструмента командной строки Wget с этого сайта. После загрузки убедитесь, что он добавлен в переменную PATH.

Выполнение команд с помощью пакета Subprocess

Для выполнения команд Wget внутри Python-скрипта используется метод Popen пакета subprocess. Каждый раз, когда ваш скрипт вызывает popen(), он будет выполнять переданную команду в независимом экземпляре командного процессора операционной системы. Если установить аргумент verbose в True, то он также вернет вывод команды. Не стесняйтесь адаптировать этот код под свои нужды.

Все фрагменты кода можно найти в этом файле.

import subprocess

def runcmd(cmd, verbose = False, *args, **kwargs):

    process = subprocess.Popen(
        cmd,
        stdout = subprocess.PIPE,
        stderr = subprocess.PIPE,
        text = True,
        shell = True
    )
    std_out, std_err = process.communicate()
    if verbose:
        print(std_out.strip(), std_err)

runcmd('echo "Hello, World!"', verbose = True)

Все команды, которые вы будете использовать в этом разделе, построены одинаково. Вы используете команду wget, задаете ей URL и указываете определенные параметры для достижения определенных целей.

wget \[options\] url

 

Когда не стоит использовать Wget

Wget - отличное решение для рекурсивной загрузки файлов с веб-серверов. Однако его применение ограничено из-за такой узкой направленности, поэтому стоит рассмотреть альтернативные варианты.

  • Для загрузки файлов по протоколам, отличным от HTTP(S) или FTP(S), лучше всего использовать cURL с Python.
  • Если вам нужно спарсить только определенные элементы DOM на веб-странице, не сохраняя файл локально, рассмотрите запросы в сочетании с [Beautiful Soup]

Selenium - прекрасное решение для имитации поведения щелчков и прокрутки на сайте (например, в целях тестирования).

Заключение

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

Возможно, направленность Wget несколько ограничена, но он предлагает множество возможностей для загрузки файлов и веб-парсинга.