当我在另一个页面上获取数据时,我会在for循环的puppeteer中遇到此问题,然后当我返回时,出现此错误行:
Error "We have an error Error: the execution context was destroyed, probably because of a navigation."
这是一个目录页面,每页包含15个公司,然后我想访问每个公司以获取信息。
try {
const browser = await pupputer.launch({
headless: false,
devtools: true,
defaultViewport: {
width: 1100,
height: 1000
}
});
const page = await browser.newPage();
await page.goto('MyLink');
await page.waitForSelector('.list-firms');
for (var i = 1; i < 10; i++) {
const listeCompanies = await page.$$('.list-firms > div.firm');
for (const companie of listeCompanies) {
const name = await companie.$eval('.listing-body > h3 > a', name => name.innerText);
const link = await companie.$eval('.listing-body > h3 > a', link => link.href);
await Promise.all([
page.waitForNavigation(),
page.goto(link),
page.waitForSelector('.firm-panel'),
]);
const info = await page.$eval('#info', e => e.innerText);
const data = [{
name: name,
information: info,
}];
await page.goBack();
}
await Promise.all([
page.waitForNavigation(),
page.click('span.page > a[rel="next"]')
]);
}
} catch (e) {
console.log('We have error', e);
}
我设法只获得了第一家公司的数据。
该错误表示您正在访问由于导航而变得过时/无效的数据。错误在您的脚本中引用了变量listeCompanies
:
const listeCompanies = await page.$$('.list-firms > div.firm');
首先,在循环中使用此变量,然后通过page.goto
和进行导航,然后循环尝试从变量中获取下一项listeCompanies
。但是在导航发生后,该变量中的元素句柄不再存在,因此引发了错误。这就是为什么第一次迭代有效的原因。
有多种解决方法。
page.goBack
这是最干净的方法。您一次提取第一页中的信息,然后遍历提取的数据。在nameLinkList
将与一个数组name
和link
值(例如[{name: '..', link: '..'}, {name: '..', link: '..'}]
)。page.goBack
由于已经提取了数据,因此也不需要在循环末尾调用。
const nameLinkList = await page.$$eval(
'.list-firms > div.firm',
(firms => firms.map(firm => {
const a = firm.querySelector('.listing-body > h3 > a');
return {
name: a.innerText,
link: a.href
};
}))
);
for (const {name, link} of arr) {
await Promise.all([
page.waitForNavigation(),
page.goto(link),
page.waitForSelector('.firm-panel'),
]);
const info = await page.$eval('#info', e => e.innerText);
const data = [{
name: name,
information: info,
}];
}
在这种情况下,您的浏览器将有两个打开的页面。第一个仅用于读取数据,第二个用于导航。
const page2 = await browser.newPage();
for (const companie of listeCompanies ){
const name = await companie.$eval('.listing-body > h3 > a', name => name.innerText);
const link = await companie.$eval('.listing-body > h3 > a', link => link.href);
await Promise.all([
page2.goto(link),
page2.waitForSelector('.firm-panel'),
]);
const info = await page2.$eval('#info', e => e.innerText);
// ...
}
返回“主页”后,您只需在这里重新执行选择器即可。请注意,for..of
在替换数组时,必须将其更改为迭代器循环。
let listeCompanies = await page.$$('.list-firms > div.firm');
for (let i = 0; i < listeCompanies.length; i++){
// ...
await page.goBack();
listeCompanies = await page.$$('.list-firms > div.firm');
}
我建议选择选项1,因为这也减少了必要的导航请求,因此可以加快脚本的速度。
问题内容: 我有一个用Restify和Mongoose在node.js中构建的REST服务,以及一个mongoDB,它的集合包含大约30.000个常规大小的文档。我的节点服务通过pmx和pm2运行。 昨天,节点突然开始通过消息“ MongoError:拓扑已被破坏”消除错误,仅此而已。我不知道这是什么意思,可能触发了什么。谷歌搜索时也没有太多发现。所以我想在这里问。 今天重新启动了节点服务后,错误
1998年12月25日晚上(我的计算机时钟绝对准确),在进行完日常的一系列操作后,又准备对系统进行一下“挖潜”工作,我相信这是大多数PC 发烧友的共同爱好。主板的BIOS已经被升级过好几次了,而且目前我还没找到更新的BIOS升级数据文件,所以我把目光转向了主板附带光盘上的DMI(Desktop Management Interface,桌面管理接口)程序。DMI为用户提供了一个与系统硬件直接对话的
有几种安装 Nest 应用程序的方法。您可以创建一个 Web 应用程序,微服务或只是一个 Nest 执行上下文 。 Nest 上下文是 Nest 容器的一个包装,它包含所有实例化的类。我们可以直接使用应用程序对象从任何导入的模块中获取现有实例。由于这一点,您可以充分利用 Nest 框架的优势,包括 CRON 任务,甚至可以在其上构建 CLI 。 为了创建一个 Nest 应用程序上下文,我们使用下面
问题内容: 考虑以下代码: 为什么会出现这些错误? 问题答案: 二进制浮点数学就是这样。在大多数编程语言中,它基于IEEE754标准。问题的症结在于数字以这种格式表示为整数乘以2的幂。分母不是2的幂的有理数(例如,是)无法精确表示。 对于标准格式,表示形式可以完全按照 以十进制表示,或 以C99十六进制表示法表示。 相比之下,合理数量0.1,这是1/10可以完全按照书面 以十进制表示,或 以C99
我必须添加一个WordPress安装到我的CodeIgniter系统,所以我把它放在一个名为的子图中,并在我的中排除了该文件夹。一切都很好。 我已经将所有的WordPress表和放在我的CodeIgniter数据库中,前缀为。 我现在已经将WordPress博客头文件加载到,就像这样; 并在我的控制器中创建了一个注册方法,以实际链接到我的。我这样做是因为我想使WordPress登录/注册过时,并从
问题内容: 当我尝试创建此错误时出现: 错误(E_UNKNOWN)::遇到意外错误MongoError:Server.insert(/ Users / oscargallon / Documents / developer / sails / reyesmagoswebpae / node_modules / sails- mongo / node_modules / mongodb / node