Parsing-Sites und Web-Seiten mit Powershell / Invoke-WebRequest / getElementsByTagName und kämpfen mit Leistung

Manchmal müssen Sie einige Website oder große Web-Seite zu analysieren. Google bietet viele Programme und Komplexe Ereignis Software, um diese Aufgabe zu erfüllen, aber ich will zeigen, wie Sie ganz einfach diese mit Hilfe von Powershell tun können.

Es gibt eine Invoke-WebRequest Cmdlets in Powershell , die tatsächlich HTML-Seite von Tags und Inhalt analysieren. Cmdlets geben Sie ein Objekt der Seite mit ParsedHtml Eigenschaft. Zu diesem Feld können Sie Methoden anwenden benötigten Daten zu extrahieren.

Angenommen, Sie alle Links von der Seite zu bekommen müssen. Sehen, wie es funktioniert.

$url = "http://site.com/page.html";
$page = Invoke-WebRequest $url -Method Get -DisableKeepAlive;
$elements_a = $page.ParsedHtml.getElementsByTagName('a') | ?{$_.getAttribute('itemprop') -eq "url"};

Nachdem Sie das Ergebnis der letzten Zeichenfolge in $elements_a, müssen Sie in Eigenschaften dieses Objekts zu bohren und benötigten Informationen übernehmen . In jedem Fall wird Ihre Beispieldaten unterschiedlich sein, weil alle Seiten unterschiedlich sind. Aber jetzt können wir universelles Beispiel verwenden - Seite Titel zu bekommen. Das wird auf jeder Seite arbeiten.

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;

Für komplexe Websites können komplexere Filter erstellen:

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;

 

Invoke-WebRequest und getElementsByTagName Leistung

getElementsByTagName Methode in Microsofts Realisierung - ist ziemlich schwer und langsam. Wenn Sie eine Pipe die Ergebnisse in einem anderen Cmdlets, könnte Skript Leistung katastrophal langsam sein. Zum Beispiel kann das letzte Beispiel laufen bis zu 30 Sekunden (wenn die Seite wirklich groß ist).

Ich weiß nicht den Grund dafür. Ich habe diese Diskussion gefunden: http://stackoverflow.com/questions/14202054/why-is-this-powershell-code-invoke-webrequest-getelementsbytagname-so-incred. Von ihm wurde mir klar, dass getElementsByTagName geben uns eine Reihe von COM-Objekten, und wir geben diese COM-Objekte in andere Cmdlets. Dies ist ein sehr langsamer Prozess, der zu 86% der CPU-Zeit in Anspruch nehmen.

Diese diesmal fand ich nur eine Lösung zu diesem Problem: Verwenden Sie 32-Bit-Powershell in solchen Fällen. Ich weiß nicht warum, aber es ist eine gute Leistung.

powershell (de), skript

  • Zugriffe: 8979
Kommentar schreiben

Related Articles