web-dev-qa-db-fra.com

Grattez les pages Web en temps réel avec Node.js

Ce qui était bien, c'était de gratter le contenu du site Web en utilisant Node.js. J'aimerais construire quelque chose de très, très rapide qui peut exécuter des recherches dans le style de kayak.com , où une requête est envoyée à plusieurs sites différents, les résultats sont grattés et retournés au client sous la forme ils deviennent disponibles.

Supposons que ce script devrait simplement fournir les résultats au format JSON, et nous pouvons les traiter directement dans le navigateur ou dans une autre application Web.

Quelques points de départ:

tilisation de node.js et jquery pour gratter les sites Web

Quelqu'un a des idées?

65
Avishai

Node.io semble prendre le gâteau :-)

24
Avishai

Toutes les solutions susmentionnées supposent l'exécution locale du racloir. Cela signifie que vos performances seront gravement limitées (en raison de leur exécution en séquence ou dans un ensemble limité de threads). Une meilleure approche, à mon humble avis, consiste à s'appuyer sur une grille de grattage existante, quoique commerciale.

Voici un exemple:

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]]);
});

Ici, le grattage est effectué à distance et un rappel est émis vers votre code uniquement lorsque les résultats sont prêts (il existe également une option pour collecter les résultats dès qu'ils sont disponibles).

Vous pouvez télécharger SDK du proxy client Bobik sur https://github.com/emirkin/bobik_javascript_sdk

5
Yevgeniy

J'ai fait des recherches moi-même, et https://npmjs.org/package/wscraper se vante comme un

un agent de grattage Web basé sur cheerio.js, une implémentation rapide, flexible et allégée du noyau jQuery; construit sur request.js; inspiré par http-agent.js

Utilisation très faible (selon npmjs.org) mais mérite le détour pour toutes les parties intéressées.

2
electblake

Vous n'avez pas toujours besoin de jQuery. Si vous jouez avec le DOM renvoyé de jsdom par exemple, vous pouvez facilement prendre ce dont vous avez besoin vous-même (en considérant également que vous n'avez pas à vous soucier des problèmes de xbrowser.) Voir: https://Gist.github.com/1335009 cela n'enlève rien à node.io, juste en disant que vous pourrez peut-être le faire vous-même en fonction ...

1
daithi44

La nouvelle façon d'utiliser ES7/promesses

Habituellement, lorsque vous grattez, vous souhaitez utiliser une méthode pour

  1. Obtenez la ressource sur le serveur Web (document html généralement)
  2. Lisez cette ressource et utilisez-la comme
    1. Une structure DOM/arborescente et la rendre navigable
    2. l'analyser en tant que document-jeton avec quelque chose comme SAS.

L'arbre et l'analyse des jetons ont tous deux des avantages, mais l'arbre est généralement sensiblement plus simple. C'est ce que nous ferons. Découvrez request-promise , voici comment cela fonctionne:

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 

Cela utilise cheerio qui est essentiellement une bibliothèque jQuery-esque légère côté serveur (qui n'a pas besoin d'un objet window ou jsdom).

Parce que vous utilisez des promesses, vous pouvez également écrire ceci dans une fonction asychronique. Il semblera synchrone, mais il sera asynchrone avec 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>
}
1
Evan Carroll

C'est mon scrapper à usage général facile à utiliser https://github.com/harish2704/html-scrapper écrit pour Node.JS Il peut extraire des informations basées sur des schémas prédéfinis. Une définition de schéma comprend un sélecteur css et une fonction d'extraction de données. Il utilise actuellement cheerio pour l'analyse syntaxique dom.

0
harish2704

consultez 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
0
user3723412

Je vois la plupart des réponses sur le bon chemin avec cheerio et ainsi de suite, mais une fois que vous arrivez au point où vous avez besoin d'analyser et d'exécuter JavaScript (ala SPA et plus), alors je vérifierais https://github.com/joelgriffith/navalia (je suis l'auteur). Navalia est conçu pour prendre en charge le grattage dans un contexte de navigateur sans tête, et c'est assez rapide. Merci!

0
browserless