Invoke-WebRequest Powershell Web Content and HTML Site Processing

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

Съдържание:

  • Използване на Invoke-WebRequest Cmdlet
  • Получаваме списък на всички HTML връзки на страницата
  • Разбор на HTML страници с помощта на Powershell
  • Как да изтеглите файл чрез HTTP чрез PowerShell
  • Powershell попълване и изпращане на уеб формуляри
  • Недостатъци на командлета Invoke-WebRequest

съвет. Командлерът Invoke-WebRequest е наличен в Windows PowerShell 3.0, така че не забравяйте да използвате тази или по-нова версия, преди да започнете. Ако на вашия компютър са инсталирани няколко версии на Posh, можете да превключвате между тях.

Използване на Invoke-WebRequest Cmdlet

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

Нека опитаме следната команда:

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

съвет. Ако сте свързани към Интернет чрез прокси сървър, тогава командлетите от PoweShell да работят правилно, използвайте съветите от статията: Как да конфигурирате PowerShell за достъп през прокси сървър.

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

$ WebResponseObj = Invoke-WebRequest -Uri "http://winitpro.ru"
$ WebResponseObj | Get-държава

За да получите суровия HTML код на уеб страницата, съдържаща се в този обект, изпълнете:

$ WebResponseObj.content

Можете да върнете HTML кода заедно с HTTP заглавките, върнати от уеб сървъра:

$ WebResponseObj.rawcontent

Можете да проверите само кода за отговор на уеб сървъра и HTTP заглавките на HTML страницата:

$ WebResponseObj.Headers

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

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

Обръщаме се към главната страница на нашия сайт и получаваме списък с налични връзки на него:
$ SiteAdress = "http://winitpro.ru"
$ HttpContent = Invoke-WebRequest -URI $ SiteAdress
$ HttpContent.връзки | Foreach $ _. Href

За да получите самия текст на връзката (съдържа се в елемента InnerText), можете да използвате тази конструкция:

$ HttpContent.връзки | fl innerText, href

Можете да изберете само връзки с конкретен клас CSS:

$ HttpContent.връзки | Where-Object $ _. Class -eq "номера на страници" | fl innerText, href

Или конкретен текст в URL:

$ HttpContent.връзки | Къде-обект $ _. Href -подобен "* обмен *" | fl innerText, href

Разбор на HTML страници с помощта на Powershell

Командлерът Invoke-WebRequest ви позволява бързо и удобно да анализирате съдържанието на всяка уеб страница. При обработка на HTML страница от нейното съдържание се формират колекции от връзки (връзки), уеб форми (формуляри), изображения (изображения), скриптове (скриптове) и др..

Използвайки Powershell, ние получаваме съдържанието на основната страница на нашия сайт:

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

След това изброяваме всички изображения на тази страница:

$ Img.Images

Ще формираме колекция от пълни URL пътеки за използваните изображения:

$ images = $ Img.Images | изберете src

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

$ wc = New-Object System.Net.WebClient

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

$ изображения | foreach $ wc.DownloadFile ($ _. src, ("c: \ tools \" + [io.path] :: GetFileName ($ _. src))

Интересен пример за използване на командлета 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=en" -outfile "c: \ tools \ firefox setup 32.0.3.exe"

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

Можете също да изтегляте файлове от уеб сървър, използвайки BITS в синхронен режим.

По този начин можете лесно да намерите на конкретна уеб страница всички връзки, които попадат под конкретни критерии (клас връзки, разделителна способност в името на файла, URL адрес) и изтегляте файлове, като използвате получените връзки. Например, има уебсайт с куп връзки към PDF документи. Вашата задача е да изтеглите всички тези файлове на вашия компютър. Гръбнакът на скрипт на PowerShell за масово изтегляне на файлове може да изглежда така:

$ OutDir = "C: \ Изтегляния \ документи \ PDF"
$ SiteAdress = "https://www.site.ru/free-pdf-books/"
$ HttpContent = Invoke-WebRequest -URI $ SiteAdress
$ HttpContent.връзки | Къде-обект $ _. Href -подобен "* .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 чрез стандартната си уеб форма.

Използвайки следната конструкция, записваме информацията за бисквитките за връзката в отделна променлива на сесията:

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

Следващата команда показва списък с полета, които трябва да попълните във формата за упълномощаване на HTML (формата се нарича LoginExternal):

$ mailru.Forms ["LoginExternal"]. Полета

Задайте необходимите стойности на всички полета:

$ mailru.Forms ["LoginExternal"]. Полета ["Вход"] = "[email protected]"

$ mailru.Forms ["LoginExternal"]. Полета ["Парола"] = "Str0NgP $$ w0rd"

И т.н. ... .

За да изпратите попълнения формуляр на уеб сървъра, извикайте атрибута на действието на HTML формуляр.

$ Log = Invoke-WebRequest -method POST -URI ("https://e.mail.ru/login" + $ mailru.Forms ["LoginExternal"]. Действие) -Body $ mailru.Forms ["LoginExternal"]. Полета -WebSession $ сесия

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

Един от основните недостатъци на командлета Invoke-WebRequest е относително ниската му скорост. Когато изтегля HTTP файла, потокът се буферира напълно в паметта и едва след приключване на пълното изтегляне се записва на диск. Така при изтегляне на големи файлове може да ви липсва памет.

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

Ако на HTTP сайта се използва самоподписан сертификат, командлетът Invoke-WebRequest отказва да получава данни от него. За да игнорирате невалиден SSL сертификат, използвайте следния код:

Можете да игнорирате SSL сертификата така:
добавяне-тип @ "
използване на System.Net;
използване на System.Security.Cryptography.X509Сертификати;
обществена класа TrustAllCertsPolicy: ICertificatePolicy
public bool CheckValidationResult (
ServicePoint srvPoint, сертификат X509сертификат,
Заявка за WebRequest, Int сертификатProblem)
връщане вярно;


"@
[System.Net.ServicePointManager] :: CertificatePolicy = New-Object TrustAllCertsPolicy
$ result = Invoke-WebRequest -Uri "https://site.ru"