You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Puppeteer实现列表页跳转后抓取内层详情页的指定内容

实现方案

你只需要在原有脚本收集完所有作者链接后,增加遍历作者详情页抓取字段的逻辑即可,同时建议增加去重逻辑避免重复请求同一个作者页面,优化抓取效率。

修改后完整代码

const puppeteer = require('puppeteer');

function run (pagesToScrape) {
    return new Promise(async (resolve, reject) => {
        try {
            if (!pagesToScrape) {
                pagesToScrape = 1;
            }
            const browser = await puppeteer.launch({headless:false});
            const [page] = await browser.pages();
            await page.goto("https://quotes.toscrape.com/");
            let currentPage = 1;
            let quotes = [];
            // 第一步:抓取所有分页的名言和作者链接
            while (currentPage <= pagesToScrape) {
                let newQuotes = await page.evaluate(() => {
                    let results = [];
                    let items = document.querySelectorAll('[class="quote"]');
                    items.forEach((item) => {
                        results.push({
                            authorUrl:  'https://quotes.toscrape.com' + item.querySelector("small.author + a").getAttribute('href'),
                            authorName: item.querySelector("small.author").innerText,
                            title: item.querySelector("span.text").innerText
                        });
                    });
                    return results;
                });
                quotes = quotes.concat(newQuotes);
                if (currentPage < pagesToScrape) {
                    // 修正原写法小问题,Promise.all内直接传Promise实例即可
                    await Promise.all([
                        page.waitForSelector('li.next > a'),
                        page.click('li.next > a'),
                        page.waitForSelector('[class="quote"]')
                    ])
                }
                currentPage++;
            }

            // 第二步:对作者链接去重,避免重复请求同一页面
            const uniqueAuthorUrls = [...new Set(quotes.map(item => item.authorUrl))];
            const authorDescMap = {};

            // 遍历所有唯一作者链接抓取描述字段
            for (const authorUrl of uniqueAuthorUrls) {
                await page.goto(authorUrl);
                await page.waitForSelector('.author-description');
                const description = await page.evaluate(() => {
                    return document.querySelector('.author-description').innerText.trim();
                });
                authorDescMap[authorUrl] = description;
            }

            // 第三步:把作者描述合并到原数据中
            const result = quotes.map(item => ({
                ...item,
                authorDescription: authorDescMap[item.authorUrl]
            }));

            browser.close();
            return resolve(result);
        } catch (e) {
            return reject(e);
        }
    })
}
run(3).then(console.log).catch(console.error);

核心改动说明

  • 新增作者链接去重逻辑,避免同一个作者多次出现在不同名言页时重复请求,大幅提升抓取效率
  • 分页内容收集完成后,遍历所有唯一的作者详情页,抓取.author-description节点的文本内容,和作者URL做映射
  • 最后将作者描述字段合并到原有输出结果中,你也可以根据自身需求调整输出结构

内容的提问来源于stack exchange,提问作者MITHU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:57:01