2013-08-10 15 views
20

voglio per eseguire le azioni seguenti sul lato server:Raschiare una pagina web e navigare facendo clic sui pulsanti

1) Raschiare una pagina web
2) Simulare un clic su quella pagina e quindi passare alla nuova pagina.
3) raschiare la nuova pagina
4) Simulare alcuni clic del pulsante sulla nuova pagina
5) l'invio dei dati al client tramite JSON o qualcosa

Sto pensando di utilizzarlo con Node.js .

Ma sono confuso su quale modulo devo usare per
a) Zombie
b) Node.io
c) Phantomjs
d) JSDOM
e) Tutto il resto nodo

Ho installato , io, ma non sono in grado di eseguirlo tramite prompt dei comandi.

PS: Sto lavorando in Windows 2008 Server

risposta

30

Zombie.js e Node.io funzionano su JSDOM, quindi le tue opzioni vanno con JSDOM (o qualsiasi altro wrapper equivalente), un browser senza testa (PhantomJS, SlimerJS) o Cheerio.

  • JSDOM è piuttosto lento perché deve ricreare DOM e CSSOM in Node.js.
  • PhantomJS/SlimerJS sono veri browser headless, quindi le prestazioni sono ok e anche quelle molto affidabili.
  • Cheerio è un'alternativa leggera a JSDOM. Non ricrea l'intera pagina in Node.js (scarica e analizza solo il DOM - non viene eseguito javascript). Pertanto non è possibile fare clic su pulsanti/collegamenti, ma è molto veloce per raschiare le pagine Web.

Considerate le vostre esigenze, probabilmente andrei con qualcosa come un browser senza testa. In particolare, sceglierei CasperJS perché ha un'API piacevole ed espressiva, è veloce e affidabile (non ha bisogno di reinventare la ruota su come analizzare e renderizzare dom o css come fa JSDOM) ed è molto facile interagire con elementi come pulsanti e collegamenti.

Il flusso di lavoro in CasperJS dovrebbe apparire più o meno così:

casper.start(); 

casper 
    .then(function(){ 
    console.log("Start:"); 
    }) 
    .thenOpen("https://www.domain.com/page1") 
    .then(function(){ 
    // scrape something 
    this.echo(this.getHTML('h1#foobar')); 
    }) 
    .thenClick("#button1") 
    .then(function(){ 
    // scrape something else 
    this.echo(this.getHTML('h2#foobar')); 
    }) 
    .thenClick("#button2") 
    thenOpen("http://myserver.com", { 
    method: "post", 
    data: { 
     my: 'data', 
    } 
    }, function() { 
     this.echo("data sent back to the server") 
    }); 

casper.run(); 
+0

Anche ciò che è la sua opinione sull'utilizzo di zombie' – user2129794

+0

Nella mia esperienza Zombie non è affidabile come PhantomJS o CasperJS.A volte il flusso viene interrotto da anomalie molto strane e non riesco a capire quando utilizzare pulsanti, clic, collegamenti, ecc. Per navigare nella pagina. Tuttavia, è bello avere il nodo che esegue lo scraping e non un processo esterno. Immagino che dipenda davvero dalla tua applicazione. Se si può aggirare il fatto che un servizio esterno sta facendo lo scraping, andare con il browser headless. – danielepolencic

2

I moduli che hai elencato effettuare le seguenti operazioni:

  • Phantomjs/Zombie - simulare del browser (senza testa - nulla viene effettivamente visualizzato). Può essere usato per raschiare statico o dinamico. O test delle tue pagine html.
  • Node.io/jsdom - webscraping: estrazione di dati dalla pagina (statica).

Osservando le vostre esigenze, potreste usare il fantasma o lo zombi.