我有以下代码,可以从特定网站提取所有请求(获取所有图像、CSS、脚本、字体...)
var totalRequests = 0;
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', interceptedRequest => {
interceptedRequest.continue();
});
page.on('response', response => {
totalRequests = totalRequests + 1;
console.log('Url: ' + response.url());
});
await page.goto('https://stackoverflow.com');
await browser.close().then(() => {
res.send('Requests: ' + totalRequests);
});
Run Code Online (Sandbox Code Playgroud)
太好了,在控制台中我可以看到来自stackoverflow.com的所有 Url (Css 文件、图像文件、字体文件和 Javascript 文件)以及请求的总文件(在本例中我看到 31 个请求),但由于某种原因我结束了请注意,此代码不会返回所有页面请求。
如果我们转到 Google Chrome,按 F12,转到网络部分并重新加载页面(假设您位于 URL https://stackoverflow.com),我们将看到总共 39-40 个请求文件。
问题是我的代码只返回 30 到 31 个请求,并且在控制台中我看不到 Chrome 上显示的所有链接。可能会发生什么?我该怎么做才能返回所有请求,如 Google Chrome 所示?
我用nodejs + puppeteer 编写了下面的代码,其目标是截取用户网站的屏幕截图:
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('http://MY_WEBSITE/try/slowURL',{timeout: 30000, waitUntil: 'networkidle0' });//timeout 30 seconds
await page.setViewport({width: 1920, height: 1080});
await page.screenshot({path: pathUpload});
await browser.close();
Run Code Online (Sandbox Code Playgroud)
它的操作非常简单,但为了测试超时,我创建了一个http://MY_WEBSITE/try/slowURL
需要 200 秒加载的页面 ( )。
根据 puppeteer 超时 ( timeout: 30000
),有 100% 的机会发生“导航超时超出:超过 30000 毫秒”错误,尤其是因为我强制执行它。
问题
通过htop
命令(linux中使用),即使系统崩溃并显示“TimeoutError”后,我也可以看到浏览器并未关闭。
如果浏览器在扫描完成后没有关闭,那么服务器很可能会耗尽内存,而我不希望这样。
我怎么解决这个问题?
我正在尝试使用 Node 中的 puppeteer 以秒为单位使页面完全加载时间,为此我对 API 和其他问题进行了一些研究并创建了以下代码:
/* First Configuration */
puppeteer.launch({
defaultViewport: { width: 1600, height: 800 }
}).then(async browser => {
const page = await browser.newPage();
await page.setCacheEnabled(false);
await page.goto('https://stackoverflow.com', {waitUntil: 'networkidle0'});
/* Get Page Metrics */
const perf = await page.metrics();
console.log(JSON.stringify(perf));
/* Get Page Evaluate */
const timing = await page.evaluate(() => {
const result = {};
for (const key of Object.keys(window.performance.timing.__proto__))
result[key] = window.performance.timing[key];
return result;
});
console.log(JSON.stringify(timing));
/* Show Results on Browser Close */ …
Run Code Online (Sandbox Code Playgroud)