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 Cmdlet
кратката команда Invoke-WebRequest (псевдоним wget) може да изпраща и получава HTTP, HTTPS и FTP заявки, да обработва отговора, върнат от сървъра. Отговорът е колекция от форми, връзки, изображения и други важни елементи на HTML документ.
Нека опитаме следната команда:
Invoke-WebRequest -Uri "http://winitpro.ru"
Както можете да видите, върнатият отговор не е обикновен 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"