Hoe gebruik je Invoke-WebRequest voor HTTP-verzoeken, het downloaden van bestanden en het parseren van webinhoud met PowerShell?

Hoe gebruik je Invoke-WebRequest in PowerShell zonder gek te worden?

Als je met PowerShell aan de slag bent en probeert gegevens van websites te halen of bestanden te downloaden, ben je ongetwijfeld wel eens tegen wat eigenaardigheden aangelopen. De cmdlet Invoke-WebRequest is erg handig: je kunt er content mee scrapen, dingen downloaden en zelfs formulieren invullen. Maar hij is niet perfect, vooral niet bij SSL-problemen, ingewikkelde proxy’s of wanneer je op een server zonder grafische interface en zonder Internet Explorer werkt. Daarom volgt hier een ietwat ruwe, maar praktische handleiding van wat wel en niet werkt, met een paar tips om de gebruikelijke frustraties te voorkomen.

Webcontent ophalen zonder je browser te laten crashen

Gebruik de standaardopdracht; soms is dat voldoende.

Als je netwerk goed werkt, zou je na het uitvoeren Invoke-WebRequest -Uri "https://woshub.com"de volledige HTML-pagina moeten zien. Wanneer het werkt, retourneert PowerShell een handig object dat je kunt onderzoeken op links, afbeeldingen en andere nuttige informatie. Maar als je achter een proxy zit of je internetverbinding lastig is met SSL-certificaten, kan het natuurlijk zomaar mislukken.

Tip: In sommige configuraties mislukt deze opdracht bij de eerste keer uitvoeren of vanwege proxyproblemen. Mogelijk moet u de proxy expliciet configureren in PowerShell of de juiste omgevingsvariabelen instellen, zoals HTTP_PROXY en HTTPS_PROXY. En ja, als u foutmeldingen krijgt zoals ‘Kan geen verbinding maken’, controleer dan uw proxy-instellingen, vooral als u zich op een bedrijfsnetwerk bevindt.

Wat je terugkrijgt

Het verzoek retourneert echter niet alleen pure HTML. Je krijgt een object van het type HtmlWebResponseObject. Dit object bevat links, afbeeldingen, formulieren – je kunt al deze elementen bekijken met eigenschappen zoals .Links, .Content, enzovoort. Als je de onbewerkte HTML wilt, hoef je alleen maar.te gebruiken $WebResponseObj.content. Dat is eenvoudig genoeg, maar op een slechte dag kan het wat traag zijn of SSL-fouten veroorzaken.

Handshake met headers en user-agent

Sommige websites gooien je eruit als je je niet voordoet als een echte browser. Om user agents te vervalsen, gebruik je zoiets als:

Invoke-WebRequest -Uri $uri -UserAgent ([Microsoft. PowerShell. Commands. PSUserAgent]::Chrome)

Of stel een aangepaste tekenreeks in, want Windows moet het natuurlijk ingewikkelder maken dan nodig:

Invoke-WebRequest -Uri $uri -UserAgent 'MyCustomAgent/1.0'

Omgaan met authenticatie: sommige websites zijn niet zo gebruiksvriendelijk.

Basisgegevens: het is eenvoudig, maar beperkt.

Als de site gebruikmaakt van Basic Auth, kunt u uw inloggegevens als volgt opgeven:

$cred = Get-Credential

en vervolgens:

Invoke-WebRequest -Uri 'https://somesite.com' -Credential $cred

Maar onthoud: dit werkt alleen als de server de opgegeven inloggegevens accepteert. Als je NTLM of Kerberos wilt gebruiken, voeg dan ` -UseDefaultCredentials` toe, maar let op: dit werkt niet altijd voor Basic.

Certificaten en OAuth-tokens: ingewikkelder.

Als de site een certificaat nodig heeft, geef dan de vingerafdruk op:

Invoke-WebRequest -Uri 'https://somesite.com' -CertificateThumbprint 'YOUR_CERT_THUMBPRINT'

OAuth-tokens vereisen wat aangepaste scripting: haal eerst het token op, converteer het naar een beveiligde tekenreeks en voeg het vervolgens toe als een Bearer-token.

$Token = 'your_oauth_token' | ConvertTo-SecureString -AsPlainText -Force $Headers = @{ Authorization = "Bearer $Token" } Invoke-WebRequest -Uri 'https://somesite.com' -Headers $Headers

Ja, het is even een dansje, maar het werkt als je eenmaal de flow te pakken hebt.

HTML scrapen en parsen — PowerShell gebruiken als websniffer

Alle links of afbeeldingen eenvoudig vastleggen

Dit is waar Invoke-WebRequest echt tot zijn recht komt, mits het meewerkt. Om alle links op een pagina weer te geven:

$Content = Invoke-WebRequest -Uri "https://woshub.com" $Content. Links | Select-Object href, innerText

Als je specifieke links wilt, filter dan op categorie of tekst:

$Content. Links | Where-Object {$_.class -eq "page-numbers"} | Select-Object href, innerText

Om afbeeldingen te verkrijgen:

$Content. Images | Select-Object src

En als je ambitieus bent, kun je zelfs meerdere afbeeldingen tegelijk downloaden:

$wc = New-Object System. Net. WebClient $Content. Images | ForEach-Object { $url = $_.src $fileName = [io.path]::GetFileName($url) $wc. DownloadFile($url, "C:\\tools\$fileName") }

Bestanden downloaden — Geen Wget nodig, PowerShell regelt het.

Eenvoudig bestand downloaden

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"

Hiermee wordt het bestand direct naar uw computer gedownload. Als u de grootte wilt controleren voordat u het downloadt, kunt u een HEAD-verzoek indienen:

$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

Als je alle PDF’s van een pagina in één keer wilt downloaden (en ze eventueel onder willekeurige namen wilt opslaan), kan dit je wellicht helpen:

$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 }

Voor grote bestanden of onbetrouwbare verbindingen ondersteunt PowerShell 6+ de -Resume- modus, zodat u niet helemaal opnieuw hoeft te beginnen als uw download mislukt. Zorg er wel voor dat u PowerShell Core 6.1 of nieuwer gebruikt.

Formulieren invullen en verzenden met PowerShell: webscraping is meer dan alleen lezen.

Inloggen op een website of formulieren invullen met sessiecookies

$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

Hiermee kun je programmatisch inloggen op websites, gegevens verzamelen of formulierinzendingen automatiseren. Het is niet altijd perfect, vooral als de site anti-botmaatregelen of dynamische formulieren gebruikt, maar het is verrassend nuttig.

Problemen met SSL/TLS oplossen – want SSL is lastig

Negeer ongeldige certificaten (bijvoorbeeld als u test met een zelfondertekend certificaat).

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 kun je -SkipCertificateCheck gebruiken voor hetzelfde effect. Houd er wel rekening mee dat het omzeilen van SSL-controles gevaarlijk is en alleen voor testdoeleinden of intern gebruik bedoeld is.

Standaard gebruikt Windows oude, onveilige TLS-protocollen. Als u verbindingsfouten krijgt over vertrouwens- of protocolincompatibiliteit, moet u TLS 1.2 expliciet inschakelen.

[Net. ServicePointManager]::SecurityProtocol = [Net. SecurityProtocolType]::Tls12

Anders weigert PowerShell verbinding te maken met moderne HTTPS-sites met zelfondertekende of ongeldige certificaten, omdat Windows het natuurlijk onnodig moeilijk moet maken.

Kort samengevat…

Invoke-WebRequest is krachtig, maar kan lastig zijn. Geloof me, het configureren van proxy’s, het instellen van de juiste headers en het afhandelen van SSL-certificaten is al de helft van het werk. Maar als je eenmaal de eigenaardigheden doorhebt, is het een handig hulpmiddel om webtaken rechtstreeks vanuit PowerShell te automatiseren.

Samenvatting

  • Gebruik de basisopdracht voor snelle controles ( Invoke-WebRequest -Uri "https://...").
  • Configureer de proxy’s/instellingen als u verbindingsfouten krijgt.
  • Los SSL-certificaatproblemen op met aangepaste beleidsregels of -SkipCertificateCheck.
  • Gebruik de objecteigenschappen om links of afbeeldingen te scrapen.
  • Het automatiseren van het invullen van formulieren kan lastig zijn, maar is zeker mogelijk.
  • Overweeg voor grote downloads de functie -Resume of andere geoptimaliseerde technieken.

Samenvatting

Dit is misschien wat omslachtig, maar het is de handleiding voor het goed samenwerken met Invoke-WebRequest. Er is altijd wel een addertje onder het gras – proxy, SSL of sitespecifieke aanpassingen. Toch kun je er, in de juiste handen, webzaken mee automatiseren zonder een browser of externe wget te hoeven gebruiken. Ik hoop dat dit iemand een paar uur aan gepruts bespaart.