在抓取 Youtube 播放列表时使用 Puppeteer 未定义

got undefined with Puppeteer while scraping Youtube playlist

我正在使用 Puppeteer 从 YouTube 播放列表中抓取数据,但无法获取任何数据。 我已经尝试使用浏览器编写代码并使用查询选择器,但想自动执行此过程并生成 json 文件作为此过程的输出。

代码


const puppeteer = require('puppeteer');


(async () => {
    console.log("begin");
    const browser = await puppeteer.launch({headless : false });
    const page = await browser.newPage();
    console.log("after newPage");
    await page.goto('https://www.youtube.com/playlist?list=PL2-FkZlJhxqVXZO1c6gKgsAdiet0zcOAO');

    console.log("after goto ");

    const selectorA = "a.yt-simple-endpoint.ytd-playlist-video-renderer"
    await page.waitForSelector(selectorA);
    console.log("after waitForSelector ");

    const items = await page.$$eval(selectorA, rows => {
        console.log("eval " + rows);
         return rows;    
    });

    console.log("items " + items);


    await browser.close();
})();



结果


begin
after newPage
after goto 
after waitForSelector 
items undefined

来自同一个选择器和浏览器的屏幕截图

根据文档,各种 eval 函数只能传输可序列化数据(粗略地说,数据 JSON 可以处理,但有一些补充)。您的代码 returns 一个 DOM 元素的数组,这些元素不可序列化(它们具有方法和循环引用)。尝试在浏览器上下文中检索数据并且 returns 仅可序列化数据。例如:

return rows.map(row => [row.innerText, row.href]);