Invoke-WebRequest Powershell Web Content and HTML Site Processing

PowerShell w wersji 3.0 wprowadza możliwość bezpośredniego dostępu i pracy ze stronami HTML w Internecie. W tym celu opracowano specjalne polecenie cmdlet. Invoke-WebRequest. To polecenie cmdlet pozwala wdrożyć wiele scenariuszy: od możliwości pobierania / wysyłania pliku z / do dowolnej witryny internetowej za pośrednictwem HTTP / HTTPS / FTP, aż do możliwości analizowania stron HTML, monitorowania stanu serwerów WWW, wypełniania i przesyłania formularzy internetowych. Ogólnie rzecz biorąc, nowe polecenie cmdlet zapewnia wszystkie niezbędne metody poruszania się po drzewie DOM dokumentu HTML. W tym artykule przyjrzymy się kilku podstawowym przykładom pracy z poleceniem cmdlet Invoke-WebRequest programu PowerShell..

Treść

  • Korzystanie z polecenia cmdlet Invoke-WebRequest
  • Otrzymujemy listę wszystkich linków HTML na stronie
  • Analiza stron HTML za pomocą programu PowerShell
  • Jak pobrać plik przez HTTP za pomocą PowerShell
  • PowerShell wypełnianie i przesyłanie formularzy internetowych
  • Wady polecenia cmdlet Invoke-WebRequest

Wskazówka. Polecenie cmdlet Invoke-WebRequest jest dostępne w programie Windows PowerShell 3.0, więc przed rozpoczęciem należy użyć tej lub nowszej wersji. Jeśli na komputerze zainstalowanych jest kilka wersji Posh, możesz przełączać się między nimi.

Korzystanie z polecenia cmdlet Invoke-WebRequest

Cmdlet Wywołaj-Zapytanie internetowe (alias wget) może wysyłać i odbierać żądania HTTP, HTTPS i FTP, przetwarzać odpowiedź zwróconą przez serwer. Odpowiedź to zbiór formularzy, linków, obrazów i innych ważnych elementów dokumentu HTML.

Spróbujmy następującego polecenia:

Invoke-WebRequest -Uri „http://winitpro.ru”

Wskazówka. Jeśli jesteś podłączony do Internetu za pośrednictwem serwera proxy, to aby polecenia cmdlet PoweShell działały poprawnie, skorzystaj ze wskazówek z artykułu: Jak skonfigurować PowerShell pod kątem dostępu przez serwer proxy.

Jak widać, zwrócona odpowiedź nie jest prostym kodem HTML strony. Zobaczysz różne właściwości dokumentu internetowego. Polecenie cmdlet Invoke-WebRequest, podobnie jak większość innych poleceń cmdlet programu PowerShell, działa na obiektach. Invoke-WebRequest zwraca obiekt typu HtmlWebResponseObject. Zobaczmy wszystkie właściwości tego obiektu:

$ WebResponseObj = Invoke-WebRequest -Uri „http://winitpro.ru”
$ WebResponseObj | Pobierz członka

Aby uzyskać nieprzetworzony kod HTML strony internetowej zawartej w tym obiekcie, wykonaj:

$ WebResponseObj.content

Możesz zwrócić kod HTML wraz z nagłówkami HTTP zwróconymi przez serwer WWW:

$ WebResponseObj.rawcontent

Możesz sprawdzić tylko kod odpowiedzi serwera WWW i nagłówki HTTP strony HTML:

$ WebResponseObj.Headers

Jak widać, serwer WWW zwrócił odpowiedź 200, tj. żądanie zakończyło się powodzeniem, a serwer WWW jest dostępny i działa poprawnie.

Otrzymujemy listę wszystkich linków HTML na stronie

Przechodzimy do strony głównej naszej witryny i uzyskujemy listę dostępnych na niej linków:
$ SiteAdress = "http://winitpro.ru"
$ HttpContent = Invoke-WebRequest -URI $ SiteAdress
$ HttpContent.Links | Foreach $ _. Href

Aby uzyskać sam tekst linku (zawarty w elemencie InnerText), możesz użyć tej konstrukcji:

$ HttpContent.Links | fl innerText, href

Możesz wybrać tylko linki z określoną klasą CSS:

$ HttpContent.Links | Where-Object $ _. Klasa -eq „numery stron” | fl innerText, href

Lub określony tekst w adresie URL:

$ HttpContent.Links | Where-Object $ _. Podobne do Hrefa „* exchange *” | fl innerText, href

Analiza stron HTML za pomocą programu PowerShell

Polecenie cmdlet Invoke-WebRequest umożliwia szybkie i wygodne analizowanie zawartości dowolnych stron internetowych. Podczas przetwarzania strony HTML z jej zawartości tworzone są zbiory linków (linków), formularzy internetowych (formularzy), obrazów (obrazów), skryptów (skryptów) itp..

Korzystając z Powershell, otrzymujemy zawartość strony głównej naszej witryny:

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

Następnie wyświetlamy wszystkie obrazy na tej stronie:

Obrazy Img

Utworzymy kolekcję pełnych ścieżek URL dla używanych obrazów:

$ images = $ Img.Images | wybierz src

Zainicjuj nowe wystąpienie klasy WebClient:

$ wc = New-Object System.Net.WebClient

I pobierz wszystkie obrazy ze strony (z oryginalnymi nazwami) do katalogu c: \ tools \:

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

Ciekawym przykładem użycia polecenia cmdlet Invoke-WebRequest jest sposób znalezienia zewnętrznego adresu IP komputera za pomocą programu PowerShell.

Jak pobrać plik przez HTTP za pomocą PowerShell

Invoke-WebRequest może działać jako analog Wget lub cURL dla Windows, umożliwiając pobranie żądanego pliku lub plików ze strony internetowej lub witryny ftp. Załóżmy, że musimy użyć programu PowerShell, aby pobrać określony plik przez HTTP (w naszym przykładzie dystrybucja Mozilla Firefox). Uruchom następujące polecenie:

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”

W wyniku uruchomienia polecenia cmdlet plik zostanie pobrany z określonego adresu URL i zapisany w katalogu c: \ tools \ pod nazwą firefox setup 32.0.3.exe. Jeśli chcesz pobrać plik z witryny FTP, po prostu zamień http: // na ftp: //.

Możesz także pobierać pliki z serwera WWW za pomocą BITS w trybie synchronicznym.

W ten sposób można łatwo znaleźć na określonej stronie internetowej wszystkie linki, które spełniają określone kryteria (klasa linków, rozdzielczość w nazwie pliku, adres url), i pobierać pliki za pomocą otrzymanych linków. Na przykład istnieje strona internetowa z wieloma linkami do dokumentów PDF. Twoim zadaniem jest pobranie wszystkich tych plików na komputer. Podstawa skryptu PowerShell do masowego pobierania plików może wyglądać następująco:

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

W wyniku skryptu w katalogu docelowym wszystkie pliki pdf ze strony zostaną pobrane. Każdy plik jest zapisywany pod dowolną nazwą..

W PowerShell 6.1 cmdlet Invoke-WebRequest obsługuje tryb wznawiania. Dlatego przy użyciu parametru Invoke-WebRequest -Uri $ Uri -OutFile $ OutFile -Wznów możesz wznowić pobieranie pliku w przypadku awarii kanału lub serwera.

PowerShell wypełnianie i przesyłanie formularzy internetowych

Wiele serwisów internetowych wymaga do działania różnych danych w formularzach HTML. Korzystanie Wywołaj-Zapytanie internetowe Możesz uzyskać dostęp do dowolnego formularza HTML, wypełnić wymagane pola i przesłać wypełniony formularz z powrotem na serwer. W tym przykładzie pokażemy, jak używać programu Powershell do logowania się do skrzynki pocztowej popularnej rosyjskiej usługi mail.ru za pośrednictwem standardowego formularza internetowego.

Korzystając z następującej konstrukcji, zapisujemy informacje o pliku cookie dla połączenia w osobnej zmiennej sesji:

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

Następujące polecenie wyświetla listę pól do wypełnienia w formularzu autoryzacji HTML (formularz nazywa się LoginExternal):

$ mailru.Forms [„LoginExternal”]. Pola

Przypisz niezbędne wartości do wszystkich pól:

$ mailru.Forms [„LoginExternal”]. Pola [„Login”] = „[email protected]

$ mailru.Forms [„LoginExternal”]. Pola [„Hasło”] = „Str0NgP $$ w0rd”

Itd ... .

Aby przesłać wypełniony formularz na serwer WWW, wywołaj atrybut akcji formularza HTML.

$ Log = Invoke-WebRequest -method POST -URI („https://e.mail.ru/login” + $ mailru.Forms [„LoginExternal”]. Działanie) -Body $ mailru.Forms [„LoginExternal”]. Fields -WebSession $ session

Wady polecenia cmdlet Invoke-WebRequest

Jedną z głównych wad cmdletu Invoke-WebRequest jest jego stosunkowo niska prędkość. Po pobraniu pliku HTTP strumień jest w pełni buforowany do pamięci i dopiero po zakończeniu pełnego pobierania zapisywany jest na dysku. Dlatego podczas pobierania dużych plików może zabraknąć pamięci.

Innym problemem jest to, że polecenie cmdlet Invoke-WebRequest jest ściśle związane z programem Internet Explorer. Na przykład w wersjach systemu Windows Server Core, w których IE nie jest zainstalowany, nie można używać polecenia cmdlet Invoke-WebRequest.

Jeśli w witrynie HTTP używany jest samopodpisany certyfikat, wówczas polecenie cmdlet Invoke-WebRequest odmawia odebrania z niego danych. Aby zignorować nieprawidłowy certyfikat SSL, użyj następującego kodu:

Możesz zignorować certyfikat SSL w następujący sposób:
dodaj typ @ ”
using System.Net;
using System.Security.Cryptography.X509Certificates;
klasa publiczna TrustAllCertsPolicy: ICertificatePolicy
public bool CheckValidationResult (
ServicePoint srvPoint, certyfikat X509Certificate,
Żądanie WebRequest, int certyfikatProblem)
zwróć prawdę;


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