Wie man Invoke-WebRequest in PowerShell verwendet, ohne den Verstand zu verlieren
Wer mit PowerShell experimentiert und versucht, Daten von Websites abzurufen oder Dateien herunterzuladen, ist sicherlich schon auf einige Tücken gestoßen. Das Cmdlet `Invoke-WebRequest` ist zwar recht praktisch – es ermöglicht das Auslesen von Inhalten, das Herunterladen von Dateien und sogar das Ausfüllen von Formularen –, aber es ist nicht perfekt, insbesondere bei SSL-Problemen, Proxy-Problemen oder wenn man auf einem Server ohne grafische Oberfläche und ohne Internet Explorer arbeitet. Daher folgt hier eine kurze, aber praxisnahe Übersicht darüber, was funktioniert und was nicht, sowie einige Tipps, um die üblichen Probleme zu vermeiden.
Webinhalte abrufen, ohne den Browser zu beschädigen
Verwenden Sie den Basisbefehl – manchmal genügt er.
Wenn Ihre Netzwerkverbindung funktioniert, sollte die Ausführung Invoke-WebRequest -Uri "https://woshub.com"die gesamte HTML-Seite liefern. Im Erfolgsfall gibt PowerShell ein übersichtliches Objekt zurück, das Sie auf Links, Bilder und andere Elemente untersuchen können. Befinden Sie sich jedoch hinter einem Proxy oder ist Ihre Internetverbindung bei SSL-Zertifikaten pingelig, kann es natürlich zu Fehlermeldungen kommen.
Profi-Tipp: Bei manchen Konfigurationen schlägt dieser Befehl beim ersten Ausführen oder aufgrund von Proxy-Problemen fehl. Möglicherweise müssen Sie den Proxy explizit in PowerShell konfigurieren oder die entsprechenden Umgebungsvariablen wie HTTP_PROXY und HTTPS_PROXY festlegen. Und ja, falls Fehlermeldungen wie „Verbindung nicht möglich“ erscheinen, überprüfen Sie Ihre Proxy-Einstellungen, insbesondere in einem Unternehmensnetzwerk.
Was Sie zurückbekommen
Die Anfrage liefert jedoch nicht nur reines HTML. Sie erhalten ein Objekt vom Typ ` HtmlWebResponseObject`. Dieses enthält Links, Bilder, Formulare – all das können Sie mit Eigenschaften wie .Links`<html>` .Content, `<html>` usw.analysieren. Wenn Sie das reine HTML benötigen, rufen Sie einfach `<html>` auf $WebResponseObj.content. Ganz einfach, aber an einem schlechten Tag kann es etwas langsam sein oder SSL-Fehler verursachen.
Handshake mit Headern und User-Agent
Manche Websites sperren Nutzer, die sich nicht als echter Browser ausgeben. Um den User-Agent zu fälschen, verwenden Sie beispielsweise Folgendes:
Invoke-WebRequest -Uri $uri -UserAgent ([Microsoft. PowerShell. Commands. PSUserAgent]::Chrome)
Oder man legt eine benutzerdefinierte Zeichenfolge fest, denn natürlich muss Windows das Ganze unnötig kompliziert machen:
Invoke-WebRequest -Uri $uri -UserAgent 'MyCustomAgent/1.0'
Umgang mit der Authentifizierung – denn manche Websites sind nicht gerade benutzerfreundlich.
Grundlegende Zugangsdaten – einfach, aber begrenzt
Wenn die Website die Basisauthentifizierung verwendet, können Sie die Anmeldeinformationen wie folgt angeben:
$cred = Get-Credential
und dann:
Invoke-WebRequest -Uri 'https://somesite.com' -Credential $cred
Aber Achtung: Dies funktioniert nur, wenn der Server die angegebenen Anmeldeinformationen akzeptiert. Wenn Sie NTLM oder Kerberos verwenden möchten, fügen Sie ` -UseDefaultCredentials` hinzu – aber Vorsicht, das funktioniert nicht immer bei Basic.
Zertifikate und OAuth-Tokens – komplizierter
Falls die Website ein Zertifikat benötigt, geben Sie den Fingerabdruck an:
Invoke-WebRequest -Uri 'https://somesite.com' -CertificateThumbprint 'YOUR_CERT_THUMBPRINT'
OAuth-Token erfordern etwas benutzerdefiniertes Skripting – zuerst muss das Token abgerufen, dann in eine sichere Zeichenkette konvertiert und anschließend als Bearer-Token eingebunden werden:
$Token = 'your_oauth_token' | ConvertTo-SecureString -AsPlainText -Force $Headers = @{ Authorization = "Bearer $Token" } Invoke-WebRequest -Uri 'https://somesite.com' -Headers $Headers
Ja, es ist ein bisschen wie ein Tanz, aber wenn man den Dreh erst mal raus hat, klappt es.
HTML-Scraping und -Parsing – PowerShell als Web-Sniffer
Alle Links oder Bilder einfach abrufen
Hier kann Invoke-WebRequest seine Stärken ausspielen, sofern es korrekt funktioniert. So listen Sie alle Links auf einer Seite auf:
$Content = Invoke-WebRequest -Uri "https://woshub.com" $Content. Links | Select-Object href, innerText
Wenn Sie bestimmte Links wünschen, filtern Sie nach Klasse oder Text:
$Content. Links | Where-Object {$_.class -eq "page-numbers"} | Select-Object href, innerText
Um Bilder zu erhalten:
$Content. Images | Select-Object src
Und wenn Sie besonders ambitioniert sind, können Sie sogar mehrere Bilder gleichzeitig herunterladen:
$wc = New-Object System. Net. WebClient $Content. Images | ForEach-Object { $url = $_.src $fileName = [io.path]::GetFileName($url) $wc. DownloadFile($url, "C:\\tools\$fileName") }
Dateien herunterladen – Wget ist nicht nötig, PowerShell erledigt das.
Einfacher Datei-Download
wget "https://download-installer.cdn.mozilla.net/pub/firefox/releases/102.0.1/win64/en-US/Firefox%20Setup%20102.0.1.exe" -outfile "C:\tools\firefox_setup.exe"
Dadurch wird die Datei direkt auf Ihren Rechner heruntergeladen. Wenn Sie die Größe vor dem Herunterladen überprüfen möchten, können Sie eine HEAD-Anfrage senden:
$url = "https://download-installer.cdn.mozilla.net/pub/firefox/releases/102.0.1/win64/en-US/Firefox%20Setup%20102.0.1.exe" ($headers = Invoke-WebRequest -Uri $url -Method Head).Headers['Content-Length'] / 1MB
Wenn Sie alle PDFs einer Seite auf einmal erfassen (und sie vielleicht unter zufälligen Namen speichern) möchten, könnte Ihnen Folgendes helfen:
$OutDir = "C:\docs\download\PDF" $Site = "https://sometechdocs.com/pdf" $Content = Invoke-WebRequest -Uri $Site $Content. Links | Where-Object {$_.href -like "*.pdf"} | ForEach-Object { $fileName = [io.path]::GetFileName($_.href) $filePath = Join-Path $OutDir $fileName Invoke-WebRequest -Uri $_.href -OutFile $filePath }
Bei großen Dateien oder instabilen Verbindungen unterstützt PowerShell 6+ den Modus „-Resume“, sodass Sie nicht von vorne beginnen müssen, falls der Download abbricht. Stellen Sie lediglich sicher, dass Sie PowerShell Core 6.1 oder neuer verwenden.
Formulare mit PowerShell ausfüllen und absenden – denn Web Scraping ist mehr als nur Lesen.
Melden Sie sich mit Session-Cookies auf einer Website an oder füllen Sie Formulare aus.
$session = New-Object Microsoft. PowerShell. Commands. WebRequestSession $authPage = Invoke-WebRequest -Uri "https://www.facebook.com/login.php" -SessionVariable session $authPage. Forms["login_form"].Fields["email"] = "[email protected]" $authPage. Forms["login_form"].Fields["pass"] = "Coo1P$wd" $submitUrl = "https://www.facebook.com/login.php" + $authPage. Forms["login_form"].Action $loginResponse = Invoke-WebRequest -Uri $submitUrl -Method Post -Body $authPage. Forms["login_form"].Fields -WebSession $session
Damit lassen sich Webseiten programmatisch anmelden, Daten extrahieren oder Formularübermittlungen automatisieren. Es funktioniert nicht immer perfekt, insbesondere wenn die Webseite Anti-Bot-Maßnahmen oder dynamische Formulare verwendet, ist aber überraschend nützlich.
Umgang mit SSL/TLS-Problemen – Denn SSL ist lästig
Ungültige Zertifikate ignorieren (z. B.wenn Sie mit einem selbstsignierten Zertifikat testen)
add-type @" using System. Net; using System. Security. Cryptography. X509Certificates; public class TrustAllCertsPolicy : ICertificatePolicy { public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate cert, WebRequest req, int certProb) { return true; } } "@ [System. Net. ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy [System. Net. ServicePointManager]::SecurityProtocol = [Net. SecurityProtocolType]::Tls12 Invoke-WebRequest -Uri "https://somesite.com"
In PowerShell Core können Sie mit der Option `-SkipCertificateCheck` denselben Effekt erzielen. Beachten Sie jedoch, dass das Umgehen von SSL-Prüfungen gefährlich ist und nur zu Testzwecken oder für interne Zwecke erfolgen sollte.
Standardmäßig verwendet Windows alte, unsichere TLS-Protokolle. Sollten Verbindungsfehler aufgrund von Vertrauensproblemen oder Protokollkonflikten auftreten, müssen Sie TLS 1.2 explizit aktivieren:
[Net. ServicePointManager]::SecurityProtocol = [Net. SecurityProtocolType]::Tls12
Andernfalls verweigert PowerShell die Verbindung zu modernen HTTPS-Websites mit selbstsignierten oder ungültigen Zertifikaten, denn Windows muss es natürlich unnötig kompliziert machen.
Kurzgesagt…
Invoke-WebRequest ist leistungsstark, kann aber auch etwas knifflig sein. Glauben Sie mir, die Konfiguration von Proxys, das Setzen der richtigen Header und die Verwaltung von SSL-Zertifikaten sind die halbe Miete. Sobald Sie die Eigenheiten jedoch verstanden haben, ist es ein praktisches Werkzeug zur Automatisierung von Webaufgaben direkt aus PowerShell.
Zusammenfassung
- Verwenden Sie den Basisbefehl für schnelle Überprüfungen (
Invoke-WebRequest -Uri "https://..."). - Konfigurieren Sie die Proxys/Einstellungen, falls Verbindungsfehler auftreten.
- Beheben Sie SSL-Zertifikatsprobleme mit benutzerdefinierten Richtlinien oder der Option „-SkipCertificateCheck“.
- Nutzen Sie die Objekteigenschaften zum Auslesen von Links oder Bildern
- Die Automatisierung des Ausfüllens von Formularen kann knifflig, aber machbar sein.
- Bei großen Downloads empfiehlt sich die Verwendung von -Resume oder anderen optimierten Techniken.
Zusammenfassung
Das ist zwar etwas umständlich, aber es ist die Anleitung für die korrekte Verwendung von Invoke-WebRequest. Es gibt immer irgendwelche Fallstricke – Proxy, SSL oder seitenbezogene Anpassungen. Dennoch ermöglicht es in den richtigen Händen die Automatisierung von Webprozessen, ohne dass ein Browser oder ein externes wget benötigt wird. Hoffentlich spart es jemandem ein paar Stunden Herumprobieren.