Invoke-WebRequest Powershell Webový obsah a zpracování HTML stránek

PowerShell verze 3.0 zavádí možnost přímého přístupu a práce s webovými stránkami HTML na Internetu. Za tímto účelem byla vyvinuta speciální rutina. Invoke-WebRequest. Tato rutina vám umožňuje implementovat mnoho scénářů: od možnosti stahovat / nahrávat soubor z / na jakýkoli web přes HTTP / HTTPS / FTP, končící možností analyzovat HTML stránky, sledovat stav webových serverů, vyplňovat a odesílat webové formuláře. Obecně nová cmdlet poskytuje všechny potřebné metody pro navigaci ve stromu DOM dokumentu HTML. V tomto článku se podíváme na některé základní příklady práce s cmdletem PowerShell Invoke-WebRequest..

Obsah:

  • Použití Invoke-WebRequest Cmdlet
  • Získáme seznam všech odkazů HTML na stránce
  • Analýza stránek HTML pomocí Powershell
  • Jak stáhnout soubor přes HTTP pomocí PowerShell
  • Powershell vyplňování a odesílání webových formulářů
  • Nevýhody rutiny Invoke-WebRequest

Tip. Cmdlet Invoke-WebRequest je k dispozici v prostředí Windows PowerShell 3.0, proto se ujistěte, že tuto nebo novější verzi používáte, než začnete. Pokud je v počítači nainstalováno několik verzí Posh, můžete mezi nimi přepínat.

Použití Invoke-WebRequest Cmdlet

Cmdlet Vyvolejte-Webrequest (alias wget) umí odesílat a přijímat požadavky HTTP, HTTPS a FTP, zpracovávat odpověď vrácenou serverem. Reakcí je kolekce formulářů, odkazů, obrázků a dalších důležitých prvků dokumentu HTML.

Zkusme následující příkaz:

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

Tip. Pokud jste připojeni k Internetu přes proxy server, pak pro cmdlety PoweShell fungují správně, použijte tipy z článku: Jak nakonfigurovat PowerShell pro přístup přes proxy server.

Jak vidíte, vrácená odpověď není jednoduchý HTML kód pro stránku. Uvidíte různé vlastnosti webového dokumentu. Rutina Invoke-WebRequest, stejně jako většina ostatních rutin PowerShell, pracuje s objekty. Invoke-WebRequest vrací objekt typu HtmlWebResponseObject. Podívejme se na všechny vlastnosti tohoto objektu:

$ WebResponseObj = Invoke-WebRequest -Uri "http://winitpro.ru"
$ WebResponseObj | Získejte člena

Chcete-li získat nezpracovaný kód HTML webové stránky obsažené v tomto objektu, proveďte následující kroky:

$ WebResponseObj.content

Můžete vrátit kód HTML spolu s hlavičkami HTTP vrácenými webovým serverem:

$ WebResponseObj.rawcontent

Můžete zkontrolovat pouze kód odezvy webového serveru a záhlaví HTTP stránky HTML:

$ WebResponseObj.Headers

Jak vidíte, webový server vrátil odpověď 200, tj. požadavek byl úspěšný a webový server je přístupný a pracuje správně.

Získáme seznam všech odkazů HTML na stránce

Obracíme se na hlavní stránku našeho webu a získáme na něm seznam odkazů:
$ SiteAdress = "http://winitpro.ru"
$ HttpContent = Invoke-WebRequest -URI $ SiteAdress
$ HttpContent.Links | Foreach $ _. Href

Chcete-li získat samotný text odkazu (obsažený v prvku InnerText), můžete použít tuto konstrukci:

$ HttpContent.Links | fl innerText, href

Můžete vybrat pouze odkazy s konkrétní třídou CSS:

$ HttpContent.Links | Where-Object $ _. Třída -eq "čísla stránek" | fl innerText, href

Nebo konkrétní text v adrese URL:

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

Analýza stránek HTML pomocí Powershell

Cmdlet Invoke-WebRequest umožňuje rychle a pohodlně analyzovat obsah libovolných webových stránek. Při zpracování stránky HTML z jejího obsahu se vytvářejí kolekce odkazů (odkazů), webových formulářů (formulářů), obrázků (obrázků), skriptů (skriptů) atd..

Pomocí Powershell získáme obsah hlavní stránky našeho webu:

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

Poté uvádíme seznam všech obrázků na této stránce:

$ Img.Images

Vytvoříme sbírku úplných cest URL pro použité obrázky:

$ images = $ Img.Images | vyberte src

Inicializace nové instance třídy WebClient:

$ wc = New-Object System.Net.WebClient

A stáhněte všechny obrázky ze stránky (s původními názvy) do adresáře c: \ tools \:

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

Zajímavým příkladem použití rutiny Invoke-WebRequest je způsob, jak zjistit externí IP adresu počítače z PowerShell.

Jak stáhnout soubor přes HTTP pomocí PowerShell

Invoke-WebRequest může fungovat jako analog Wget nebo CURL pro Windows, což vám umožní stáhnout požadovaný soubor nebo soubory z webové stránky nebo ftp webu. Předpokládejme, že potřebujeme použít PowerShell ke stažení určitého souboru přes HTTP (v našem příkladu distribuce Mozilla Firefox). Spusťte následující příkaz:

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"

V důsledku spuštění rutiny bude soubor stažen ze zadané URL a uložen do adresáře c: \ tools \ pod názvem firefox setup 32.0.3.exe. Pokud potřebujete stáhnout soubor z FTP serveru, stačí nahradit http: // ftp: //.

Soubory můžete také stahovat z webového serveru pomocí BITS v synchronním režimu.

Můžete tedy snadno najít na konkrétní webové stránce všechny odkazy, které spadají pod určitá kritéria (třída odkazů, rozlišení v názvu souboru, adresa URL), a stahovat soubory pomocí přijatých odkazů. Například existuje web s množstvím odkazů na dokumenty PDF. Vaším úkolem je stáhnout všechny tyto soubory do počítače. Páteř skriptu PowerShell pro hromadné stahování souborů může vypadat 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 cílovém adresáři budou staženy všechny soubory PDF ze stránky. Každý soubor je uložen pod libovolným názvem..

V PowerShell 6.1 cmdlet Invoke-WebRequest podporuje režim obnovení. Proto pomocí parametru Invoke-WebRequest -Uri $ Uri -OutFile $ OutFile -Pokračovat můžete pokračovat v stahování souboru v případě selhání kanálu nebo serveru.

Powershell vyplňování a odesílání webových formulářů

Mnoho webových služeb vyžaduje zadání různých dat ve formulářích HTML, aby fungovaly. Použití Vyvolejte-Webrequest Máte přístup k libovolnému formuláři HTML, vyplňte povinná pole a vyplněný formulář odešlete zpět na server. V tomto příkladu vám ukážeme, jak používat Powershell k přihlášení k poštovní schránce populární ruské služby mail.ru prostřednictvím standardního webového formuláře..

Pomocí následující konstrukce ukládáme informace o souborech cookie pro připojení do samostatné proměnné relace:

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

Následující příkaz zobrazí seznam polí pro vyplnění formuláře HTML pro autorizaci (formulář se nazývá LoginExternal):

$ mailru.Forms ["LoginExternal"]. Pole

Přiřaďte potřebné hodnoty všem polím:

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

$ mailru.Forms ["LoginExternal"]. Pole ["Heslo"] = "Str0NgP $$ w0rd"

Atd ... .

Chcete-li odeslat vyplněný formulář na webový server, zavolejte atribut akce formuláře HTML.

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

Nevýhody rutiny Invoke-WebRequest

Jednou z hlavních nevýhod rutiny Invoke-WebRequest je relativně nízká rychlost. Když je soubor HTTP stažen, tok je plně vyrovnávací paměti do paměti a až po dokončení úplného stažení je uložen na disk. Proto při stahování velkých souborů může dojít nedostatek paměti.

Dalším problémem je rutina Invoke-WebRequest úzce souvisí s aplikací Internet Explorer. Například v edicích systému Windows Server Core, kde není nainstalován IE, nemůžete použít cmdlet Invoke-WebRequest..

Pokud se na webu HTTP používá certifikát podepsaný vlastním uživatelem, cmdlet Invoke-WebRequest odmítá z něj přijímat data. Chcete-li ignorovat neplatný certifikát SSL, použijte následující kód:

SSL certifikát můžete ignorovat takto:
add-type @ "
pomocí System.Net;
pomocí System.Security.Cryptography.X509Certificates;
veřejná třída TrustAllCertsPolicy: ICertificatePolicy
veřejné bool CheckValidationResult (
ServicePoint srvPoint, certifikát X509Certify,
WebRequest request, int certificateProblem)
návrat true;


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