lamancha
Goto Top

Webseiteninhalte mit PowerShell lesen und als .txt speichern?

Hallo Skript-Experten,

ich bin mal wieder dabei, die Reisepreise von AIDA Vario zu beobachten (www.aida.de/vario, insgesamt ca. 12 Seiten). Mein AutoIT-Skript soll eigentlich alle Folgeseiten lesen, und macht das sehr unterschiedlich: auf Windows 8.1 geht es meistens gut, auf Windows 7 geht es manchmal bis zur Seite 2 oder 3 und dann nicht weiter. Ich habe wochenlang probiert, das AutoIt-Skript so zu codieren, dass es immer funktioniert, aber nun habe ich aufgegeben.

Deshalb habe ich jetzt versucht, das Auslesen der Seiten mit PowerShell zu probieren, aber ich kriege das leider nicht hin. Dies ist der Stand meiner bisherigen Bemühungen:
$sPath1 = "C:\Gm\GmPowerShell\test_"  
$sPath2 = ".txt"  
$sURL1 = "http://www.aida.de/kreuzfahrt/angebote-buchen/preise-ermaessigungen/aida-vario.19095.html?tx_aidadyncatalog_vario%5Bpage%5D="  
For ($sPage=0; $sPage -le 9; $sPage++) {
    $sPath = $sPath1 + $sPage + $sPath2 
    Write-Host $sPath
    $sURL = $sURL1 + $sPage
    Write-Host $sURL
    Invoke-WebRequest -Uri $sURL -Method Get -OutFile $sPath
    }
Abgesehen davon, dass noch ein Aussprung beim Fehlen einer bestimmten Zeichenfolge (keine "nächste Seite") und die Seitenzahl für die Ausgabedateien 2stellig nötig werden, kommt in den .txt-Dateien nur der Basis-Code der Seite an, nicht aber der interpretierte und angezeigte Code (da sind wohl Java-Skript Codings, die erst noch vom Browser aufgelöst werden müssen, und deren Auflösung brauche ich halt in den .txt-Dateien). Das Parsen der Beträge und deren Weiterleitung in eine Datenbank habe ich relativ stabil in ABAP programmiert.

Es wäre sehr schön, hier wieder mal eine Hilfestellung zu bekommen. Vielen Dank im Voraus. - La Mancha

Content-Key: 272186

Url: https://administrator.de/contentid/272186

Printed on: April 25, 2024 at 07:04 o'clock

Mitglied: 114757
Solution 114757 May 17, 2015, updated at Sep 17, 2015 at 15:46:46 (UTC)
Goto Top
Moin,
da sind wohl Java-Skript Codings, die erst noch vom Browser aufgelöst werden müssen, und deren Auflösung brauche ich halt in den .txt-Dateien
um die Daten zu erhalten musst du die Scripte analysieren wie und über welche URLs es die Daten abfragt und dir die URLs zusammenbauen um die Daten zu erhalten. Meist geschieht das via Ajax und die Rûckgabe der Daten als json.
Wenn man das analysiert hat kommt man meistens viel schneller und cleaner an die Daten anstatt den Inhalt einer sich möglicherweise stetig verändernden Webseitenstruktur auszulesen.

Was aber nicht geht, ist das triggern des Java-Scripts, das machen nur Browserinstanzen, aber nicht die Funktion invoke-webrequest, weil dies nur ein einfacher HTTP-Client ist !!

Für sowas brauchst du einen Headless-Browser der den Inhalt des DOM rendert ohne ihn darstellen zu müssen. Sowas ist zum Beispiel HtmlUnit

Gruß jodel32

-edit- bei deiner AIDA-Seite musst du diverse Dinge berechnen und als POST-Anfrage an die Seite schicken, damit sie die Daten herausrückt. Da bleibt dir nur das JavaScript zu analysieren und dann die benötigten Daten an die Seite via POST-Request zu schicken. Ansonsten kannst du den IE auch aus Powershell fernsteuern, aber das wäre dann das selbe wie mit AutoIt oder VBS
Member: LaMancha
LaMancha May 21, 2015 at 11:35:27 (UTC)
Goto Top
Hallo jodel32,

erst einmal Danke für die Antwort. Dem Verweis auf HtmlUnit bin ich nachgegangen, aber ich hoffe noch immer, dass ich einen Weg mit PowerShell finde. Mein Weltbild ist derzeit so, dass sowohl AutoIt als auch PowerShell das Internet Explorer Framework in Anspruch nehmen (InternetExplorer.Application object).

AutoIt bietet eigene Funktionen, um die Funktionen der Application aufzurufen, welche mir die benötigten Daten liefern:
$oIE = _IECreate($sUrl,0,0,0)
if @error <> 0 then
  Exit(69)
EndIf
_IELoadWait($oIE)
$sBody = _IEBodyReadHTML($oIE)
_IEQuit($oIE)
Die Funktion _IEBodyReadHTML bringt mir genau denjenigen String in $sBody, den ich brauche. Es müsste doch eigentlich etwas Ähnliches auch in PowerShell geben. Oder sehe ich die Welt falsch?

MfG - La Mancha
Mitglied: 114757
114757 May 21, 2015 updated at 11:49:14 (UTC)
Goto Top
Zitat von @LaMancha:
Mein Weltbild ist derzeit so, dass sowohl AutoIt als auch PowerShell das Internet Explorer Framework in
Anspruch nehmen (InternetExplorer.Application object).
Richtig, denn nur damit lässt sich das JavaScript clientseitig parsen und somit die Seite auflösen...
AutoIt bietet eigene Funktionen, um die Funktionen der Application aufzurufen, welche mir die benötigten Daten liefern:
Die aber auch nur auf das COM-Object des IE zugreifen !
Es müsste doch eigentlich etwas
Ähnliches auch in PowerShell geben. Oder sehe ich die Welt falsch?
Nope ... Wie gesagt nur über Zusatztools, oder eben in Powershell auch das IE-Objekt nutzen.
$objIE = New-Object -Com InternetExplorer.Application
Gruß jodel32