- Wget — консольный загрузчик для скачивания сайтов и его использование в Windows
- Установка PowerShellGet Installing PowerShellGet
- Модуль PowerShellGet входит в комплект поставки в следующих выпусках: PowerShellGet is an in-box module in the following releases
- Получение последней версии из коллекции PowerShell Get the latest version from PowerShell Gallery
- Для систем с PowerShell 5.0 (или более поздней версии) можно установить последнюю версию PowerShellGet For systems with PowerShell 5.0 (or newer) you can install the latest PowerShellGet
- Для компьютеров с PowerShell 3.0 или 4.0 For computers running PowerShell 3.0 or PowerShell 4.0
- Подготовительные действия на компьютерах с PowerShell 3.0 Preparatory Step on computers running PowerShell 3.0
- Компьютеры с установленной предварительной версией PackageManagement Computers with the PackageManagement Preview installed
- Компьютеры без PowerShellGet Computers without PowerShellGet
- Как работать с Invoke-WebRequest в Powershell и алиасом Wget создавая запросы HTTP и HTTPS
- Создание запроса HTTP и HTTPS в Powershell
- Доступ к свойствам
- Использование заголовков
- Cookies
- Работа с формами и загрузка
- Кодировка
- Аутентификация
- Базовая аутентификация
- Используя сертификат
- NTLM и Kerberos
- Парсинг сайтов
- Картинки
- Парсинг других тегов
- Работа с классом Net.WebClient
- Скачивание
Wget — консольный загрузчик для скачивания сайтов и его использование в Windows
Одно время в Рунете немалой популярностью пользовались менеджеры загрузок, позиционируемые их разработчиками как более эффективные инструменты скачивания контента из глобальной сети. Волна популярности, однако, вскоре схлынула, когда пользователи убедились, что эти программы ненамного превосходят встроенные средства браузеров. В почете остались лишь специализированные загрузчики.
Вроде тех, которые выпрямляют ссылки с YouTube или используются для пакетного скачивания с сайтов файлов определенного типа.
Программа, о которой сегодня пойдет речь, также является загрузчиком файлов, но при этом она имеет существенные отличия. Во-первых, у нее нет привычного графического интерфейса, вместо него пользователям предлагается работать в командной строке, во-вторых, она пришла к нам из мира Linux, а значит будет интересна тем, кто начинал свое знакомство с компьютерными технологиями с этой системы или просто хорошо в ней разбирается.
Называется программа Wget. Впрочем, назвать ее полноценной программой в общеупотребительном смысле слова можно лишь с натяжкой, это скорее утилита, к тому же консольная, а значит и понравится она далеко не всем. Изначально она использовалась для загрузки архивов и вообще скачивания файлов по сети, но с таким же успехом ее можно использовать для создания локальных копий сайтов с сохранением локальной структуры последних, групп и отдельных веб-страниц, а также их конвертирования в формат, удобный для просмотра сайтов в автономном режиме.
Wget умеет работать с протоколами HTTP , HTTPS и FTP , поддерживает прокси и докачку при обрыве связи, обладая при этом достаточно гибким набором комбинируемых параметров. Несмотря на кажущуюся сложность, пользоваться ею не так уже и трудно. Устанавливается утилита как и всякая другая программа — с помощью мастера, а вот запускать ее придется из командной строки, перейдя в расположение исполняемого файла wget.exe расположенного по адресу C:\Program Files\GnuWin32\Bin . Вот так:
Для удобства вы можете добавить расположение утилиты в переменные среды, это позволит вам запускать утилиту, не переходя в ее каталог. Теперь что касается использования. Wget имеет встроенную справку по ключам на русском языке, вызываемую командой -help .
Синтаксис же утилиты можно представить в виде такой схемы:
wget [web] Wget для windows powershell
wget здесь имя исполняемого файла утилиты, web — ресурс в интернете, с которого производится скачивание, key — дополнительные параметры или ключи, добавляемые по необходимости. А вот и самый простой пример использования. Допустим, мы хотим скачать с сети некое изображение. Зная его URL , выполняем такую команду:
Картинка будет сохранена в каталог с исполняемым файлом утилиты. Также вы можете загрузить файл с сохранением структуры каталогов сайта, добавив ключ -p:
Если у вас есть текстовый документ со списком файлов с указанием их URL , Wget поможет скачать их в пакетном режиме.
Для этого используется такая команда:
В файле data.tхt было две ссылки на изображения, но утилита скачала только одну картинку. Такое может быть, если сайт использует HTTPS -соединение, в этом случае не удается проверить подлинность сертификата. Чтобы обойти это ограничение, добавляем к команде ключ —no-check-certificate.
Наконец, с помощью утилиты вы можете загрузить на жесткий диск весь сайт. Команда в этом случае будет выглядеть следующим образом:
Ключ -r устанавливает рекурсивную загрузку, -k — делает ссылки локальными (просмотр сайта в оффлайн-режиме) , -p — загружает все файлы, l — устанавливает глубину рекурсии, в данном примере до пятого уровня вложенности (0 устанавливает бесконечность) .
Поддерживает Wget также множество других параметров. Протоколирование операций, авторизация с логином и паролем на удаленном сервере, выбор действия при повторном скачивании файлов, изменение директории загрузки — всё это и многое другое умеет Wget, главное запастись терпением и во всём разобраться.
Установка PowerShellGet Installing PowerShellGet
Модуль PowerShellGet входит в комплект поставки в следующих выпусках: PowerShellGet is an in-box module in the following releases
Получение последней версии из коллекции PowerShell Get the latest version from PowerShell Gallery
Перед обновлением PowerShellGet всегда устанавливайте последний поставщик NuGet. Before updating PowerShellGet , you should always install the latest NuGet provider. Откройте сеанс PowerShell с повышенными привилегиями и выполните следующую команду. From an elevated PowerShell session, run the following command.
Для систем с PowerShell 5.0 (или более поздней версии) можно установить последнюю версию PowerShellGet For systems with PowerShell 5.0 (or newer) you can install the latest PowerShellGet
Чтобы установить PowerShellGet в Windows 10, Windows Server 2016, а также любой системе с WMF 5.0, 5.1 или PowerShell 6, выполните следующие команды из сеанса PowerShell с повышенными привилегиями. To install PowerShellGet on Windows 10, Windows Server 2016, any system with WMF 5.0 or 5.1 installed, or any system with PowerShell 6, run the following commands from an elevated PowerShell session.
Update-Module позволяет получить более новые версии. Use Update-Module to get newer versions.
Для компьютеров с PowerShell 3.0 или 4.0 For computers running PowerShell 3.0 or PowerShell 4.0
Эти инструкции применимы к компьютерам, на которых установлена предварительная версия PackageManagement или не установлены никакие версии PowerShellGet. These instructions apply to computers that have the PackageManagement Preview installed or don’t have any version of PowerShellGet installed.
Командлет Save-Module используется в обоих наборах инструкций. The Save-Module cmdlet is used in both sets of instructions. Save-Module скачивает и сохраняет модуль и все зависимости из зарегистрированного репозитория. Save-Module downloads and saves a module and any dependencies from a registered repository. Самая последняя версия модуля сохраняется по указанному пути на локальном компьютере, но не устанавливается. The module’s most current version is saved to a specified path on the local computer, but isn’t installed. Чтобы установить модули в PowerShell 3.0 или 4.0, скопируйте сохраненные папки модуля в $env:ProgramFiles\WindowsPowerShell\Modules . To install the modules in PowerShell 3.0 or 4.0, copy the module saved folders to $env:ProgramFiles\WindowsPowerShell\Modules .
Дополнительные сведения см. в статье Save-Module. For more information, see Save-Module.
PowerShell 3.0 и 4.0 поддерживают только одну версию модуля. PowerShell 3.0 and PowerShell 4.0 only supported one version of a module. Начиная с версии PowerShell 5.0 модули устанавливаются в папку \ . Starting in PowerShell 5.0, modules are installed in \ . Это позволяет устанавливать несколько версий параллельно. This allows you to install multiple versions side-by-side. Скачав модуль с помощью Save-Module , необходимо скопировать файлы из \ в папку на целевом компьютере, как показано в приведенных ниже инструкциях. After downloading the module using Save-Module you must copy the files from the \ to the folder on the destination machine, as shown in the instructions below.
Подготовительные действия на компьютерах с PowerShell 3.0 Preparatory Step on computers running PowerShell 3.0
Инструкции, приведенные в разделах ниже, устанавливают модули в каталоге $env:ProgramFiles\WindowsPowerShell\Modules . The instructions in the sections below install the modules in directory $env:ProgramFiles\WindowsPowerShell\Modules . В PowerShell 3.0 этот каталог отсутствует в $env:PSModulePath по умолчанию, поэтому его необходимо добавить, чтобы модули загружались автоматически. In PowerShell 3.0, this directory isn’t listed in $env:PSModulePath by default, so you’ll need to add it in order for the modules to be auto-loaded.
Откройте сеанс Windows PowerShell с повышенными привилегиями и выполните в нем следующую команду (действие будет заметно в будущих сеансах). Open an elevated PowerShell session and run the following command (which will take effect in future sessions):
Компьютеры с установленной предварительной версией PackageManagement Computers with the PackageManagement Preview installed
Предварительная версия PackageManagement была загружаемым компонентом, который обеспечивал доступность PowerShellGet для PowerShell версий 3 и 4, но сейчас он недоступен. PackageManagement Preview was a downloadable component that made PowerShellGet available to PowerShell versions 3 and 4, but it is no longer available. Чтобы проверить, установлен ли он на данном компьютере, выполните Get-Module -ListAvailable PowerShellGet . To test if it was installed on a given computer, run Get-Module -ListAvailable PowerShellGet .
В сеансе PowerShell используйте Save-Module , чтобы скачать текущую версию PowerShellGet. From a PowerShell session, use Save-Module to download the current version of PowerShellGet. Скачиваются две папки: PowerShellGet и PackageManagement. Two folders are downloaded: PowerShellGet and PackageManagement. Каждая папка содержит вложенную папку с номером версии. Each folder contains a subfolder with a version number.
Убедитесь, что модули PowerShellGet и PackageManagement не загружаются в других процессах. Ensure that the PowerShellGet and PackageManagement modules aren’t loaded in any other processes.
Снова откройте консоль PowerShell с повышенными привилегиями, а затем выполните следующую команду. Reopen the PowerShell console with elevated permissions and run the following command.
Компьютеры без PowerShellGet Computers without PowerShellGet
Если на компьютере нет какой-либо версии PowerShellGet (проверьте это командой Get-Module -ListAvailable PowerShellGet ), для скачивания модулей необходим компьютер с PowerShellGet. For computers without any version of PowerShellGet installed (test with Get-Module -ListAvailable PowerShellGet ), a computer with PowerShellGet installed is needed to download the modules.
На компьютере с установленным PowerShellGet используйте Save-Module , чтобы скачать текущую версию PowerShellGet. From the computer that has PowerShellGet installed, use Save-Module to download the current version of PowerShellGet. Скачиваются две папки: PowerShellGet и PackageManagement. Two folders are downloaded: PowerShellGet and PackageManagement. Каждая папка содержит вложенную папку с номером версии. Each folder contains a subfolder with a version number.
Скопируйте соответствующую вложенную папку в папках PowerShellGet и PackageManagement на компьютер, на котором не установлен PowerShellGet , в папки $env:ProgramFiles\WindowsPowerShell\Modules\PowerShellGet\ и $env:ProgramFiles\WindowsPowerShell\Modules\PackageManagement\ соответственно (требуется сеанс с повышенными правами). Copy the respective subfolder in the PowerShellGet and PackageManagement folders to the computer that doesn’t have PowerShellGet installed, into folders $env:ProgramFiles\WindowsPowerShell\Modules\PowerShellGet\ and $env:ProgramFiles\WindowsPowerShell\Modules\PackageManagement\ respectively, which requires an elevated session.
Например, если у вас есть доступ к папке загрузки на другом компьютере (скажем, ws1 ), с целевого компьютера по UNC-пути (допустим, \\ws1\C$\LocalFolder ) откройте консоль PowerShell с повышенными правами и выполните следующую команду. For instance, if you can access the download folder on the other computer, say ws1 , from the target computer via a UNC path, say \\ws1\C$\LocalFolder , open a PowerShell console with elevated permissions and run the following command:
Как работать с Invoke-WebRequest в Powershell и алиасом Wget создавая запросы HTTP и HTTPS
Команда Powershell Invoke-WebRequest появилась в 3-ей версии консоли. Основной задачей команды — обращение к ресурсам по HTTP, HTTPS и FTP. У этой команды в Powershell есть алиасы в виде ‘iwk’ и ‘wget’. На примерах ниже мы рассмотрим обычные запросы, работу с json, заполнение форм, аутентификацию и парсинг.
Навигация по посту
Создание запроса HTTP и HTTPS в Powershell
После выполнения простого запроса мы увидим полученную информацию:
Если вы имеете прямую ссылку на файл и хотите его скачать нужно дополнительно указать ключ OutFile:
Так же можно скачивать любой файл формата ZIP,MP4 и так далее.
Доступ к свойствам
Почти любая команда в Powershell по умолчанию выводит меньше информации чем имеет. Что бы вывести все можно использовать следующий подход:
Я не рекомендую использовать подход выше, так как в этом случае вывод будет сложно читать. Мы можем посмотреть какие свойства хранит объект для следующего анализа:
И таким образом выводить данные:
Само содержимое веб документа может быть доступно по двум свойствам:
Использование заголовков
Выполнив запрос к какому-то сайту может оказаться, что полученные данные не соответствуют тому что мы видим на сайте. Причин, обычно, у этого две:
- Отсутствуют заголовки;
- Часть информации обрабатывается через JavaScript.
Заголовки указываются в формате хэш-таблиц. Для примера так будет выглядеть запрос с указанными заголовками:
Если вы будете испытывать сложности с составлением заголовков, то можно включить отладчик на F12 и открыть закладку Networks и скопировать их. Они находятся в выделенной части на скриншоте:
Кстати через это же меню в Chrome можно получить уже сформировавшийся запрос с командой нажав на нужный элемент и выбрав «Copy as Powershell»:
Команда получится достаточно длинной, но это поможет избавиться от долгих поисков нужных заголовков:
Вы можете увидеть вторую кнопку «Copy all as Powershell», которая сформирует объект типа «[object Promise]», но информацию как работать с этим я не нашел.
Такой способ не поможет пройти аутентификацию на сайте так как в Chrome Cookies устанавливаются в параметр Headers, но судя по документации они должны передаваться через параметр WebSession.
Cookies
Для входа на сайт, где используется аутентификация, понадобится использовать Cookies, которые можно увидеть на скриншоте выше. Cookies вводятся отдельно от заголовков и их можно указать двумя путями.
Во время выполнения аутентификации через Poweshell мы можем указать переменную куда будут сохранены данные, а затем передать ее для следующего запроса. В примере ниже такая переменная называется SavedSession:
Как вы можете увидеть в этой переменной хранятся и заголовки.
Второй способ это заполнить поля Cookies самим через контейнер .NET, то есть способом аналогичным получению заголовков. Первое что делается — создается объект аналогичный SavedSession:
Теперь мы должны добавить в поле Cookies данные и передать через командлет, я использовал алиас wget:
Cookie, которые мы передали соответствуют Password=123.
Работа с формами и загрузка
Когда мы заполняем какую-то форму на сайте или выполняем загрузку мы чаще используем метод POST, а не GET, который стоит по умолчанию. Метод можно увидеть в коде или в описании документации, если используете приложения или API:
Чаще всего используются методы описанные выше, но в Powershell доступно больше:
Ключ, в котором используются эти параметры так и называется Method:
Для заполнения форм, в версии Powershell 6 +, можно использовать следующий подход:
Если вы не установите свой тип в заголовке ContentType то он будет «application/x-www-form-urlencoded». Если это важно, то лучше использовать параметр -ContentType, а не писать это же свойство в заголовке. Синтаксис можно увидеть дальше.
Кодировка
Если вы используете данные, которые отличаются от латиницы вы можете столкнуться с проблемой кодировок. Дело в том, что следующие данные будут отосланы не в UTF-8, хоть это и будет указано:
Если вы не хотите испытывать сложностей с этим командлетом я бы советовал использовать разные ключи для заголовков если у вас есть такие данные. Если указать кодировку в параметре ContentType, то все сработает нормально:
Вы так же можете посылать данные таким образом:
Аутентификация
Посмотрим на три способа аутентификации используя: базовую (Basic), с использованием сертификата, NTLM и Kerberos.
Базовая аутентификация
Обычно сервер передает дополнительные данные для аутентификации, но в примере ниже это выполнение без их использования:
Такой способ не рекомендуется использовать, так как данные будут доступны в истории в незашифрованном виде. Вы так же можете использовать ключ Credential, который создаст аналогичный заголовок за вас.
Используя сертификат
Если у вас установлен сертификат, то вы можете его использовать только указав отпечаток (Thumbprint):
NTLM и Kerberos
Если вам нужно пройти аутентификацию для текущего пользователя вы можете добавить ключ -DefaultCredentials:
Этот ключ не будет работать вместе с аутентификацией типа Basic.
Парсинг сайтов
Парсинг, то есть возможность собирать информацию с сайтов, в Powershell реализована достаточно просто. Если мы посмотрим какие свойства имеет объект команды Invoke-WebRequest, сможем увидеть теги:
Картинки
Для примера в HTML картинки хранятся в таком виде:
То есть все картинки имеют тег IMG и SRC. В Powershell часть тегов уже собрана в отдельные свойства и так мы получим список всех картинок:
Мы видим только ссылки на картинки, а значит нам нужно выполнить еще по запросу для каждой картинки. К тому же я хочу сохранить существующие имена для каждой картинки, так как у них разные форматы (PNG, JPG). Это будет выглядеть примерно так:
Обратите внимание, что если у вас не создана директория куда будут сохранятся картинки, появится ошибка. Iwr не создает директории.
Парсинг других тегов
Парсинг остальной части сайта мало чем отличается от примера с картинками. Так как Images и Links выведены как основные свойства, то поиск, например, заголовков должен делаться через свойство AllElements. Для примера так я найду все теги h2:
Кроме поиска по тегам часто приходится искать по классам. Например так я найду все заголовки h2, но используя класс:
По умолчанию мы не можем работать с JSON объектами. Они будут восприниматься как строки пока мы не конвертируем объект в PSCustomObject. Это делается так:
После этого мы можем обращаться к свойствам:
После изменения мы возможно захотим отправить объект. Для этого мы конвертируем из PSCutomObject в JSON:
Как получать и изменять свойства файлов в Powershell
Работа с классом Net.WebClient
При работе в Powershell доступен еще один метод для доступа к веб страницам и скачивания файлов Net.WebClient. Этот класс имеет методы все из которых мы можем увидеть так:
Скачивание
Метод DownloadString() позволяет скачивать информацию. Так, например, мы получим содержимое главной страницы сайта:
Как вы видите есть проблема с кодировкой. Ее можно исправить так:
Для скачивания файлов используем метод DownloadFile():