Обработка содержимого веб-страниц и HTML сайтов в Powershell | Windows для системных администраторов

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

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

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

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


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

Обратимся к главной странице нашего сайта и получим список ссылок, имеющихся на ней:

$SiteAdress = "http://winitpro.ru"

$HttpContent = Invoke-WebRequest -URI $SiteAdress

$HttpContent.Links | Foreach {$_.href }

Обработка содержимого веб страниц html с powershell

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

$HttpContent.Links | fl innerText, href

Invoke-WebRequest получить список ссылок и их анкоров на странице

Как скачать файл по 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: //.

Проверка статуса ответа веб-сервера и HTTP заголовков

С помощью Invoke-WebRequest можно получить код ответа веб-сервера и статус HTML страницы

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

$HttpContent.StatusCode

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

Получить остальные HTTP заголовки веб-страницы можно так:

$HttpContent.Headers Powershell получить статус и HTTP заголовки веб страницы

Парсинг 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

Заполнение и отправка веб-форм на 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

Еще записи по теме: PowerShell
Понравилась статья? Скажи спасибо и расскажи друзьям!
Назад:
Вперед:

Комментариев: 9

Оставить комментарий
  1. Mstislav | 31.10.2014

    Скажите как зайти на сайт с самоподписанным сертификатом

    Ответить
    • itpro | 31.10.2014

      Игнорировать 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"

       

      Ответить
      • Mstislav | 31.10.2014

        Очень вам признателен) Все отлично отрабатывает

        Ответить
  2. Mstislav | 31.10.2014

    Можно ли через Powershell выполнять переход по объектам на странице
    и их измененять, если они не являются линками?
    Я хочу подключаться к Vsheild и добавлять изменения в объект библиотеки (см.скриншот по ссылке http://hostingkartinok.com/show-image.php?id=e456b42cdb1810768766f6eeeb22cf36) Пока функции PowerCli Этого не позволяют. Приходится искать сторонние методы.
    вообще это реально или нет?

    Ответить
    • itpro | 05.11.2014

      Если я правильно понял, нужно изменить какую-то форму на странице и сохранить изменения? Если да — пример работы есть выше в разделе «Заполнение и отправка веб-форм на Powershell»

      Ответить
      • Mstislav | 05.11.2014

        http://itmages.ru/image/view/2026091/24b9d0da
         
        Дело в том что уже на авторизованной странице нет ни форм, ни ссылок для перехода на следующую страницу. Есть объекты слева как видно на картинке. Как осуществить выбор того или иного объекта?

        Ответить
        • itpro | 07.11.2014

          Похоже страница выполнена на Java. Боюсь вам помочь не смогу — здесь лучше проконсультироваться с Web программистами… Они лучше понимают как можно выполнять навигацию по такому документу

          Ответить
  3. Юрий | 30.04.2015

    Добрый день.
    Подскажите, на основе Вашего примера, как можно пропарсить страничку вроде https://chocolatey.org/packages/flashplayeractivex
    в поисках ссылки на дистрибутив
    $url = ‘http://download.macromedia.com/get/flashplayer/current/licensing/win/install_flash_player_17_active_x.msi’ ,
    которая находится под примерами вызова команд
    Files > Show > \chocolateyInstall.ps1 Show >

    Т.е. как получить вожделенную ссылку на дистрибутив с веб-страницы?

    Ответить
  4. Oleg | 27.08.2015

    А если нет таких форм?
    Например, вот сайт:
    _http://www.stn.by/ips_renovation_login.php
    Задача туда зайти и получить ссылку после входа.

    Ответить
Полные правила комментирования на сайте winitpro.ru. Вопросы, не связанные с содержимым статьи или ее обсуждением удаляются.

Сказать Спасибо! можно на этой странице или (еще лучше) поделиться с друзями ссылкой на понравившуюся статью в любимой социальной сети(специально для этого на сайте присуствуют кнопки популярных соц. сетей).

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

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



MAXCACHE: 0.26MB/0.00120 sec