Как ограничить область действия веб-сканера Apify первыми тремя страницами списка? - PullRequest
0 голосов
/ 23 ноября 2018

Я написал следующий веб-скребок в 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?

Я что-то испортил?

В коде вы можете увидеть, теперь закомментированную, мою предыдущую версию вышеупомянутого дополнения.


Эти страницы списка должны быть только ...

  1. Начинающий, с подразумеваемым URL "/ page / 1" (https://www.beet.tv/author/randrews)
  2. https://www.beet.tv/author/randrews/page/2
  3. 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;
 }

1 Ответ

0 голосов
/ 24 ноября 2018

Есть две опции в дополнительных настройках, которые могут помочь: Макс. Страниц на сканирование и Макс. Записей результатов.В вашем случае я бы установил максимальное количество записей результатов в 60, а затем сканер останавливается после вывода 60 страниц (из первых 3 списков)

...