Ich versuche, die Originalquelle für eine bestimmte Webseite zu erhalten.
Die Seite führt einige Skripte aus, die das DOM beim Laden verändern. Ich möchte die Quelle erhalten, bevor irgendein Skript oder Benutzer irgendein Objekt im Dokument ändert.
Mit Chrome oder Firefox (und wahrscheinlich den meisten Browsern) kann ich entweder das DOM (Debug-Dienstprogramm F12) betrachten oder die ursprüngliche Quelle ansehen (Rechtsklick, Quelltext anzeigen) . Letzteres möchte ich erreichen.
Ist das möglich mit phantomjs / casperjs?
Bevor ich auf die Seite gehe, muss ich mich einloggen. Das funktioniert gut mit casperjs. Wenn ich auf die Seite blättern und die Ergebnisse rendern weiß, bin ich auf der richtigen Seite.
%Vor% Ich habe versucht, this.download(url, 'a.html')
, aber es scheint nicht den gleichen Kontext zu teilen, da es HTML zurückgibt, als ob ich nicht angemeldet wäre, auch wenn ich mit Cookies casperjs test.casper.js --cookies-file=cookies.txt
.
Ich glaube, ich sollte diese Option weiter analysieren.
Ich habe auch versucht, casper.open('view-source:url')
anstelle von casper.open('http://url')
, aber es scheint, dass es die URL nicht erkennt, da ich nur eine leere Seite bekomme.
Ich habe mir die rohe HTTP-Antwort angesehen, die ich vom Server mit einem Dienstprogramm erhalte, und der Hauptteil dieser Nachricht (das ist HTML) ist was ich brauche, aber wenn die Seite im Browser geladen wird, wurde das DOM bereits modifiziert .
Ich habe es versucht:
%Vor% Aber das response
-Objekt enthält nur die Header und einige andere Informationen, aber nicht den Body.
Ich habe es auch mit dem Event onResourceRequested versucht.
Die Idee besteht darin, den Download von Ressourcen, die von einer bestimmten Webseite (dem Referer) benötigt werden, abzubrechen.
%Vor%Leider scheint das Skript, das das DOM verändert, anfänglich in der Haupt-HTML-Seite zu liegen (oder dieser Code tut nicht, was ich tun möchte).
¿Irgendwelche Ideen?
Hier ist der vollständige Code:
%Vor%Hum, hast du versucht, ein paar Events zu benutzen? Zum Beispiel:
%Vor%Ich denke, es wird nicht funktionieren, versuchen Sie es trotzdem.
Das Problem ist: Sie können es nicht in einem normalen casperJS-Schritt tun, da die Skripte auf Ihrer Seite bereits ausgeführt werden. Es könnte funktionieren, wenn wir das On-DOM-Ready-Event binden könnten oder ein bestimmtes Casper-Event haben. Problem: Die Seite muss geladen werden, um einige js von Casper an die DOM-Umgebung zu senden. Eine Bindung ist also nicht möglich (ich sehe nicht wie). Ich denke mit Phantom können wir DATA nach dem Load-Ereignis scracken, also nur wenn die Seite gerendert wird.
Wenn es also nicht möglich ist, mit den Ereignissen zu hacken und vielleicht etwas Verzögerung, ist Ihre einzige Lösung, die Skripte zu blockieren, die Ihr DOM modifizieren.
Es gibt immer noch die Option phantomJS, die Sie verwenden: in casper:
%Vor%Das Problem ist, dass Sie die js aktiviert müssen, um die Daten zurück zu bekommen, so kann es nicht funktionieren ...: p Yeah nutzlosen Kommentar! :)
Andernfalls müssen Sie die gewünschte Ressource / das gewünschte Skript sperren, die das DOM mit Ereignissen verändern.
Oder Sie können das Ereignis resource.received
verwenden, um die gewünschten Daten zu scrappen, bevor die spezifischen Ressourcen, die das DOM ändern, angezeigt werden.
Tatsächlich glaube ich nicht, dass es möglich ist, denn wenn Sie einen Schritt erstellen, der einige Daten von der Seite zurückholt, bevor spezifische Ressourcen angezeigt werden, wird die Zeit, zu der Ihr Schritt ausgeführt wird, geladen . Es wäre notwendig, die folgenden Ressourcen einzufrieren, während Ihr Schritt die Daten scrappt.
Ich weiß zwar nicht, wie es geht, aber diese Ereignisse könnten Ihnen helfen:
%Vor% Siehe auch Wie deaktivieren Sie css in CasperJS? .
Die Lösung, die funktioniert: Sie identifizieren die Skripte und blockieren sie. Aber wenn Sie sie brauchen, weiß ich nicht, es ist eine gute Frage. Vielleicht könnten wir die Ausführung eines bestimmten Skripts verzögern. Ich glaube nicht, dass Casper und Phantom das einfach erlauben. Die einzige nützliche Option ist abort()
, geben Sie uns diese Option: timeout("time -> ms")
!
Hier eine ähnliche Frage: Skript vor anderem einfügen
Wie Fanch sagte, scheint es nicht möglich zu sein. Wenn Sie zwei Anfragen bearbeiten können, wird dies einfach. Führen Sie einfach eine Anfrage mit aktiviertem JavaScript durch und eine ohne, damit Sie die Seitenquelle scrappen und vergleichen können.
%Vor% Sie können die Reihenfolge nach Ihren Bedürfnissen ändern. Wenn Sie sich bereits auf einer Seite befinden, für die Sie das ursprüngliche Markup von haben möchten, können Sie casper.getCurrentUrl()
verwenden, um die aktuelle URL zu erhalten:
In Bezug auf die Dokumente können Sie #debugPage()
verwenden, um den Inhalt des aktuelle Seite.
Grüße David
Tags und Links javascript phantomjs casperjs