Frage

Bitte raten, wie AJAX Seiten zu kratzen.

War es hilfreich?

Lösung

Überblick:

Alle Bildschirm erfordert Schaben erste manuelle Überprüfung der Seite, die Sie Ressourcen extrahieren möchten. Wenn es mit AJAX zu tun in der Regel brauchen Sie nur ein bisschen mehr als nur einfach die HTML zu analysieren.

Wenn Sie mit AJAX zu tun dies bedeutet nur, dass der Wert, den Sie wollen, ist nicht in dem ursprünglichen HTML-Dokument, das Sie angefordert, aber das Javascript wird exectued werden, die den Server für die zusätzliche Informationen fragen Sie wollen.

Sie können daher in der Regel einfach die Javascript analysieren und sehen, welche die Javascript-Marken anfordern und rufen Sie einfach diese URL anstelle von Anfang an.


Beispiel:

Nehmen Sie dies als ein Beispiel sei angenommen, die Seite, die Sie hat das folgende Skript kratzen wollen:

<script type="text/javascript">
function ajaxFunction()
{
var xmlHttp;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    try
      {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    catch (e)
      {
      alert("Your browser does not support AJAX!");
      return false;
      }
    }
  }
  xmlHttp.onreadystatechange=function()
    {
    if(xmlHttp.readyState==4)
      {
      document.myForm.time.value=xmlHttp.responseText;
      }
    }
  xmlHttp.open("GET","time.asp",true);
  xmlHttp.send(null);
  }
</script>

Dann alles, was Sie tun müssen, ist stattdessen eine HTTP-Anfrage an time.asp von demselben Server stattdessen zu tun. Beispiel von w3schools .


Erweiterte Schaben mit C ++:

Für komplexe Nutzung, und wenn Sie mit C ++ können Sie auch prüfen, mit der Firefox-JavaScript-Engine Spider JavaScript auf einer Seite auszuführen.

Erweitert mit Java Schaben:

Für komplexe Nutzung, und wenn Sie Java verwenden Sie könnte auch prüfen, die Firefox mit Javascript-Engine für Java Rhino

Erweitert mit .NET Schaben:

Für komplexe Nutzung, und wenn Sie mit .Net Sie auch mit der Microsoft.vsa Montage in Erwägung ziehen könnten. Kürzlich ersetzt mit ICodeCompiler / CodeDOM.

Andere Tipps

Meiner Meinung nach die einfachste Lösung ist die Verwendung Casperjs , einen Rahmen auf der Basis der WebKit-Browser ohne Kopf PhantomJS.

Die ganze Seite geladen wird, und es ist sehr einfach alle Ajax-bezogenen Daten zu kratzen. Sie können diese grundlegenden Tutorial überprüfen Automatisieren & Scraping mit PhantomJS und CasperJS

lernen

Sie können auch einen Blick auf dieses Beispiel-Code geben, wie zu kratzen Google Schlüsselwörter schlägt vor:

/*global casper:true*/
var casper = require('casper').create();
var suggestions = [];
var word = casper.cli.get(0);

if (!word) {
    casper.echo('please provide a word').exit(1);
}

casper.start('http://www.google.com/', function() {
    this.sendKeys('input[name=q]', word);
});

casper.waitFor(function() {
  return this.fetchText('.gsq_a table span').indexOf(word) === 0
}, function() {
  suggestions = this.evaluate(function() {
      var nodes = document.querySelectorAll('.gsq_a table span');
      return [].map.call(nodes, function(node){
          return node.textContent;
      });
  });
});

casper.run(function() {
  this.echo(suggestions.join('\n')).exit();
});

Wenn Sie es bekommen können, versuchen Sie den DOM-Baum zu untersuchen. Selen tut dies als Teil einer Seite zu testen. Es hat auch Funktionen Schaltflächen klicken und folgen Sie Links, die nützlich sein können.

Die beste Art und Weise Webseiten mit Ajax oder allgemein Seiten mit Javascript zu kratzen ist mit einem Browser selbst oder einem Headless Browser (Browser ohne GUI). Derzeit PhantomJS ist ein gut gefördert kopflos Browser WebKit verwenden. Eine Alternative, die ich mit Erfolg verwendet wird, ist Htmlunit (in Java oder .NET über IKVM , die ein simuliertes Browser ist. eine weitere bekannte Alternative ist, ein Web-Automatisierungs-Tool wie Selenium .

Ich schrieb viele Artikel zu diesem Thema wie Web-Scraping Ajax und Javascript Websites und automatisierte browserloser OAuth-Authentifizierung für Twitter . Am Ende des ersten Artikels gibt es eine Menge von zusätzlichen Ressourcen, die ich seit 2011 wurde kompilieren.

Abhängig von der Ajax-Seite. Der erste Teil des Screen Scraping ist die Bestimmung, wie die Seite funktioniert. Gibt es irgendeine Art von Variablen, die Sie durch laufen können alle Daten von der Seite anzufordern? Persönlich habe ich Web Scraper Plus- für viele Screen Scraping verwandte Aufgaben verwendet, weil es billig ist, nicht schwer zu beginnen, nicht-Programmierer kann es arbeitet relativ schnell.

Side Hinweis: Nutzungsbedingungen ist wahrscheinlich irgendwo könnten Sie, bevor Sie dies überprüfen möchten. Je nach Standort durch alles laufen kann einige Fahnen erhöhen.

Ich mag PhearJS , aber das ist vielleicht zum Teil, weil ich es gebaut.

Das heißt, es ist eine Dienstleistung, die Sie im Hintergrund ausgeführt werden, die HTTP spricht (S) und rendert Seiten als JSON für Sie, einschließlich Metadaten, die Sie benötigen.

Als kostengünstige Lösung können Sie auch versuchen, SWExplorerAutomation (SWEA). Das Programm erstellt eine Automatisierung API für jede Web-Anwendung mit HTML, DHTML oder AJAX entwickelt.

ich denke, Brian R. Bondy Antwort nützlich ist, wenn der Quellcode ist leicht zu lesen. Ich ziehe es eine einfache Möglichkeit, die Verwendung von Tools wie Wireshark oder HttpAnalyzer das Paket zu erfassen und die URL aus dem Feld „Host“ und „GET“ Feld bekommen.

Zum Beispiel habe ich erfassen ein Paket wie folgt aus:

GET /hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330 
 HTTP/1.1
Accept: */*
Referer: http://quote.hexun.com/stock/default.aspx
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: quote.tool.hexun.com
Connection: Keep-Alive

Dann wird die URL lautet:

http://quote.tool.hexun.com/hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330

Selen WebDriver ist eine gute Lösung: Sie programmieren einen Browser und Sie automatisieren, was im Browser getan werden muss. Browser (Chrome, Firefox, etc.) bieten ihre eigenen Treiber, die mit Selenium arbeiten. Da es als automatisierte REAL Browser funktioniert , die Seiten (einschließlich JavaScript und Ajax) geladen werden, da sie mit einem Menschen zu tun, dass Browser.

Der Nachteil ist, dass es langsam ist (da Sie höchstwahrscheinlich für alle Bilder und Skripte warten möchten zu laden, bevor Sie auf dieser einzelnen Seite Ihrer Schaben tun).

ich vorher zu MIT-Lösungsmittel und EnvJS als meine Antworten verknüpft Ajax Seiten abkratzen. Diese Projekte scheinen nicht mehr erreichbar.

Aus purer Notwendigkeit, ich habe einen anderen Weg erfunden, um tatsächlich abkratzen Ajax-Seiten, und es hat sich für den harten Seiten wie findthecompany gearbeitet, welche Methoden haben kopflos Javascript-Motoren zu finden und zeigen keine Daten.

Die Technik ist Chrome-Erweiterungen zu verwenden zu tun kratzen. Chrome-Erweiterungen sind der beste Ort, um abkratzen Ajax-Seiten, weil sie uns tatsächlich erlauben den Zugriff auf JavaScript-DOM geändert. Die Technik wird wie folgt, werde ich den Code in irgendwann sicherlich Open Source. Erstellen Sie eine Chrome-Erweiterung (vorausgesetzt, Sie wissen, wie man erstellen, und seine Architektur und Fähigkeiten. Dies ist leicht zu erlernen und zu üben, da es viele Proben),

  1. Verwenden Sie Content-Skripte auf das DOM zugreifen, indem mithilfe von XPath. Ziemlich bekommen viel die gesamte Liste oder Tabelle oder dynamisch gerenderten Inhalt XPath in eine Variable als String HTML-Knoten verwenden. (Nur Content-Skripte können DOM zugreifen, aber sie können keine URL kontaktieren XMLHTTP verwenden)
  2. Content-Skript, Message Passing Verwendung Nachricht die gesamte gestrippt DOM als String, zu einem Hintergrundskript. (Hintergrund-Skripte können auf URLs sprechen, aber das DOM nicht berühren). Wir verwenden Botschaft zu vorbeifahr zu sprechen.
  3. Sie kann verschiedene Ereignisse Schleife durch Webseiten verwenden und jeden gestrippt HTML Knoten Inhalt in dem Hintergrund Skript übergeben.
  4. verwenden Sie nun das Hintergrundskript, auf einen externen Server (auf localhost), ein einfaches zu sprechen erstellt NodeJS / Python verwenden. Senden Sie einfach den gesamten HTML-Knoten als String an den Server, wobei der Server nur den Inhalt, um es geschrieben bestehen würde, in Dateien mit entsprechenden Variablen Seitenzahlen oder URLs zu identifizieren.
  5. Sie haben nun abgeschabt AJAX Inhalte (HTML-Knoten als String), aber diese sind teilweise HTML-Knoten. Jetzt können Sie Ihre Lieblings-XPath-Bibliothek verwenden, diese in dem Speicher zu laden und XPath verwenden, um Informationen in Tabellen oder Text zu kratzen.

Bitte kommentieren, wenn Sie kann nicht verstehen, und ich kann es besser schreiben. ( erster Versuch ). Auch ich versuche, Beispielcode so schnell wie möglich zu lösen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top