Invoke-WebRequest: Обработка содержимого веб-страниц и HTML сайтов в Powershell

В PowerShell версии 3.0 появилась возможность напрямую обращаться и работать с HTML веб-страницам в Интернете. Для этого был разработан специальный командлет Invoke-WebRequest. Данный командлет позволяет реализовать множество сценариев: начиная от возможности скачать/ загрузить файл с/на любого веб-сайта по HTTP/ HTTPS/ FTP, заканчивая возможностями парсинга HTML страниц, мониторинга состояния веб серверов, заполнения и отправкой веб-форм. В целом, новый командлет предоставляет все необходимые методы для навигации по DOM дереву HTML документа. В этой статье мы разберём базовые примеры работы с командлетом PowerShell Invoke-WebRequest.

Совет. Командлет Invoke-WebRequest доступен в Windows PowerShell 3.0, поэтому перед началом работы убедитесь, что у вас используется эта или более свежая версия. Если на компьютере установлено несколько версий Posh, переключиться между ними можно так.

Использование командлета Invoke-WebRequest

Командлет Invoke-WebRequest (псевдоним wget) может отправлять и получать HTTP, HTTPS и FTP запросы, обрабатывать возвращаемый сервером ответ. Полученный ответ представляет собой набор коллекции форм, ссылок, изображений и других важных элементов HTML документа.

Попробуем выполнить следующую команду:

Invoke-WebRequest -Uri "http://winitpro.ru"

Invoke-WebRequest обработка html страниц в powershell

Совет. Если вы подключены к Интернет через прокси-сервер то для корректной работы командлетов PoweShell, воспользуйтесь советами из статьи: Как настроить PowerShell для доступа через прокси-сервер.

Как вы видите, возвращенный ответ представляет собой не простой HTML код страницы. Вы видите различные свойства web-документа. Командлет Invoke-WebRequest, как и большинство других командлетов PowerShell оперирует объектами. Invoke-WebRequest возвращает объект типа HtmlWebResponseObject. Посмотрим все свойства данного объекта:

$WebResponseObj = Invoke-WebRequest -Uri "http://winitpro.ru"
$WebResponseObj| Get-Member

свойства объекта HtmlWebResponseObject

Чтобы получить сырой HTML код веб страницы, который содержится в данном объекте, выполните:

$WebResponseObj.content

Вы можете вернуть HTML код вместе с HTTP заголовками, которые вернул веб сервер:

$WebResponseObj.rawcontent

powershell: получить html код страницы и http заголовки

Вы можете проверить только код ответа веб-сервера и HTTP заголовки HTML страницы:

$WebResponseObj.Headers

Как вы видите, веб сервер вернул ответ 200, т.е. запрос выполнен успешно и веб сервер доступен и работает корректно.

Получаем список всех HTML ссылок на странице

Обратимся к главной странице нашего сайта и получим список ссылок, имеющихся на ней:
$SiteAdress = "http://winitpro.ru"
$HttpContent = Invoke-WebRequest -URI $SiteAdress
$HttpContent.Links | Foreach {$_.href }

Invoke-WebRequest вывести список ссылок на html странице

Чтобы получить и сам текст ссылки (содержится в элементе InnerText), можно воспользоваться такой конструкцией:

$HttpContent.Links | fl innerText, href

Можно выбрать только ссылки с определенным CSS классом:

$HttpContent.Links | Where-Object {$_.class -eq "page-numbers"} | fl innerText, href

Или определенным текстом в url:

$HttpContent.Links | Where-Object {$_.href -like "*exchange*"} | fl innerText,href

powershell фильтр объектов на html странице

Парсинг HTML страниц с помощью Powershell

Командлет Invoke-WebRequest позволяет довольно быстро и удобно парсить содержимое любых веб-страниц. При обработке HTML страницы из ее содержимого формируются коллекции ссылок (links), веб-форм (forms), изображений (images), скриптов (scripts) и т.д.

С помощью Powershell получим содержимое главной страницы нашего сайта:

$Img = Invoke-WebRequest "http://winitpro.ru/"

Затем выведем список всех изображений на данной странице:

$Img.Images

Сформируем коллекцию из полных url путей к используемым изображениям:

$images = $Img.Images | select src

Инициализируем новый экземпляр класса WebClient:

$wc = New-Object System.Net.WebClient

И скачаем все изображения со страницы (с оригинальными именами) в каталог c:\tools\:

$images | foreach { $wc.DownloadFile( $_.src, ("c:\tools\"+[io.path]::GetFileName($_.src) ) ) }

Пример парсинга html страницы на powershellВ качестве интересного примера использования командлета Invoke-WebRequest можно привести способ узнать внешнего IP адреса компьютера из PowerShell.

Как скачать файл по HTTP с помощью PowerShell

Invoke-WebRequest может работать как аналог Wget или cURL для Windows, позволяя скачать с веб-страницы или ftp сайта нужный файл или файлы. Допустим, нам нужно с помощью PowerShell скачать по HTTP некий файл (в нашем примере дистрибутив Mozilla Firefox). Выполним такую команду:

Invoke-WebRequest "https://download.mozilla.org/?product=firefox-32.0.3-SSL&os=win&lang=ru" -outfile “c:\tools\firefox setup 32.0.3.exe” Аналог wget на powershell: как скачать файл по http

В результате выполнения командлета с указанного URL адреса будет скачан файл и сохранен в каталоге c:\tools\  под именем firefox setup 32.0.3.exe. Если нужно скачать файл с FTP сайта, просто замените http: // на  ftp: //.

Так же вы можете скачать файлы с веб-сервера при помощи BITS в синхронном режиме.

Таким образом вы с легкостью можете на определенной веб-странице найти все ссылки, попадающие под конкретные критерии (класс ссылки, разрешение в имени файла, url адрес), и скачать файлы по полученным ссылкам. Например, имеется некий сайт с кучей ссылок на PDF документы. Ваша задача скачать все эти файлы на ваш компьютер. Костяк PowerShell скрипта для массовой скачки файлов может выглядеть так:

$OutDir="C:\Downloads\docs\PDF"
$SiteAdress = "https://www.site.ru/free-pdf-books/"
$HttpContent = Invoke-WebRequest -URI $SiteAdress
$HttpContent.Links | Where-Object {$_.href -like "*.pdf"} | %{Invoke-WebRequest -Uri $_.href -OutFile ($OutDir + $(Get-Random 100000)+".pdf")}

В результате выполнения скрипта в целевом каталоге будут загружены все pdf файлы со страницы. Каждый файл сохраняется под произвольным именем.

В PowerShell 6.1 команделт Invoke-WebRequest поддерживает режим докачки. Таким образом с помощью параметра Invoke-WebRequest -Uri $Uri -OutFile $OutFile –Resume вы можете возобновить загрузку файла в случае падения канала или сервера.

Заполнение и отправка веб-форм на Powershell

Многие веб-сервисы для работы требуют ввода различных данных в HTML формы. С помощью Invoke-WebRequest можно получить доступ к любой HTML-форме, заполнить необходимые поля и передать заполненную форму обратно на сервер. В этом примере мы покажем, как с помощью Powershell авторизоваться в почтовом ящике популярного российского сервиса mail.ru через его стандартную веб форму.

powershell аутентификация с помощью веб форм на mailru

С помощью следующей конструкции сохраним информацию о куках (Cookies) подключения в отдельной сессионной переменной:

$mailru = Invoke-WebRequest https://e.mail.ru/login -SessionVariable session

Следующей командой отобразим список заполняемых полей в HTML форме авторизации (форма называется LoginExternal):

$mailru.Forms["LoginExternal"].Fields

Присвоим нужные значения всем полям:

$mailru.Forms["LoginExternal"].Fields["Login"] = "testmail@mail.ru"

$mailru.Forms["LoginExternal"].Fields["Password"] = "Str0NgP$$w0rd"

И т.д….

Чтобы передать заполненную форму на веб сервер, вызовем атрибут HTML-формы action.

$Log = Invoke-WebRequest -method POST -URI ("https://e.mail.ru/login" + $mailru.Forms["LoginExternal"].Action) -Body $mailru.Forms["LoginExternal"].Fields -WebSession $session

Недостатки командлета Invoke-WebRequest

Одним из существенных недостатком командлета Invoke-WebRequest является довольно низкая скорость работы. При загрузке файла HTTP поток целиком буферизируется в память, и только после окончания полной загрузки сохраняется на диск. Таким образом, при закачке больших файлов можно столкнутся с нехваткой памяти.

Другая проблема – командлет Invoke-WebRequest тесно связан с Internet Explorer. Например, в редакциях Windows Server Core, в которых IE не установлен, командлет  Invoke-WebRequest использовать нельзя.

Если на HTTP сайте используется самоподписанный сертификат, то командлет Invoke-WebRequest отказывается получать данные с него. Чтобы игнорировать некорректный SSL сертификат, используйте следующий код:

Игнорировать SSL сертификат можно так:
add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
$result = Invoke-WebRequest -Uri "https://site.ru"


Предыдущая статья Следующая статья


Комментариев: 10 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)