Node Cheerio для очистки всего сайта

Кто-нибудь использовал Node Cheerio для очистки всего сайта, а не только домашней / первой страницы, на которую указывает парсер?

В данный момент я делаю следующее, что очищает только целевую страницу.

request('http://arandomsite.com/', function (error, response, html) {
    if (!error && response.statusCode == 200){
        var $ = cheerio.load(html);
            ...
            ...
            ...
};

person leaksterrr    schedule 26.11.2013    source источник


Ответы (1)


Я никогда не использовал Cheerio, но могу предположить (как и в случае с другими парсерами), что он будет работать только с той страницей, на которую вы его укажете. Предполагая, что cheerio.load возвращает jquery, например API, вам, вероятно, придется сделать что-то вроде

$('a').each(function(index, a) {
    //TODO: You may want to keep track here of which you have done, and not redo any.
    request('http://arandomsite.com' + a.attr('href'), myPageProcessFunction);
});

Очевидно, вам нужно будет добавить такие вещи, как iframes, чтобы убедиться, что вы получите полный результат.

Чтобы уточнить, вот обновленный код:

request('http://arandomsite.com/', function responseFunction(error, response, html) {
if (!error && response.statusCode == 200){
    var $ = cheerio.load(html);
    $('a').each(function(index, a) {
        request('http://arandomsite.com' + a.attr('href'), responseFunction);
    });
};
});
person major-mann    schedule 26.11.2013
comment
Единственная проблема заключается в том, что функция запроса находится непосредственно под переменными зависимостей моего узла, и поэтому единственная проблема, которую я вижу, заключается в том, что обертывание запроса в $('a').each(function(index, a) { }; приведет к тому, что $ is undefined. - person leaksterrr; 26.11.2013
comment
Я не имею в виду упаковку запроса. Этот код должен быть внутри запроса после загрузки $. Когда я говорю запрос вызова для каждой ссылки, я имею в виду сделать новый вызов запроса и передать текущую функцию в качестве результата обратного вызова. - person major-mann; 27.11.2013
comment
Я вижу вашу логику и спасибо за обновленный код, это имеет смысл. Единственная проблема, которой у меня нет, заключается в том, что он говорит, что у a нет метода «attr»? Вот ссылка на пасти с полным кодом, чтобы вы могли лучше понять, что именно я делаю pastie.org/private/snykxn92q23ga8srnpak3a#1,7 - person leaksterrr; 27.11.2013
comment
Я предполагаю, что он передает фактический элемент привязки. В этом случае вы должны иметь возможность перейти на a.href (вместо a.attr('href')) - person major-mann; 27.11.2013
comment
Это тоже мало что дало. Я получил это как ответ от разработчика cheerio: Вы можете создать целый блокировщик, следуя тегам ‹a› и многому другому и очищая эти страницы. - person leaksterrr; 27.11.2013
comment
Хммм... Как я уже сказал, я никогда не использовал его, но он должен быть близок к этому. Ответ разработчиков просто говорит вам делать то, над чем мы здесь работаем. Возможно, в качестве последней попытки вы можете попробовать $(a).attr('href'). - person major-mann; 27.11.2013
comment
У меня это работает с использованием a.href, однако по-прежнему кажется, что он отслеживает ссылки только с первой страницы и не сканирует весь сайт... Вы делали что-то подобное, используя другой плагин node? - person leaksterrr; 27.11.2013