Domanda

Si prega di consigliare come raschiare le pagine AJAX.

È stato utile?

Soluzione

Descrizione:

Tutto lo scraping dello schermo richiede innanzitutto una revisione manuale della pagina da cui si desidera estrarre risorse. Quando si ha a che fare con AJAX, di solito è sufficiente analizzare un po 'più di un semplice codice HTML.

Quando si ha a che fare con AJAX, ciò significa solo che il valore desiderato non è nel documento HTML iniziale richiesto, ma che verrà eseguito javascript che richiede al server le informazioni aggiuntive desiderate.

Di solito puoi quindi semplicemente analizzare il javascript e vedere quale richiesta fa il javascript e chiamare questo URL invece dall'inizio.


Esempio:

Prendi questo come esempio, supponi che la pagina da cui vuoi raschiare abbia il seguente script:

<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>

Quindi, invece, devi solo fare una richiesta HTTP a time.asp dello stesso server. Esempio da w3schools .


Scraping avanzato con C ++:

Per un uso complesso e se stai usando C ++ potresti anche considerare di usare il motore javascript di firefox SpiderMonkey per eseguire il javascript su una pagina.

Scraping avanzato con Java:

Per un uso complesso e se stai usando Java potresti anche considerare di usare il motore javascript di firefox per Java Rhino

Scraping avanzato con .NET:

Per un utilizzo complesso e se si utilizza .Net, è possibile prendere in considerazione l'utilizzo dell'assembly Microsoft.vsa. Recentemente sostituito con ICodeCompiler / CodeDOM.

Altri suggerimenti

A mio avviso, la soluzione più semplice è utilizzare Casperjs , un framework basato sui phantomjs del browser senza testa di WebKit.

L'intera pagina viene caricata ed è molto semplice raschiare qualsiasi dato relativo a Ajax. Puoi consultare questo tutorial di base per imparare Automatizzare & amp; Scraping con PhantomJS e CasperJS

Puoi anche dare un'occhiata a questo codice di esempio, su come raschiare google suggerisce parole chiave:

/*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();
});

Se puoi ottenerlo, prova a esaminare l'albero DOM. Selenium fa questo come parte del test di una pagina. Ha anche funzioni per fare clic sui pulsanti e seguire i collegamenti, il che può essere utile.

Il modo migliore per raschiare pagine Web usando Ajax o in generale pagine usando Javascript è con un browser stesso o un browser senza testa (un browser senza GUI). Attualmente phantomjs è un browser senza testa ben promosso che utilizza WebKit. Un'alternativa che ho usato con successo è HtmlUnit (in Java o .NET tramite IKVM , che è un browser simulato. Un'altra alternativa nota è l'utilizzo di uno strumento di automazione web come Selenio .

Ho scritto molti articoli su questo argomento come web scraping Ajax e Javascript siti e autenticazione OAuth senza browser automatizzata per Twitter . Alla fine del primo articolo ci sono molte risorse extra che ho compilato dal 2011.

Dipende dalla pagina Ajax. La prima parte del raschiamento dello schermo è determinare come funziona la pagina. Esiste una sorta di variabile che puoi scorrere per richiedere tutti i dati dalla pagina? Personalmente ho usato Web Scraper Plus per molte attività correlate alla raschiatura dello schermo perché è economico, non difficile per iniziare, i non programmatori possono farlo funzionare relativamente rapidamente.

Nota a margine: i Termini d'uso sono probabilmente da qualche parte che potresti voler controllare prima di farlo. A seconda del sito che scorre attraverso tutto ciò può sollevare alcune bandiere.

Mi piace PhearJS , ma ciò potrebbe essere parzialmente dovuto al fatto che l'ho costruito.

Detto questo, è un servizio che esegui in background che parla HTTP (S) e rende le pagine come JSON per te, inclusi tutti i metadati di cui potresti aver bisogno.

Come soluzione a basso costo puoi anche provare SWExplorerAutomation (SWEA). Il programma crea un'API di automazione per qualsiasi applicazione Web sviluppata con HTML, DHTML o AJAX.

Penso che la risposta di Brian R. Bondy sia utile quando il codice sorgente è facile da leggere. Preferisco un modo semplice utilizzando strumenti come Wireshark o HttpAnalyzer per catturare il pacchetto e ottenere l'URL dall''host '" e il campo " GET " campo.

Ad esempio, acquisisco un pacchetto come il seguente:

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

Quindi l'URL è:

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

Selenium WebDriver è una buona soluzione: si programma un browser e si automatizza ciò che deve essere fatto nel browser. I browser (Chrome, Firefox, ecc.) Forniscono i propri driver che funzionano con Selenium. Dal momento che funziona come un browser REALE automatizzato, le pagine (compresi javascript e Ajax) vengono caricate come fanno con un essere umano che utilizza quel browser.

Il rovescio della medaglia è che è lento (dal momento che molto probabilmente ti piacerebbe attendere il caricamento di tutte le immagini e gli script prima di eseguire lo scraping su quella singola pagina).

In precedenza mi sono collegato al solvente del MIT e a EnvJS come risposte per raschiare le pagine dell'Ajax. Questi progetti non sembrano più accessibili.

Per pura necessità, ho inventato un altro modo per eliminare effettivamente le pagine Ajax, e ha funzionato per siti difficili come findthcompany che hanno metodi per trovare motori javascript senza testa e non mostrare dati.

La tecnica consiste nell'utilizzare le estensioni di Chrome per eseguire lo scraping. Le estensioni di Chrome sono il posto migliore per eliminare le pagine Ajax perché in realtà ci consentono l'accesso al DOM modificato javascript. La tecnica è la seguente, certamente aprirò il codice tra qualche tempo. Crea un'estensione di Chrome (supponendo che tu sappia come crearne una, la sua architettura e le sue capacità. È facile da imparare ed esercitarsi in quanto ci sono molti esempi),

  1. Usa gli script di contenuto per accedere al DOM, usando xpath. Praticamente ottiene l'intero elenco o tabella o il contenuto reso dinamicamente usando xpath in una variabile come nodi HTML stringa. (Solo gli script di contenuto possono accedere a DOM ma non possono contattare un URL utilizzando XMLHTTP)
  2. Dallo script di contenuto, usando il passaggio di messaggi, invia l'intero DOM rimosso come stringa a uno script in background. (Gli script in background possono comunicare con URL ma non possono toccare il DOM). Usiamo il passaggio di messaggi per farli parlare.
  3. Puoi utilizzare vari eventi per scorrere le pagine Web e passare ogni contenuto del nodo HTML rimosso allo script in background.
  4. Ora usa lo script in background, per parlare con un server esterno (su localhost), uno semplice creato usando Nodejs / python. Basta inviare tutti i nodi HTML come stringa, al server, dove il server dovrebbe semplicemente mantenere il contenuto inviato ad esso, in file, con le variabili appropriate per identificare i numeri di pagina o gli URL.
  5. Ora hai raschiato il contenuto AJAX (nodi HTML come stringa), ma questi sono nodi html parziali. Ora puoi usare la tua libreria XPATH preferita per caricarli in memoria e usare XPATH per racimolare informazioni in tabelle o testo.

Per favore, commenta se non puoi capire e posso scriverlo meglio. ( primo tentativo ). Inoltre, sto cercando di rilasciare il codice di esempio il più presto possibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top