Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当网页有无限滚动时,如何使Apify爬虫滚动整页?_Javascript_Web Crawler_Infinite Scroll_Apify - Fatal编程技术网

Javascript 当网页有无限滚动时,如何使Apify爬虫滚动整页?

Javascript 当网页有无限滚动时,如何使Apify爬虫滚动整页?,javascript,web-crawler,infinite-scroll,apify,Javascript,Web Crawler,Infinite Scroll,Apify,我面临一个问题,我无法获得所有的产品数据作为网站上使用产品目录页面上的惰性负载。这意味着它需要滚动直到加载整个页面 我只得到第一页的产品数据。首先,您应该记住,可以通过无限方式实现无限滚动。有时你必须在途中点击按钮或进行任何形式的转换。这里我将只讨论最简单的用例,它是以一定的间隔向下滚动,并在没有加载新产品时结束 如果您使用构建自己的演员,您可以使用。如果它不包括您的用例,理想情况下请给我们反馈 如果您使用的是通用刮刀(或),则无限滚动功能当前不是内置的(但如果您以后阅读此内容,则可能会)。另一

我面临一个问题,我无法获得所有的产品数据作为网站上使用产品目录页面上的惰性负载。这意味着它需要滚动直到加载整个页面


我只得到第一页的产品数据。

首先,您应该记住,可以通过无限方式实现无限滚动。有时你必须在途中点击按钮或进行任何形式的转换。这里我将只讨论最简单的用例,它是以一定的间隔向下滚动,并在没有加载新产品时结束

  • 如果您使用构建自己的演员,您可以使用。如果它不包括您的用例,理想情况下请给我们反馈

  • 如果您使用的是通用刮刀(或),则无限滚动功能当前不是内置的(但如果您以后阅读此内容,则可能会)。另一方面,自己实现它并没有那么复杂,让我向您展示一个Web Scraper的
    pageFunction
    的简单解决方案


  • 当然,这是一个非常微不足道的例子。有时情况会变得复杂得多。我甚至曾经使用Puppeter直接导航鼠标并拖动一些可以通过编程访问的滚动条。

    Hi Kunal,你读过吗:?我认为itemCount=currentItemCount;此行正在覆盖我们需要的原始计数的值。所以我想我们可以删除这条线?不,这是故意的。请注意,
    const currentItemCount=$('.my class').length实际上是在滚动之后调用的。因此,它是在滚动之前检查项目计数,而不是在滚动之后检查项目计数。
    
    async function pageFunction(context) {
        // few utilities
        const { request, log, jQuery } = context;
        const $ = jQuery;
    
        // Here we define the infinite scroll function, it has to be defined inside pageFunction
        const infiniteScroll = async (maxTime) => {
            const startedAt = Date.now();
            let itemCount = $('.my-class').length; // Update the selector
            while (true) {
                log.info(`INFINITE SCROLL --- ${itemCount} items loaded --- ${request.url}`)
                // timeout to prevent infinite loop
                if (Date.now() - startedAt > maxTime) {
                    return;
                }
                scrollBy(0, 9999);
                await context.waitFor(5000); // This can be any number that works for your website
                const currentItemCount = $('.my-class').length; // Update the selector
    
                // We check if the number of items changed after the scroll, if not we finish
                if (itemCount === currentItemCount) {
                    return;
                }
                itemCount = currentItemCount;
            }
        }
    
        // Generally, you want to do the scrolling only on the category type page
        if (request.userData.label === 'CATEGORY') {
            await infiniteScroll(60000); // Let's try 60 seconds max
    
            // ... Add your logic for categories
        } else {
            // Any logic for other types of pages
        }
    }