Schaben mit Nokogiri und Ruby vor und nach JavaScript, ändert sich der Wert
Ich habe ein Programm, dass die Schrammen Wert von https://web.apps.markit.com/WMXAXLP?YYY2220_zJkhPN/sWPxwhzYw8K4DcqW07HfIQykbYMaXf8fTzWT6WKnuivTcM0W584u1QRwj
Mein aktuelle code:
doc = Nokogiri::HTML(open(source_url))
puts doc.css('span.indexDate').text
date = doc.css('span.indexDate').text
date = Date.parse(date)
puts date
values = doc.css('table#CdsIndexTable td.col2 span')
puts values
Diese schabt das Datum und die Werte der zweiten Spalte von "CDS-Indizes" Tabelle richtig was in Ordnung ist. Nun, ich will kratzen, die ähnliche Werte wie Sie aus der "Bond-Indizes" - Tabelle, wo ich bin mit dem problem.
Sehe ich eine JavaScript-Funktion, die änderungen, die es ohne das laden der Seite und ohne änderung des URL der Seite. Der Unterschied zwischen diesen beiden Tabellen ist Ihre IDs sind anders, das ist genau das, was es sein sollte. Aber leider wenn ich versuche mit:
values = doc.css('table#BondIndexTable')
puts values
Bekomme ich nichts von der Bond-Indizes Tabelle. Aber ich bekomme Werte aus CDS-Indizes Tabelle, wenn ich:
values = doc.css('table#CdsIndexTable')
puts values
Wie bekomme ich die Werte aus beiden Tabellen?
- Tut Nokogiri javascript-Code ausführen? Wenn es das tut, und diese "javascript-Funktionen" ajax verwenden, vielleicht cross-domain-policy blockiert Sie von Abschluss? Haben Sie versucht, so etwas wie PhantomJS?
- Nokogiri NICHT ausgeführt JavaScript.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht möchten, zu verwenden, PhantomJS Sie können auch die Netzwerk-sniffer auf Firefox oder Chrome-Entwicklungs-tools, und Sie werden sehen, dass die HTML-Tabelle Daten zurückgegeben, die mit einem javascript-POST-Anforderung an den server.
Dann anstatt zu öffnen, die original-URL der Seite mit Nokogiri, Sie würden stattdessen führen Sie diesen POSTEN von Ihrem Ruby-Skript und analysieren und interpretieren diese Daten statt. Wie es aussieht ist es nur JSON-Daten mit HTML in Sie eingebettet. Ziehen Sie die HTML-und Futtermittel, um Nokogiri.
Es erfordert ein wenig detektivische Arbeit, aber ich habe diese Methode mehrfach mit JavaScript web-Seiten und kratzen. Es funktioniert OK für die meisten einfachen Aufgaben, aber es erfordert ein wenig Graben in das Innenleben von der Seite und den Netzwerk-Verkehr.
Hier ist ein Beispiel für die JSON-Daten aus Javascript POST-request:
Anleihen:
https://web.apps.markit.com/AppsApi/GetIndexData?indexOrBond=bond&ClientCode=WSJ
CDS:
https://web.apps.markit.com/AppsApi/GetIndexData?indexOrBond=cds&ClientCode=WSJ
Hier ist die quick-and-dirty-Lösung, nur, damit Sie eine Vorstellung bekommen. Diese greifen, werden das cookie von der ersten Seite und verwenden Sie es in der Anfrage um die JSON-Daten, dann Parsen der JSON-Daten und füttern die extrahierten HTML, um Nokogiri:
Können Sie Wasserschweine mit dem Poltergeist-Treiber zum ausführen von Javascript und format der Seite. Poltergeist ist ein wrapper für die PhantomJS headless browser. Hier ist ein Beispiel, wie Sie es tun können:
Besuchen Sie hier für ein vollständiges Beispiel für die Verwendung Amazon.com:
https://github.com/wakproductions/amazon_get_price/blob/master/getprice.rb
PhantomJS ist ein headless browser mit JavaScript-API. Da müssen Sie zum ausführen des Skripts auf der Seite, die Sie Schaben, die ein browser tun, für Sie; und PhantomJS wird Ihnen erlauben, zu Bearbeiten und kratzen die Seite nach der Skript-Ausführung.