Прокрутите до нижних решений, не всегда идущих на абсолютный конец страницы

сценарий

Я читаю комментарии на странице видео YouTube, используя Puppeteer. Вызов ajax для получения дополнительных комментариев вызывается при прокрутке до абсолютного нижнего края страницы, поэтому мне нужно прокрутить страницу вниз.

проблема

Проблема в том, что я не могу; даже если я применяю прокрутку к нижнему решению, иногда он не прокручивается до конца страницы, означает, что он идет в нижнее, но не абсолютное дно, оставляя некоторый промежуток ниже, из-за которого не запускается вызов ajax

решения, которые я пробовал

  1. функция page.scroll () puppteer [failed].
  2. document.querySelector('body').scrollIntoView({block: "end"}) [не работает на страницах youtube, работает только на некоторых веб-сайтах]
  3. document.scrollingElement.scrollTop =(document.scrollingElement.scrollHeight) [время от времени не переходит в абсолютное дно]
  4. document.scrollingElement.scrollTop =(document.scrollingElement.scrollHeight) + 999999 [так же, как указано выше]
  5. window.scrollBy() & window.scrollTo()

Могло быть одно или несколько JS-решений, которые я пробовал и не смог решить проблему.

PS, так как я работаю над кукловодом, совместимость браузеров в других браузерах, таких как firefox или IE, не требуется.

javascript,html,scroll,puppeteer,

2

Ответов: 2


2

Попробуйте следовать следующим образом:

let previousHeight;
while (true) {
  try {
    previousHeight = await page.evaluate('document.body.scrollHeight')
    await page.evaluate('window.scrollTo(0, document.body.scrollHeight)')
    await page.waitForFunction(`document.body.scrollHeight > ${previousHeight}`)
    // .....
    // Something
    // .....
  } catch (e) {
    console.log('Scroll End Page')
    break
  }
}

0 принят

Вот что я сделал

Когда вы сначала загружаете страницу видеоролика youtube и прокручиваете вниз, первое, с чем вы сталкиваетесь (и последний элемент на данный момент), - это поле комментариев с селектором ytd-comments#comments, а затем, когда комментарии начинают загружаться, последний элемент комментария с селектором ytd-comment-thread-renderer.style-scope.ytd-item-section-renderer- это последний элемент на страницу (в этот момент).

Поэтому вместо прокрутки страницы (и взятия комментария из комментария @mplungjan) я прокрутил до этих элементов с помощью этого кода

var flag_a =0, flag_b=0;

const COMMENTS_SCROLL_SELECTORS ={
    COMMENT_BOX: 'ytd-comments#comments',
    COMMENT_LAST: 'ytd-comment-thread-renderer.style-scope.ytd-item-section-renderer'
}

page.on('response', response => {
    if (<the url which brings comment>){
        ++flag_b;
    }
});

setInterval(() => {
    scrollToBottom();
}, 5000);


async function scrollToBottom(){
    if(flag_a == flag_b){
        await page.evaluate((COMMENTS_SCROLL_SELECTORS) => {
            var ele = document.querySelector(COMMENTS_SCROLL_SELECTORS.COMMENT_LAST);

            if(ele){
                //first scroll already performed, so perform subsequent scrolls
                var length = document.querySelectorAll(COMMENTS_SCROLL_SELECTORS.COMMENT_LAST).length;
                ele = document.querySelectorAll(COMMENTS_SCROLL_SELECTORS.COMMENT_LAST)[length - 1];
                ele.scrollIntoView();
            }else{
                //perform first scroll
                ele = document.querySelector(COMMENTS_SCROLL_SELECTORS.COMMENT_BOX);
                ele.scrollIntoView();
            }

        }, COMMENTS_SCROLL_SELECTORS);

        ++flag_a;
    }else{
        process.exit()
    }
}
JavaScript, HTML, свитка, кукольник,
Похожие вопросы