Сканирование с помощью Node.js

Завершить Node.js noob, поэтому не судите меня...

У меня есть простое требование. Сканирование веб-сайта, поиск всех страниц продукта и сохранение некоторых данных на страницах продукта.

Проще говоря, тогда это сделано.

Глядя на образцы Node.js, я не могу найти что-то подобное.

Есть скребок запроса:

request({uri:'http://www.google.com'}, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var window = jsdom.jsdom(body).createWindow();
    jsdom.jQueryify(window, 'path/to/jquery.js', function (window, jquery) {
      // jQuery is now loaded on the jsdom window created from 'body'
      jQuery('.someClass').each(function () { /* Your custom logic */ });
    });
  }
});

Но я не могу понять, как называть его сам, если он удаляет корневую страницу или заполняет массив или URL-адрес, который нужно очистить.

Тогда существует способ http-агента:

var agent = httpAgent.create('www.google.com', ['finance', 'news', 'images']);

agent.addListener('next', function (err, agent) {
  var window = jsdom.jsdom(agent.body).createWindow();
  jsdom.jQueryify(window, 'path/to/jquery.js', function (window, jquery) {
    // jQuery is now loaded on the jsdom window created from 'agent.body'
    jquery('.someClass').each(function () { /* Your Custom Logic */ });

    agent.next();
  });
});

agent.addListener('stop', function (agent) {
  sys.puts('the agent has stopped');
});

agent.start();

Что берет массив местоположений, но опять же, как только вы начинаете его с массива, вы не можете добавлять к нему дополнительные места, чтобы просматривать все страницы продуктов.

И я не могу даже получить работу Apricot, по какой-то причине я получаю сообщение об ошибке.

Итак, как мне изменить любой из приведенных выше примеров (или что-то еще не перечисленное выше), чтобы очистить сайт, найти все страницы продукта, найти там некоторые данные (пример jquery.someclass должен сделать трюк) и что сохранить это в db?

Спасибо!

Ответ 1

Лично я использую Node IO для очистки некоторых веб-сайтов. https://github.com/chriso/node.io

Подробнее о скребке можно найти в wiki!


Ответ 2

У меня был неплохой успех, обход и соскабливание с помощью Casperjs. Это довольно красивая библиотека, построенная поверх Phantomjs. Мне это нравится, потому что это довольно лаконично. Обратные вызовы могут быть выполнены как foo.then(), которые очень просто понять, и я даже могу использовать jQuery, поскольку Phantomjs является реализацией webkit. Например, следующее будет создавать экземпляр Каспера и нажимать все ссылки на странице архива на массив под названием "ссылки".

var casper = require("casper").create();

var numberOfLinks = 0;
var currentLink = 0;
var links = [];
var buildPage, capture, selectLink, grabContent, writeContent;

casper.start("http://www.yoursitehere.com/page_to/scrape/", function() {
    numberOfLinks = this.evaluate(function() {
        return __utils__.findAll('.nav-selector a').length;
    });
    this.echo(numberOfLinks + " items found");

    // cause jquery makes it easier
    casper.page.injectJs('/PATH/TO/jquery.js');
});


// Capture links
capture = function() {
    links = this.evaluate(function() {
        var link = [];
        jQuery('.nav-selector a').each(function() {
            link.push($(this).attr('href'));
        });
        return link;
    });
    this.then(selectLink);
};

Затем вы можете использовать node fs (или что-то еще, что вам нужно, действительно), чтобы подталкивать ваши данные в XML, CSV или что угодно. Пример для соскабливания фотографий BBC был исключительно полезен, когда я построил свой скребок.

Это вид с 10 000 футов, что может сделать игрок. Он обладает очень мощным и широким API. Я выкапываю его, если вы не можете сказать:).

Мой полный пример очистки: https://gist.github.com/imjared/5201405.