Очистите веб-страницы в режиме реального времени с Node.js - PullRequest
65 голосов
/ 06 марта 2011

Что хорошего в том, чтобы очистить содержимое сайта с помощью Node.js.Я хотел бы создать что-то очень, очень быстрое, которое может выполнять поиск в стиле kayak.com , где один запрос отправляется на несколько разных сайтов, результаты удаляются и возвращаются клиенту по мере их поступления.становятся доступными.

Предположим, что этот скрипт должен просто предоставлять результаты в формате JSON, и мы можем обрабатывать их либо непосредственно в браузере, либо в другом веб-приложении.

Несколько отправных точек:

Использование node.js и jquery для очистки веб-сайтов

У кого-нибудь есть идеи?

Ответы [ 8 ]

24 голосов
/ 12 марта 2011

Node.io , кажется, берет торт: -)

5 голосов
/ 14 июля 2012

Все вышеперечисленные решения предполагают локальный запуск скребка.Это означает, что вы будете серьезно ограничены в производительности (из-за запуска их в последовательности или в ограниченном наборе потоков).Лучший подход, imho, - это полагаться на существующую, хотя и коммерческую сетку очистки.

Вот пример:

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

Здесь очистка выполняется удаленно и выполняется обратный вызовк вашему коду только тогда, когда результаты будут готовы (есть также возможность собирать результаты по мере их появления).

Вы можете загрузить прокси-сервер Bobik SDK на https://github.com/emirkin/bobik_javascript_sdk

2 голосов
/ 04 июня 2013

Я сам проводил исследования, и https://npmjs.org/package/wscraper может похвастаться как

веб-скребковый агент на основе cheerio.js быстрый, гибкий и экономичный реализация ядра jQuery; построен на основе request.js; вдохновленный HTTP-agent.js

Очень низкое использование (согласно npmjs.org), но стоит посмотреть всем заинтересованным сторонам.

1 голос
/ 31 мая 2016

Новый способ с использованием ES7 / Promises

Обычно, когда вы копируете, вы хотите использовать какой-то метод для

  1. Получить ресурс на веб-сервере (обычно HTML-документ)
  2. Считайте этот ресурс и работайте с ним как
    1. Структура DOM / tree и сделайте его навигационным
    2. , проанализируйте его как документ-токен с чем-то вроде SAS.

И у дерева, и у разбора токена есть свои преимущества, но дерево обычно существенно проще.Мы сделаем это.Проверьте request-обещание , вот как это работает:

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 

Это использует cheerio , который по сути является легкой серверной библиотекой jQuery-esque (которому не нужен объект окна или jsdom).

Поскольку вы используете обещания, вы также можете написать это в асинхронной функции.Это будет выглядеть синхронно, но с 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 голос
/ 25 апреля 2012

Вам не всегда нужен jQuery.Если вы, например, играете с DOM, возвращенным из jsdom, вы можете легко взять то, что вам нужно (также учитывая, что вам не нужно беспокоиться о проблемах с xbrowser.), просто говоря, что вы можете сделать это самостоятельно, в зависимости ...

0 голосов
/ 01 июля 2017

Я вижу большинство ответов на правильный путь с cheerio и т. Д., Однако, как только вы дойдете до точки, где потребуется для анализа и выполнения JavaScript (аля SPA и более), тогда проверить https://github.com/joelgriffith/navalia (я автор). Navalia создан для поддержки очистки в контексте безголового браузера, и это довольно быстро. Спасибо!

0 голосов
/ 09 июня 2014

проверить 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 голосов
/ 19 мая 2014

Это мой простой в использовании скребок общего назначения https://github.com/harish2704/html-scrapper, написанный для Node.JS. Он может извлекать информацию на основе предопределенных схем.Определение схемы включает в себя селектор CSS и функцию извлечения данных.В настоящее время он использует cheerio для разбора dom ..

...