我的“执行上下文被破坏”错误的根源是什么?

时间:2019-05-04 18:18:39

标签: javascript node.js web-scraping puppeteer

我正在创建一个程序,以检索针对我工作的在线Uni的论坛回复。我设法成功导航到适当的页面,但是当我尝试将抓取包含在已答复的学习者的姓名列表中时,我收到“执行上下文被破坏的错误”。

到目前为止,我尝试遍历具有不同超时量的page.waitFor()方法。

   const nameLinkList = await page.$$eval(
            '.coursename',
            (courseLinks => courseLinks.map(link => {
                const a = link.querySelector('.coursename > a');
                return {
                    name: a.innerText,
                    link: a.href
                };
            }))
        );

        for (const {
                name,
                link
            } of nameLinkList) {
            await Promise.all([
                page.waitForNavigation(),
                page.goto(link),
                page.waitFor(2000),
            ]);

            let [button] = await page.$x("//a[contains(., 'Self')]");
            if (button) {
                await button.click();
            } else {
                console.log(name);
                console.log('Didnt find link');
            }

            fs.appendFile('out.csv', name + '\n');
            await page.waitFor(1000);
            var elementExists = await page.$$('.author .media-body');

            if (elementExists) {
                await console.log(name);
                await page.waitFor(500);
                for (let z of elementExists) {
                    const studentName = await z.$eval('a', a => a.innerText);
                    await page.waitFor(2000)
                    await console.log(studentName);
                }
            }
            await page.goto('www.urlwiththelistofcourses.com');

        }

我希望它遍历每个页面,首先记录课程名称,然后记录在课程特定论坛上张贴的所有学生的名称。令我感到困惑的是,与先前在特定迭代中卡住的错误不同,该错误是变量,通常在第12至17次迭代中的同一区域,有时甚至更早。

1 个答案:

答案 0 :(得分:0)

似乎在这里调整了waitFor的组合:

 fs.appendFile('out.csv', name + '\n');
            await page.waitFor(1000);
            var elementExists = await page.$$('.author .media-body');

到2000年,结合禁用css和图像的渲染解决了该问题。如果页面加载速度太慢,则该程序必须已链接掉才能进入循环。