Navigieren / Scrappen von Hashbang-Links mit Javascript (phantomjs)

9

Ich versuche, den HTML-Code einer Website herunterzuladen, die fast ausschließlich mit JavaScript erstellt wurde. Also muss ich den Browser-Zugang simulieren und habe mit PhantomJS herumgespielt. Das Problem ist, dass die Seite Hashbang-URLs verwendet und ich PhantomJS nicht dazu bringen kann, den Hashbang zu verarbeiten - es ruft nur die Homepage ab.

Die Seite ist Ссылка . Der Standardwert führt Sie zu #! Home. Ich habe versucht, den folgenden Code (von hier ) zu verwenden, um verschiedene Hashbangs zu verarbeiten .

%Vor%

Dieser Code erzeugt den richtigen Hashbang (zum Beispiel kann ich den Hash auf '#! contactus' setzen), erzeugt aber keinen anderen HTML-Code - nur die Standardseite. Es wird jedoch korrekt ausgegeben, wenn ich document.location.hash aufruft.

Ich habe auch versucht, die Anfangsadresse auf den Hashbang zu setzen, aber dann hängt das Skript einfach und macht nichts. Wenn ich zum Beispiel die URL auf http://www.regulations.gov/#!searchResults;rpp=10;po=0 setze, bleibt das Skript nach dem Drucken der Adresse auf dem Terminal hängen und es passiert nichts.

    
tchaymore 20.06.2011, 16:04
quelle

1 Antwort

5

Das Problem hierbei ist, dass der Inhalt der Seite asynchron geladen wird, aber Sie erwarten, dass er verfügbar ist, sobald die Seite geladen ist.

Um eine Seite zu scrappen, die Inhalt asynchron lädt, müssen Sie warten, bis der Inhalt, an dem Sie interessiert sind, geladen wurde. Je nach Seite gibt es verschiedene Arten der Überprüfung, aber am einfachsten ist es, in regelmäßigen Abständen nach etwas zu suchen, das Sie erwarten, bis Sie es finden.

Der Trick hier ist herauszufinden, was Sie suchen - Sie brauchen etwas, das nicht auf der Seite vorhanden sein wird, bis der gewünschte Inhalt geladen wurde. In diesem Fall ist die einfachste Option für Seiten auf oberster Ebene die manuelle Eingabe der H1-Tags, die Sie auf jeder Seite erwarten. Geben Sie sie in den Hash ein:

%Vor%

Dann können Sie in Ihrem Erfolgsblock ein wiederkehrendes Timeout festlegen, um in einem h1 -Tag nach dem gewünschten Titel zu suchen. Wenn es angezeigt wird, wissen Sie, dass Sie die Seite rendern können:

%Vor%

Der obige Code funktioniert für mich. Aber es wird nicht funktionieren, wenn Sie die Suchergebnisse auskratzen müssen - Sie müssen ein identifizierendes Element oder einen Textabschnitt herausfinden, nach dem Sie suchen können, ohne den Titel im Voraus zu kennen.

Bearbeiten : Es sieht auch wie die neueste Version von PhantomJS aus löst jetzt ein onResourceReceived -Ereignis aus, wenn es neue Daten erhält. Ich habe mich nicht damit befasst, aber Sie könnten einen Listener an dieses Ereignis binden, um denselben Effekt zu erzielen.

    
nrabinowitz 24.06.2011, 19:29
quelle