Invoke-WebRequest Powershell - webový obsah a spracovanie stránok HTML

PowerShell verzia 3.0 predstavuje možnosť priameho prístupu a práce s webovými stránkami HTML na internete. Na tento účel bol vyvinutý špeciálny cmdlet. vyvolanie WebRequest. Táto rutina vám umožňuje implementovať mnoho scenárov: od možnosti sťahovať / odovzdávať súbor z / na ľubovoľnú webovú stránku cez HTTP / HTTPS / FTP, končiac možnosťou analyzovať stránky HTML, monitorovať stav webových serverov, vyplňovať a odosielať webové formuláre. Nové cmdlet vo všeobecnosti poskytuje všetky potrebné metódy na navigáciu v strome DOM dokumentu HTML. V tomto článku sa pozrieme na niektoré základné príklady práce s cmdletom PowerShell Invoke-WebRequest..

obsah:

  • Používanie Cmdlet Invoke-WebRequest
  • Získame zoznam všetkých HTML odkazov na stránke
  • Analýza stránok HTML pomocou Powershell
  • Ako sťahovať súbor cez HTTP pomocou PowerShell
  • Powershell vyplňovanie a odosielanie webových formulárov
  • Nevýhody rutiny Invoke-WebRequest

rada. Rutina Invoke-WebRequest je k dispozícii v systéme Windows PowerShell 3.0, preto sa uistite, že ste predtým, ako začnete, používali túto alebo novšiu verziu. Ak je v počítači nainštalovaných niekoľko verzií softvéru Posh, môžete medzi nimi prepínať.

Používanie Cmdlet Invoke-WebRequest

cmdlet vyvolať-WebRequest (alias wget) môže odosielať a prijímať požiadavky HTTP, HTTPS a FTP, spracovávať odpoveď vrátenú serverom. Odpoveď je zbierka formulárov, odkazov, obrázkov a ďalších dôležitých prvkov dokumentu HTML.

Vyskúšajte nasledujúci príkaz:

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

rada. Ak ste pripojení na internet prostredníctvom proxy servera, potom aby cmdlety PoweShell fungovali správne, použite tipy z článku: Ako nakonfigurovať PowerShell na prístup cez proxy server.

Ako vidíte, vrátená odpoveď nie je pre HTML jednoduchý kód HTML. Uvidíte rôzne vlastnosti webového dokumentu. Rutina Invoke-WebRequest, rovnako ako väčšina ostatných rutín PowerShell, pracuje s objektmi. Invoke-WebRequest vráti objekt typu HtmlWebResponseObject. Pozrime sa na všetky vlastnosti tohto objektu:

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

Ak chcete získať surový kód HTML webovej stránky obsiahnutej v tomto objekte, vykonajte:

$ WebResponseObj.content

Môžete vrátiť kód HTML spolu s hlavičkami HTTP vrátenými webovým serverom:

$ WebResponseObj.rawcontent

Môžete skontrolovať iba kód odozvy webového servera a hlavičky HTTP stránky HTML:

$ WebResponseObj.Headers

Ako vidíte, webový server vrátil odpoveď 200, tj požiadavka bola úspešná a webový server je prístupný a funguje správne.

Získame zoznam všetkých HTML odkazov na stránke

Obraciame sa na hlavnú stránku našej stránky a získame zoznam odkazov na nej dostupných:
$ SiteAdress = "http://winitpro.ru"
$ HttpContent = Invoke-WebRequest -URI $ SiteAdress
$ HttpContent.Links | Foreach $ _. Href

Ak chcete získať samotný text odkazu (obsiahnutý v prvku InnerText), môžete použiť túto konštrukciu:

$ HttpContent.Links | fl innerText, href

Môžete vybrať iba odkazy s konkrétnou triedou CSS:

$ HttpContent.Links | Where-Object $ _. Trieda-ekv. "Čísla stránok" | fl innerText, href

Alebo konkrétny text v adrese URL:

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

Analýza stránok HTML pomocou Powershell

Rutina Invoke-WebRequest vám umožňuje rýchlo a pohodlne analyzovať obsah ľubovoľných webových stránok. Pri spracovaní stránky HTML z jej obsahu sa vytvárajú kolekcie odkazov (odkazov), webových formulárov (formulárov), obrázkov (obrázkov), skriptov (skriptov) atď..

Použitím Powershell získame obsah hlavnej stránky našej stránky:

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

Potom uvádzame všetky obrázky na tejto stránke:

$ Img.Images

Vytvoríme zbierku úplných ciest URL pre použité obrázky:

$ images = $ Img.Images | vyberte src

Inicializujte novú inštanciu triedy WebClient:

$ wc = New-Object System.Net.WebClient

A stiahnite všetky obrázky zo stránky (s pôvodnými názvami) do adresára c: \ tools \:

$ obrázky | foreach $ wc.DownloadFile ($ _. src, ("c: \ tools \" + [io.path] :: GetFileName ($ _. src))

Zaujímavým príkladom použitia rutiny Invoke-WebRequest je spôsob, ako zistiť externú IP adresu počítača z PowerShell..

Ako sťahovať súbor cez HTTP pomocou PowerShell

Invoke-WebRequest môže fungovať ako analóg Wget alebo CURL pre Windows, čo vám umožní stiahnuť požadovaný súbor alebo súbory z webovej stránky alebo ftp stránky. Predpokladajme, že potrebujeme použiť PowerShell na stiahnutie určitého súboru prostredníctvom HTTP (v našom príklade distribúcia Mozilla Firefox). Spustite nasledujúci príkaz:

Invoke-WebRequest "https://download.mozilla.org/?product=firefox-32.0.3-SSL&os=win&lang=sk" -outfile "c: \ tools \ firefox setup 32.0.3.exe"

V dôsledku spustenia rutiny cmdlet sa súbor stiahne z určenej adresy URL a uloží sa do adresára c: \ tools \ pod názvom firefox setup 32.0.3.exe. Ak potrebujete stiahnuť súbor z FTP servera, stačí nahradiť http: // ftp: //.

Súbory môžete sťahovať aj z webového servera pomocou služby BITS v synchronnom režime.

Takto môžete na konkrétnej webovej stránke ľahko nájsť všetky odkazy, ktoré spadajú pod konkrétne kritériá (trieda odkazov, rozlíšenie v názve súboru, adresa URL) a sťahovať súbory pomocou prijatých odkazov. Napríklad existuje webová stránka s množstvom odkazov na dokumenty PDF. Vašou úlohou je stiahnuť všetky tieto súbory do počítača. Páteř skriptu PowerShell pre hromadné sťahovanie súborov môže vyzerať takto:

$ 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")

V dôsledku skriptu v cieľovom adresári sa stiahnu všetky súbory PDF zo stránky. Každý súbor je uložený pod ľubovoľným menom..

V PowerShell 6.1 cmdlet Invoke-WebRequest podporuje režim obnovenia. Preto pomocou parametra Invoke-WebRequest -Uri $ Uri -OutFile $ OutFile -životopis v prípade zlyhania kanála alebo servera môžete pokračovať v sťahovaní súboru.

Powershell vyplňovanie a odosielanie webových formulárov

Mnoho webových služieb vyžaduje na vstup rôzne údaje vo formulároch HTML. s vyvolať-WebRequest Máte prístup k akémukoľvek formuláru HTML, vyplňte požadované polia a vyplnený formulár odošlite späť na server. V tomto príklade ukážeme, ako používať Powershell na prihlásenie do poštovej schránky populárnej ruskej služby mail.ru prostredníctvom štandardného webového formulára..

Pomocou nasledujúcej konštrukcie ukladáme informácie o súboroch cookie pre pripojenie do samostatnej premennej relácie:

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

Nasledujúci príkaz zobrazí zoznam polí, ktoré treba vyplniť vo formulári autorizácie HTML (formulár sa nazýva LoginExternal):

$ mailru.Forms ["LoginExternal"]. Polia

Všetky polia priraďte potrebné hodnoty:

$ mailru.Forms ["LoginExternal"]. Polia ["Login"] = "[email protected]"

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

Atď ... .

Ak chcete vyplniť formulár na webový server, zavolajte atribút akcie formulára HTML.

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

Nevýhody rutiny Invoke-WebRequest

Jednou z hlavných nevýhod cmdletov Invoke-WebRequest je pomerne nízka rýchlosť. Po stiahnutí súboru HTTP sa prúd úplne uloží do vyrovnávacej pamäte a až po dokončení úplného stiahnutia sa uloží na disk. Preto pri preberaní veľkých súborov môže dôjs nedostatok pamäte.

Ďalším problémom je cmdlet Invoke-WebRequest úzko súvisí s programom Internet Explorer. Napríklad vo vydaniach systému Windows Server Core, kde nie je nainštalovaný IE, nemôžete použiť cmdlet Invoke-WebRequest..

Ak sa na stránke HTTP používa certifikát s vlastným podpisom, cmdlet Invoke-WebRequest odmietne z nej prijímať údaje. Ak chcete ignorovať neplatný certifikát SSL, použite nasledujúci kód:

Takto môžete ignorovať SSL certifikát:
add-type @ "
pomocou System.Net;
pomocou System.Security.Cryptography.X509Certificates;
verejná trieda TrustAllCertsPolicy: ICertificatePolicy
verejné bool CheckValidationResult (
ServicePoint srvPoint, X509Certifikačný certifikát,
WebRequest request, int certificateProblem)
návrat true;


"@
[System.Net.ServicePointManager] :: CertificatePolicy = TrustAllCertsPolicy pre nový objekt
$ result = Invoke-WebRequest -Uri "https://site.ru"