Probleme beim Abschaben von Webseiten mit zombie.js

8

Ich muss ein bisschen kratzen. Nachdem ich mit verschiedenen Web-Testrahmen experimentiert habe, von denen die meisten entweder zu langsam (Selenium) oder zu fehlerhaft für meine Bedürfnisse (env.js) waren, entschied ich, dass zombie.js sieht am vielversprechendsten aus, da es einen festen Satz von Bibliotheken für HTML-Parsing und DOM-Manipulation verwendet. Es scheint mir jedoch so, als ob es nicht einmal basis ereignisbasierten JavaScript-Code wie in der folgenden Webseite unterstützt:

%Vor%

Ich habe dann beschlossen, diese Ereignisse manuell wie folgt auszulösen:

%Vor%

Was für diese spezielle Testseite funktioniert. Mein Problem ist jedoch allgemeiner: Ich möchte in der Lage sein, komplexere AJAX-basierte Sites wie eine Freundesliste auf Facebook zu scrapen (etwas wie Ссылка ). Es ist kein Problem, sich mit zombie auf der Seite anzumelden, aber einige Inhalte wie diese Listen scheinen komplett dynamisch mit AJAX geladen zu werden, und ich weiß nicht, wie ich die Event-Handler auslösen soll, die das Laden einleiten.

Ich habe mehrere Fragen zu diesem Problem:

  • Hat jemand bereits einen ähnlich komplexen Scraper implementiert, ohne eine fernsteuerbare Browser-Lösung wie Selenium zu verwenden?
  • Gibt es einen Verweis auf den Ladeprozess einer komplexen Javascript-basierten Seite?
  • Kann jemand Ratschläge geben, wie man einen echten Browser austesten kann, um zu sehen, was ich zum Auslösen der Facebook Event-Handler ausführen muss?
  • Irgendwelche anderen Ideen zu diesem Thema?

Bitte weisen Sie mich auch hier nicht auf Lösungen hin, die einen echten Browser wie Selenium steuern, wie ich darüber weiß. Was jedoch willkommen ist, sind Vorschläge für einen echten In-Memory-Renderer wie WebKit, der aus der Ruby-Skriptsprache zugänglich ist, aber vorzugsweise mit der Möglichkeit, Cookies zu setzen und vorzugsweise auch HTML zu laden anstatt echte HTTP-Anfragen auszulösen.

    
Niklas B. 07.09.2011, 15:50
quelle

1 Antwort

12

Für Zwecke der Datenextraktion wird es nicht die einfachste Sache sein, einen "kopflosen Browser" auszuführen und Javascript-Ereignisse manuell auszulösen. Obwohl es nicht unmöglich ist, gibt es einfachere Möglichkeiten.

Die meisten Websites, selbst AJAX-schwere, können ohne eine einzige Zeile ihres JavaScript-Codes gescratet werden. Tatsächlich ist es normalerweise einfacher, als den JavaScript-Code einer Site zu finden , der oft verschleiert, minimiert und schwer zu debuggen ist. Wenn Sie ein solides Verständnis von HTTP haben, werden Sie verstehen, warum: (fast) alle Interaktionen mit dem Server als HTTP-Anfragen kodiert sind, also ob sie von Javascript initiiert werden oder der Benutzer auf einen Link oder benutzerdefinierten Code in einem Bot-Programm klickt, Es gibt keinen Unterschied zum Server. (Ich sage fast, weil, wenn Flash oder Applets beteiligt werden, es nicht sagen kann, welche Daten wo fliegen; sie können anwendungsspezifisch sein. Aber alles, was in Javascript getan wird, wird über HTTP gehen.)

Davon abgesehen ist es möglich, einen Benutzer auf einer Website mit einer benutzerdefinierten Software nachzuahmen. Zuerst müssen Sie in der Lage sein, die rohen HTTP-Anfragen zu sehen, die an den Server gesendet werden. Sie können einen Proxy-Server verwenden, um Anfragen, die von einem echten Browser an die Zielwebsite gestellt werden, aufzuzeichnen. Es gibt viele, viele Tools, die Sie dafür verwenden können: Charles oder Fiddler sind praktisch, die meisten dedizierten Screen-Scraper-Tools haben einen grundlegenden Proxy eingebaut, die Firebug Erweiterung für Firefox und Chrome haben ähnliche Tools zum Anzeigen von AJAX-Anfragen ... Sie bekommen die Idee.

Sobald Sie die HTTP-Anforderungen sehen, die als Ergebnis einer bestimmten Aktion auf der Website erstellt wurden, ist es einfach, ein Programm zu schreiben, das diese Anforderungen nachahmt. Senden Sie einfach die gleichen Anfragen an den Server und es behandelt Ihr Programm genau wie ein Browser, in dem eine bestimmte Aktion ausgeführt wurde.

Es gibt verschiedene Bibliotheken für verschiedene Sprachen, die unterschiedliche Fähigkeiten bieten. Für Ruby habe ich eine Menge Leute gesehen, die für Ruby mechanisieren.

Wenn die Datenextraktion Ihr einziges Ziel ist, werden Sie fast immer in der Lage sein, das zu erhalten, was Sie brauchen, indem Sie HTTP-Anfragen auf diese Weise nachahmen. Kein Javascript erforderlich.

Hinweis - Da Sie Facebook erwähnt haben, sollte ich erwähnen, dass Facebook-Scraping außergewöhnlich schwierig (wenn auch nicht unmöglich) sein kann, da Facebook Maßnahmen zur Erkennung des automatisierten Zugriffs implementiert hat (sie verwenden mehr als nur Captchas); Sie werden einen Account deaktivieren, wenn sie verdächtige Aktivitäten sehen. Es ist schließlich gegen ihre Nutzungsbedingungen (Abschnitt 3.2).

    
chesles 07.09.2011, 18:00
quelle