Invoke-WebRequest Powershell Spletna vsebina in obdelava spletnega mesta HTML

PowerShell različice 3.0 uvaja možnost neposrednega dostopa do spletnih strani HTML in dela z njimi v internetu. Za to je bil razvit poseben cmdlet. Pokliči-WebRequest. Ta cmdlet vam omogoča izvajanje številnih scenarijev: od zmožnosti prenosa / prenosa datoteke s / na katero koli spletno mesto prek HTTP / HTTPS / FTP, do konca razčlenitve strani HTML, spremljanja stanja spletnih strežnikov, izpolnjevanja in oddaje spletnih obrazcev. Na splošno novi ukazni ukaz nudi vse potrebne metode za krmarjenje po DOM-jevem drevesu v dokumentu HTML. V tem članku si bomo ogledali nekaj osnovnih primerov dela s cmdletom PowerShell Invoke-WebRequest..

Vsebina:

  • Uporaba prikazovalnika Invoke-WebRequest
  • Na strani dobimo seznam vseh povezav HTML
  • Razčlenjenje strani HTML s pomočjo Powershell-a
  • Kako prenesti datoteko prek HTTP s programom PowerShell
  • Popolno izpolnjevanje in pošiljanje spletnih obrazcev
  • Slabosti cmdlet-a Invoke-WebRequest

Namig. Cmdlet Invoke-WebRequest je na voljo v sistemu Windows PowerShell 3.0, zato se prepričajte, da uporabite to ali novejšo različico, preden začnete. Če je v računalniku nameščenih več različic Posh, lahko med njimi preklapljate.

Uporaba prikazovalnika Invoke-WebRequest

Cmdlet Pokliči-Spletna zahteva (alias wget) lahko pošilja in sprejema zahteve HTTP, HTTPS in FTP, obdeluje odgovor, ki ga vrne strežnik. Odgovor je zbirka obrazcev, povezav, slik in drugih pomembnih elementov dokumenta HTML.

Poskusimo z naslednjim ukazom:

Pokliči-WebRequest -Uri "http://winitpro.ru"

Namig. Če ste na internet povezani prek proxy strežnika, potem lahko pravilno delujejo ukazni elementi PoweShell, uporabite nasvete iz članka: Kako konfigurirati PowerShell za dostop prek proxy strežnika..

Kot vidite, vrnjeni odgovor ni preprosta koda HTML za stran. Vidite različne lastnosti spletnega dokumenta. Cmdlet Invoke-WebRequest, tako kot večina drugih ukaznih kod PowerShell, deluje na predmete. Invoke-WebRequest vrne objekt tipa HtmlWebResponseObject. Oglejmo si vse lastnosti tega predmeta:

$ WebResponseObj = Invoke-WebRequest -Uri "http://winitpro.ru"
$ WebResponseObj | Pridružite se članu

Če želite dobiti neobdelano kodo HTML spletne strani, ki jo vsebuje ta predmet, izvedite:

$ WebResponseObj.content

Kodo HTML lahko vrnete skupaj z glavami HTTP, ki jih je vrnil spletni strežnik:

$ WebResponseObj.rawcontent

Preverite lahko samo kodo odziva spletnega strežnika in glave HTTP strani HTML:

$ WebResponseObj.Headers

Kot lahko vidite, je spletni strežnik vrnil odgovor 200, t.j. zahteva je bila uspešna in spletni strežnik je dostopen in deluje pravilno.

Na strani dobimo seznam vseh povezav HTML

Obrnemo se na glavno stran našega spletnega mesta in na njem dobimo seznam povezav:
$ SiteAdress = "http://winitpro.ru"
$ HttpContent = Pokliči-WebRequest -URI $ SiteAdress
$ HttpContent.Povezave | Napredujte $ _. Href

Če želite dobiti samo besedilo povezave (vsebovano v elementu InnerText), lahko uporabite to konstrukcijo:

$ HttpContent.Povezave | fl innerText, href

Povezave lahko izberete le z določenim razredom CSS:

$ HttpContent.Povezave | Kjer-objekt $ _. Razred -eq "številke strani" | fl innerText, href

Ali določeno besedilo v URL-ju:

$ HttpContent.Povezave | Kjer-objekt $ _. Href-podoben "* izmenjava *" | fl innerText, href

Razčlenjenje strani HTML s pomočjo Powershell-a

Cmdlet Invoke-WebRequest vam omogoča hitro in priročno razčlenitev vsebine katere koli spletne strani. Pri obdelavi strani HTML iz njene vsebine se oblikujejo zbirke povezav (povezav), spletnih obrazcev (obrazcev), slik (slik), skriptov (skript) itd..

S pomočjo Powershell dobimo vsebino glavne strani našega spletnega mesta:

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

Nato na tej strani naštejemo vse slike:

$ Img.Slika

Za uporabljene slike bomo oblikovali zbirko celotnih poti URL-ja:

$ images = $ Img.Images | izberi src

Inicializirajte nov primerek razreda WebClient:

$ wc = New-Object System.Net.WebClient

In prenesite vse slike s strani (z izvirnimi imeni) v imenik c: \ tools \:

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

Zanimiv primer uporabe cmdlet Invoke-WebRequest je način, kako najti zunanji IP naslov računalnika iz PowerShell.

Kako prenesti datoteko prek HTTP s programom PowerShell

Invoke-WebRequest lahko deluje kot analogni Wget ali cURL za Windows, kar vam omogoča, da naložite želeno datoteko ali datoteke s spletne strani ali ftp mesta. Recimo, da moramo uporabiti PowerShell za prenos določene datoteke prek HTTP (v našem primeru distribucija Mozilla Firefox). Zaženite naslednji ukaz:

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

Zaradi izvajanja cmdlet bo datoteka naložena z določenega URL-ja in shranjena v imenik c: \ tools \ pod imenom firefox setup 32.0.3.exe. Če želite prenesti datoteko s spletnega mesta FTP, preprosto zamenjajte http: // s ftp: //.

Datoteke lahko s sinhronizacije BITS prenesete tudi s spletnega strežnika.

Tako lahko na določeni spletni strani enostavno najdete vse povezave, ki spadajo pod določena merila (razred povezav, ločljivost v imenu datoteke, naslov URL) in datoteke prenašate s pomočjo prejetih povezav. Na primer, obstaja spletno mesto s kopico povezav do dokumentov PDF. Vaša naloga je, da vse te datoteke naložite v računalnik. Hrbtenica skripta PowerShell za množično prenašanje datotek je lahko videti tako:

$ OutDir = "C: \ Prenosi \ dokumenti \ PDF"
$ SiteAdress = "https://www.site.ru/free-pdf-books/"
$ HttpContent = Pokliči-WebRequest -URI $ SiteAdress
$ HttpContent.Povezave | Kjer-objekt $ _. Href-podoben "* .pdf" | % Invoke-WebRequest -Uri $ _. Href -OutFile ($ OutDir + $ (Get-Random 100000) + ". Pdf")

Kot rezultat skripte v ciljnem imeniku se prenesejo vse datoteke PDF s strani. Vsaka datoteka se shrani pod poljubno ime..

V PowerShell 6.1, cmdlet Invoke-WebRequest podpira način nadaljevanja. Zato z uporabo parametra Invoke-WebRequest -Uri $ Uri -OutFile $ OutFile -Nadaljuj lahko nadaljujete s prenosom datoteke v primeru okvare kanala ali strežnika.

Popolno izpolnjevanje in pošiljanje spletnih obrazcev

Številne spletne storitve za delovanje potrebujejo vnos različnih podatkov v obrazcih HTML. Uporaba Pokliči-Spletna zahteva Dostopate lahko do katerega koli obrazca HTML, izpolnite potrebna polja in izpolnjen obrazec pošljete nazaj na strežnik. V tem primeru bomo pokazali, kako s pomočjo Powershell-a za prijavo v nabiralnik priljubljene ruske storitve mail.ru prek standardnega spletnega obrazca.

S pomočjo naslednje konstrukcije podatke o piškotkih za povezavo shranimo v ločeno spremenljivko seje:

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

Naslednji ukaz prikaže seznam polj, ki jih je treba izpolniti v obrazcu za avtorizacijo HTML (obrazec se imenuje LoginExternal):

$ mailru.Forms ["LoginExternal"]. Polja

Vsa polja dodelite potrebne vrednosti:

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

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

Itd ... .

Če želite izpolnjeni obrazec poslati spletnemu strežniku, pokličite atribut dejanja obrazca HTML.

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

Slabosti cmdlet-a Invoke-WebRequest

Ena od glavnih pomanjkljivosti cmdlet Invoke-WebRequest je njegova relativno majhna hitrost. Po prenosu datoteke HTTP se tok v celoti shrani v pomnilnik in šele po zaključku celotnega prenosa se shrani na disk. Tako vam lahko pri prenosu velikih datotek zmanjka pomnilnika.

Druga težava je, da je cmdlet Invoke-WebRequest tesno povezan z Internet Explorerjem. Na primer, v izdajah Windows Server Core, kjer IE ni nameščen, ne morete uporabiti ukaznega seznama Invoke-WebRequest.

Če se na spletnem mestu HTTP uporablja potrdilo s samopodpisom, potem cmdlet Invoke-WebRequest zavrne prejemanje podatkov z njega. Če želite prezreti neveljavno potrdilo SSL, uporabite to kodo:

SSL certifikat lahko prezrete takole:
dodaj @ @ "
z uporabo System.Net;
z uporabo System.Security.Cryptography.X509Certificate;
javni razred TrustAllCertsPolicy: ICertificatePolicy
javni bool CheckValidationResult (
ServicePoint srvPoint, potrdilo X509Certificate,
Zahteva za WebRequest, int certifikatProblem)
vrnitev resnična;


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