Invoke-WebRequest Powershell obrada web sadržaja i HTML web mjesta

PowerShell verzija 3.0 uvodi mogućnost izravnog pristupa i rada s HTML web stranicama na Internetu. Za to je razvijen poseban cmdlet. Pozovi-WebRequest. Ovaj cmdlet vam omogućuje implementaciju mnogih scenarija: od mogućnosti preuzimanja / prijenosa datoteke s / na bilo koje web mjesto putem HTTP / HTTPS / FTP, završavajući sa mogućnostima raščlanjivanja HTML stranica, praćenja stanja web poslužitelja, ispunjavanja i slanja web obrazaca. Općenito, novi cmdlet pruža sve potrebne metode za kretanje po DOM stablu HTML dokumenta. U ovom ćemo članku pogledati neke osnovne primjere rada s PowerShell Invoke-WebRequest cmdletom..

sadržaj:

  • Korištenje Invoke-WebRequest Cmdlet
  • Dobivamo popis svih HTML veza na stranici
  • Analiza HTML stranica pomoću Powershell-a
  • Kako preuzeti datoteku putem HTTP-a pomoću programa PowerShell
  • Ovlašteno ispunjavanje i slanje web obrazaca
  • Nedostaci cmdleta Invoke-WebRequest

vijeće. Cmdlet Invoke-WebRequest dostupan je u sustavu Windows PowerShell 3.0, stoga prije nego što započnete obavezno koristite ovu ili noviju verziju. Ako je na vašem računalu instalirano nekoliko verzija Posh-a, možete ih prebacivati.

Korištenje Invoke-WebRequest Cmdlet

cmdlet Pozovi-WebRequest (alias wget) može slati i primati HTTP, HTTPS i FTP zahtjeve, obrađivati ​​odgovor koji je vratio poslužitelj. Odgovor je zbirka obrazaca, veza, slika i drugih važnih elemenata HTML dokumenta.

Pokušajmo sljedeću naredbu:

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

vijeće. Ako ste na Internet povezani putem proxy poslužitelja, a zatim da cmdleti PoweShell ispravno rade, upotrijebite savjete iz članka: Kako konfigurirati PowerShell za pristup putem proxy poslužitelja.

Kao što vidite, povratni odgovor nije jednostavan HTML kôd za stranicu. Vidite različita svojstva web dokumenta. Cmdlet Invoke-WebRequest, kao i većina ostalih PowerShell cmdleta, djeluje na objektima. Invoke-WebRequest vraća objekt tipa HtmlWebResponseObject. Pogledajmo sva svojstva ovog objekta:

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

Da biste dobili sirovi HTML kôd web stranice koja se nalazi u ovom objektu, izvršite:

$ WebResponseObj.content

Možete vratiti HTML kôd zajedno s HTTP naslovima koje vraća web poslužitelj:

$ WebResponseObj.rawcontent

Možete samo provjeriti kôd odgovora web poslužitelja i HTTP zaglavlja HTML stranice:

$ WebResponseObj.Headers

Kao što vidite, web poslužitelj je vratio odgovor 200, odnosno zahtjev je uspio, a web poslužitelj je dostupan i ispravno radi.

Dobivamo popis svih HTML veza na stranici

Okrećemo se glavnoj stranici naše stranice i dobivamo popis veza na njoj:
$ SiteAdress = "http://winitpro.ru"
$ HttpContent = Invoke-WebRequest -URI $ SiteAdress
$ HttpContent.Links | Foreach $ _. Href

Da biste dobili sam tekst veze (koji se nalazi u elementu InnerText), možete koristiti ovu konstrukciju:

$ HttpContent.Links | fl innerText, href

Veze možete odabrati samo s određenom CSS klasom:

$ HttpContent.Links | Where-Object $ _. Class -eq "brojevi stranica" | fl innerText, href

Ili određeni tekst u URL-u:

$ HttpContent.Links | Gdje-objekt $ _. Href-sličan "* razmjena *" | fl innerText, href

Analiza HTML stranica pomoću Powershell-a

Cmdlet Invoke-WebRequest omogućuje vam brzo i povoljno raščlanjivanje sadržaja bilo kojih web stranica. Prilikom obrade HTML stranice iz njenog sadržaja formiraju se zbirke veza (veza), web obrasci (obrasci), slike (slike), skripte (skripte) itd..

Koristeći Powershell, dobivamo sadržaj glavne stranice našeg web mjesta:

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

Zatim nabrajamo sve slike na ovoj stranici:

$ Img.Images

Oblikovat ćemo kolekciju punih putova URL-a za korištene slike:

$ images = $ Img.Images | odaberite src

Inicijalizirajte novu instancu klase WebClient:

$ wc = Novi objektni sistem.Net.WebClient

Prenesite sve slike sa stranice (s izvornim imenima) u mapu c: \ tools \:

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

Zanimljiv primjer korištenja cmdleta Invoke-WebRequest je način pronalaska vanjske IP adrese računala iz PowerShell-a.

Kako preuzeti datoteku putem HTTP-a pomoću programa PowerShell

Invoke-WebRequest može funkcionirati kao analogni Wget ili cURL za Windows, omogućujući vam da preuzmete željenu datoteku ili datoteke s web stranice ili ftp stranice. Pretpostavimo da moramo koristiti PowerShell za preuzimanje određene datoteke putem HTTP-a (u našem primjeru Mozilla Firefox distribucija). Pokrenite sljedeću naredbu:

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

Kao rezultat pokretanja cmdleta, datoteka će se preuzeti s navedenog URL-a i spremiti u mapu c: \ tools \ pod nazivom firefox setup 32.0.3.exe. Ako trebate preuzeti datoteku s FTP mjesta, jednostavno zamijenite http: // s ftp: //.

Također možete preuzeti datoteke s web poslužitelja koristeći BITS u sinkronom načinu.

Stoga na određenoj web stranici lako možete pronaći sve veze koje potpadaju pod određene kriterije (klasa veza, rezolucija u nazivu datoteke, url adresa) i preuzeti datoteke koristeći primljene veze. Na primjer, postoji web stranica s hrpom linkova do PDF dokumenata. Vaš je zadatak preuzeti sve te datoteke na vaše računalo. Okosnica PowerShell skripte za masovno preuzimanje datoteka može izgledati ovako:

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

Kao rezultat skripte u ciljnom direktoriju, preuzeće se sve PDF datoteke sa stranice. Svaka se datoteka sprema pod proizvoljnim nazivom..

U programu PowerShell 6.1, cmdlet Invoke-WebRequest podržava nastavak načina rada. Stoga pomoću parametra Invoke-WebRequest -Uri $ Uri -OutFile $ OutFile -rezime možete nastaviti s preuzimanjem datoteke u slučaju pada sustava ili poslužitelja.

Ovlašteno ispunjavanje i slanje web obrazaca

Mnoge web usluge zahtijevaju unošenje različitih podataka u HTML obrasce. s Pozovi-WebRequest Možete pristupiti bilo kojem HTML obrascu, ispuniti potrebna polja i ispuniti ispunjeni obrazac natrag na poslužitelj. U ovom ćemo primjeru pokazati kako se pomoću Powershell-a za prijavu u poštanski sandučić popularne ruske usluge mail.ru putem standardnog web obrasca..

Pomoću sljedeće konstrukcije spremamo podatke kolačića za vezu u zasebnu varijablu sesije:

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

Sljedeća naredba prikazuje popis polja koja treba popuniti u HTML autorizacijskom obliku (obrazac se zove LoginExternal):

$ mailru.Forms ["LoginExternal"]. Polja

Dodijelite potrebne vrijednosti svim poljima:

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

$ mailru.Forms ["LoginExternal"]. Polja ["Lozinka"] = "Str0NgP $$ w0rd"

Itd ... .

Da biste ispunili obrazac na web poslužitelj, pozovite atribut akcije HTML obrasca.

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

Nedostaci cmdleta Invoke-WebRequest

Jedan od glavnih nedostataka cmdleta Invoke-WebRequest je njegova relativno mala brzina. Nakon preuzimanja HTTP datoteke, stream se u potpunosti memorira u memoriju, a tek nakon dovršetka preuzimanja sprema se na disk. Dakle, pri preuzimanju velikih datoteka možda vam ponestaje memorije.

Drugi je problem što je cmdlet Invoke-WebRequest usko povezan s Internet Explorerom. Na primjer, u izdanjima Windows Server Core gdje IE nije instaliran, ne možete koristiti cmdlet Invoke-WebRequest.

Ako se na HTTP web mjestu koristi samopotpisni certifikat, cmdlet Invoke-WebRequest odbija primiti podatke s njega. Za zanemarivanje nevažećeg SSL certifikata koristite sljedeći kôd:

SSL certifikat možete zanemariti ovako:
dodaj-up @ "
pomoću System.Net;
pomoću System.Security.Cryptography.X509Certifikati;
javna klasa TrustAllCertsPolicy: ICertificatePolicy
javni bool CheckValidationResult (
ServicePoint srvPoint, X509Certificate certifikat,
WebRequest zahtjev, int certifikatProblem)
povratak istinit;


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