Я написал следующий веб-скребок в Apify (jQuery), но я изо всех сил стараюсь ограничить его только просмотром определенных страниц списка.
Сканер соскребает статьи, которые я опубликовална https://www.beet.tv/author/randrews, страница, которая содержит 102 страницы индекса с разбивкой по страницам, каждая из которых содержит 20 ссылок на статьи.Сканер работает нормально при выполнении вручную и полностью;он получает все, более 2000 статей.
Однако я хочу использовать Планировщик Apify для запуска случайного сканирования, при котором только удаляет статьи из первых трех из этих индексов (LIST)страницы (т. е. 60 статей).
Планировщик использует cron и позволяет передавать настройки через вход Json.В соответствии с рекомендациями, я использую «customData» ...
{
"customData": 3
}
... и затем ниже, чтобы взять это значение и использовать его для ограничения ...
var maxListDepth = parseInt(context.customData); // Jakub's suggestion, Nov 20 2018
if(!maxListDepth || (maxListDepth && pageNumber <= maxListDepth)) {
context.enqueuePage({
Этодолжен позволять сценарию ограничивать область при выполнении через планировщик, но продолжать в обычном режиме и получать все полностью при выполнении вручную.
Однако, хотя планировщик успешно запускает сканер - сканерпо-прежнему пробегает весь набор снова ;в /page/3.
она не ограничена * Как я могу убедиться, что я получаю только первые три страницы до / page / 3?
Я что-то испортил?
В коде вы можете увидеть, теперь закомментированную, мою предыдущую версию вышеупомянутого дополнения.
Эти страницы списка должны быть только ...
- Начинающий, с подразумеваемым URL "/ page / 1" (https://www.beet.tv/author/randrews)
- https://www.beet.tv/author/randrews/page/2
- https://www.beet.tv/author/randrews/page/3
... ине такие, как / page / 101 или / page / 102, которые могут всплыть.
Вот ключевые термины ...
START https://www.beet.tv/author/randrews
LIST https://www.beet.tv/author/randrews/page/[\d+]
DETAIL https://www.beet.tv/*
Clickable elements a.page-numbers
А вот скрипт сканера...
function pageFunction(context) {
// Called on every page the crawler visits, use it to extract data from it
var $ = context.jQuery;
// If page is START or a LIST,
if (context.request.label === 'START' || context.request.label === 'LIST') {
context.skipOutput();
// First, gather LIST page
$('a.page-numbers').each(function() {
// lines added to accept number of pages via customData in Scheduler...
var pageNumber = parseInt($(this).text());
// var maxListDepth = context.customData;
var maxListDepth = parseInt(context.customData); // Jakub's suggestion, Nov 20 2018
if(!maxListDepth || (maxListDepth && pageNumber <= maxListDepth)) {
context.enqueuePage({
url: /*window.location.origin +*/ $(this).attr('href'),
label: 'LIST'
});
}
});
// Then, gather every DETAIL page
$('h3>a').each(function(){
context.enqueuePage({
url: /*window.location.origin +*/ $(this).attr('href'),
label: 'DETAIL'
});
});
// If page is actually a DETAIL target page
} else if (context.request.label === 'DETAIL') {
/* context.skipLinks(); */
var categories = [];
$('span.cat-links a').each( function() {
categories.push($(this).text());
});
var tags = [];
$('span.tags-links a').each( function() {
tags.push($(this).text());
});
result = {
"title": $('h1').text(),
"entry": $('div.entry-content').html().trim(),
"datestamp": $('time').attr('datetime'),
"photo": $('meta[name="twitter:image"]').attr("content"),
categories: categories,
tags: tags
};
}
return result;
}