Raschia le pagine Web in tempo reale con Node.js

L’aspetto positivo è stato quello di analizzare il contenuto del sito Web utilizzando Node.js. Mi piacerebbe creare qualcosa di molto, molto veloce che possa eseguire ricerche nello stile di kayak.com , dove una query viene inviata a diversi siti, i risultati vengono raschiati e restituiti al client non appena diventano disponibili.

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

Alcuni punti di partenza:

Utilizzando node.js e jquery per raschiare i siti web

Qualcuno ha qualche idea?

Node.io sembra prendere la torta 🙂

Tutte le soluzioni summenzionate presumibilmente eseguono 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, lo scraping viene eseguito da remoto e una callback viene rilasciata al tuo codice solo quando i risultati sono pronti (c’è anche un’opzione per raccogliere i risultati man mano che diventano disponibili).

È ansible scaricare l’SDK client Bobik client all’indirizzo https://github.com/emirkin/bobik_javascript_sdk

Ho fatto ricerche da solo, e https://npmjs.org/package/wscraper si vanta come a

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

Uso molto basso (secondo npmjs.org), ma vale la pena dare un’occhiata a tutte le parti interessate.

Non hai 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 node.io affatto, solo dicendo che potresti essere in grado di farlo da te a seconda …

Il nuovo modo di utilizzare ES7 / promette

Di solito quando stai raschiando vuoi usare un metodo per

  1. Ottieni la risorsa sul server web (di solito il documento html)
  2. Leggi quella risorsa e lavora con essa come
    1. Una struttura DOM / albero e renderla navigabile
    2. analizzalo come documento-token con qualcosa come SAS.

Sia l’albero che l’analisi dei token hanno vantaggi, ma l’albero di solito è sostanzialmente più semplice. Lo faremo. Controlla la richiesta-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 una libreria jQuery-esque lato server (che non ha bisogno di un object window, o jsdom).

Poiché stai usando promesse, puoi anche scrivere questo 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  } 

È il mio scrapper general purpose facile da usare https://github.com/harish2704/html-scrapper scritto per Node.JS Può estrarre informazioni basate su schemi predefiniti. Una defnizione dello schema include un selettore di CSS e una funzione di estrazione dei dati. Attualmente sta usando cheerio per dom analizzando ..

controlla https://github.com/rc0x03/node-promise-parser

 Fast: uses libxml C bindings Lightweight: no dependencies like jQuery, cheerio, or jsdom Clean: promise based interface- no more nested callbacks Flexible: supports both CSS and XPath selectors 

Vedo la maggior parte delle risposte sulla strada giusta con cheerio e così via, tuttavia una volta arrivato al punto in cui è necessario analizzare ed eseguire 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!