2011-03-06 8 views
63

Quello che è un bene era quello di raschiare il contenuto del sito web usando Node.js. Mi piacerebbe creare qualcosa di molto, molto veloce che possa eseguire ricerche nello stile di kayak.com, in cui una query viene inviata a diversi siti diversi, i risultati vengono raschiati e restituiti al client non appena diventano disponibili.Scrape le pagine Web in tempo reale con Node.js

Supponiamo che questo script fornisca solo i risultati in formato JSON e che possiamo elaborarli direttamente nel browser o in un'altra applicazione web.

Alcuni punti di partenza:

Using node.js and jquery to scrape websites

Qualcuno ha qualche idea?

+0

Mi sento come se il tuo secondo link rispondesse alla tua stessa domanda –

+0

@sirhc - node.io sembra esattamente _ esattamente che cosa sto cercando ... grazie! – Avishai

+19

come autore di node.io Posso garantire per questo;) – chriso

risposta

24

Node.io sembra prendere la torta :-)

+15

come l'autore che posso garantire per node.io;) – chriso

+2

Node.io non viene più gestito. È morto, il nome di dominio originale è stato venduto. Questa risposta non è attuale. –

1

Non sempre bisogno di jQuery. Se giochi con il DOM restituito da jsdom, ad esempio, puoi facilmente prendere ciò che ti serve (anche considerando che non devi preoccuparti dei problemi di xbrowser.) Vedi: https://gist.github.com/1335009 che non toglie nulla a node.io, solo dicendo che potresti essere in grado di farlo da soli a seconda ...

5

Tutte le soluzioni di cui sopra presumono di eseguire il raschietto localmente. Ciò significa che le prestazioni saranno molto limitate (a causa dell'esecuzione in sequenza o in un numero limitato di thread). Un approccio migliore, imho, è fare affidamento su una griglia esistente, anche se commerciale, che raschia.

Ecco un esempio:

var bobik = new Bobik("YOUR_AUTH_TOKEN"); 
bobik.scrape({ 
    urls: ['amazon.com', 'zynga.com', 'http://finance.google.com/', 'http://shopping.yahoo.com'], 
    queries: ["//th", "//img/@src", "return document.title", "return $('script').length", "#logo", ".logo"] 
}, function (scraped_data) { 
    if (!scraped_data) { 
    console.log("Data is unavailable"); 
    return; 
    } 
    var scraped_urls = Object.keys(scraped_data); 
    for (var url in scraped_urls) 
    console.log("Results from " + url + ": " + scraped_data[scraped_urls[url]]); 
}); 

Qui, raschiatura viene eseguita in remoto e un callback viene rilasciato al codice solo quando i risultati sono pronti (c'è anche la possibilità di raccogliere i risultati non appena saranno disponibili).

È possibile scaricare Bobik client proxy SDK a https://github.com/emirkin/bobik_javascript_sdk

2

Ho fatto la ricerca io stesso, e https://npmjs.org/package/wscraper si vanta come agente raschietto

un web basato su cheerio.js un veloce, flessibile e snella implementazione di core jQuery; costruito su request.js; ispirato http-agent.js

molto basso utilizzo (secondo npmjs.org), ma merita una visita per tutte le parti interessate.

0

È il mio scrapper generico facile da usare https://github.com/harish2704/html-scrapper scritto per Node.JS È in grado di estrarre informazioni basate su schemi predefiniti. Una defnizione dello schema include un selettore css e una funzione di estrazione dei dati. Attualmente sta usando cheerio per l'analisi dei dom ..

1

Il nuovo modo utilizzando ES7/promesse

Di solito quando si sta raschiando che si desidera utilizzare un metodo per

  1. Prendi la risorsa sul server web (documento html di solito)
  2. Leggi questa risorsa e lavora con esso come
    1. Una struttura ad albero/DOM e renderlo navigabile
    2. analizzarlo come documento-token con qualcosa come SAS.

Sia albero, e token-analisi hanno vantaggi, ma l'albero è solito sostanzialmente più semplice. Lo faremo. Scopri request-promise, ecco come funziona:

const rp = require('request-promise'); 
const cheerio = require('cheerio'); // Basically jQuery for node.js 

const options = { 
    uri: 'http://www.google.com', 
    transform: function (body) { 
     return cheerio.load(body); 
    } 
}; 

rp(options) 
    .then(function ($) { 
     // Process html like you would with jQuery... 
    }) 
    .catch(function (err) { 
     // Crawling failed or Cheerio 

Questo sta usando cheerio che è essenzialmente un leggero lato server libreria jQuery-esque (che non ha bisogno di un oggetto finestra, o jsdom).

Poiché si utilizzano promesse, è anche possibile scrivere in una funzione asincrona. Sembrerà sincrono, ma sarà asincrono con ES7:

async function parseDocument() { 
    let $; 
    try { 
     $ = await rp(options); 
    } catch (err) { console.error(err); } 

    console.log($('title').text()); // prints just the text in the <title> 
} 
0

vedo più risponde la strada giusta con cheerio e così via, ma una volta che si arriva al punto in cui si necessità per analizzare e esegui JavaScript (ala SPA's e altro), quindi verificherei https://github.com/joelgriffith/navalia (sono l'autore). Navalia è stato progettato per supportare la raschiatura in un contesto browser senza testa, ed è piuttosto veloce. Grazie!