木偶爬虫-通过单击“下一步”按钮进行分页

时间:2019-11-07 21:05:49

标签: apify

我的Puppeteer搜寻器面临以下问题: 我正在抓取的网站上有结果页,我们可以通过单击底部箭头来导航至下一页(链接中没有简单的href链接,因此我们需要模拟单击按钮)。 在每个页面上,我需要抓取所有项目详细信息(房地产卡/每页30张卡)。

问题是:如何导航到以下所有页面,并在每一页上废弃所有卡片?

我所做的: 在起始网址上,我填写了一个表单以提交并获得前30个结果到我的请求中。 然后,我在选择器上循环匹配页面底部的箭头,然后单击它,直到选择器不存在为止。 导航有效,但抓取工具未获得每一页上卡片的所有链接。因此,只有30张第一张纸牌被刮掉,然后刮纸器停止运转。

async function pageFunction(context) {

    switch (context.request.userData.label) {
        case 'START': return handleStart(context);
        case 'DETAIL': return handleDetail(context);
    }

    async function handleStart({ log, page, customData }) {
        // fill in form and submit to get the results page
        await page.click(home.submitSearch);

        // waiting for some selectors on first results page 
        await page.waitForSelector(searchResults.card);
        await page.waitForSelector(searchResults.blockNavigation);

        // navigate with pagination
        while (await page.$(searchResults.nextPage) !== null) {
           await page.waitForSelector(searchResults.card);
           await page.waitForSelector(searchResults.blockNavigation);
           await page.click(searchResults.nextPage)
        }
    }

    async function handleDetail({ request, log, skipLinks, page }) {
        const description = await page.$eval(descriptionSelector, (el => el.textContent));
        return { description };
    }
}

“ START”标签将起始网址与表单匹配。

“详细信息”标签与结果页面上与一张卡相关的链接匹配。

关于如何处理此案的任何想法?

1 个答案:

答案 0 :(得分:1)

这是网页抓取的典型问题。单击下一个按钮后,它看起来似乎在使用某些XHR请求来获取其他数据的网站。

如果不了解网站的结构和知识,很难为您提供一些建议。但是您可以使用以下两种方法:

1)使用网站XHR的请求获取数据。您可以使用浏览器控制台检出XHR请求,并将其复制到您的搜寻器中。

2)您尝试执行的方法。等待,然后单击循环中的下一个按钮。并在没有其他下一个按钮之后获取所有数据。我在您当前的代码中没有看到任何问题,但这取决于您在puppeteer scraper中使用的伪URL和可单击选择器。如果设置正确,它应该可以工作。

无论如何,有一个出色的教程介绍了如何pagination in puppeteer scraper。您可以检查出来。