我得到一个UnhandledPromiseRejectionWarning:在使用puppeteer进行简单的Web抓取时,未处理的Promise拒绝被拒绝,我在另一个项目中使用了完全相同的代码,并且它起作用了,我不知道为什么它现在不起作用。下一行完整错误:
node .\scrapers.js
(node:9748) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'getProperty' of undefined
at scrapeChannel (C:\Users\João Teixeira\OneDrive\code\learning\js\webscrapingapp\server\scrapers.js:10:27)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:9748) UnhandledPromiseRejectionWarning: Unhandled promise rejection
。该错误是由于在没有catch块的情况下抛出异步函数而引起的,或者是由于拒绝了未经.catch()处理的诺言而引起的。要在未处理的承诺拒绝时终止节点进程,请使用CLI标志--unhandled-rejections=strict
(请参见https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝ID:1)
(node:9748) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated.
将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。
这是代码:
const puppeteer = require('puppeteer')
async function scrapeChannel(url) {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url);
const [el] = await page.$x('//*[@id="text"]');
const text = await el.getProperty('textContent');
const name = await text.jsonValue();
const [el2] = await page.$x('//*[@id="img"]');
const src = await el2.getProperty('src');
const avatarURL = await src.jsonValue();
console.log({name, avatarURL})
browser.close();
return {name, avatarURL}
}
scrapeChannel('https://www.youtube.com/user/Microsoft');
答案 0 :(得分:0)
您对page.$x
的调用(在await
之后)没有返回带有至少一个元素的可迭代对象,或者返回的可迭代对象的第一个元素是undefined
。
因此,el
或el2
(取决于它们所在的行)被分配了undefined
。由于undefined
没有属性getProperty
,因此会抛出。您没有发现该错误,因此请注意。
正如@Jaromanda X所说,在try
函数内使用catch
/ async
。或者,由于async
函数返回一个Promise,请使用scrapeChannel('https://www.youtube.com/user/Microsoft').catch( /**/ );
捕获该函数内部发生的任何错误,避免使用Node.js UnhandledPromiseRejectionWarning
。