乐闻世界logo
搜索文章和话题

Puppeteer 如何停止所有 JS 脚本

4 个月前提问
3 个月前修改
浏览次数39

1个答案

1

在使用 Puppeteer 进行网页自动化时,有时可能需要阻止页面上的所有 JavaScript 脚本的执行,以加快页面加载速度或阻止某些操作。可以通过以下步骤来实现这个需求:

  1. 拦截请求:通过 Puppeteer 的 page.setRequestInterception(true) 方法启用请求拦截功能。

  2. 分析请求:在请求拦截器中,检查每个网络请求的类型。

  3. 终止 JS 文件请求:如果检测到请求类型为脚本(script),使用 request.abort() 方法阻止该请求,从而停止下载和执行相关的 JavaScript 文件。

  4. 允许其它请求:对于非脚本的其他类型的请求,使用 request.continue() 方法让它们正常进行。

这里是实现上述步骤的 Puppeteer 代码示例:

javascript
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); // 启用请求拦截 await page.setRequestInterception(true); // 添加请求拦截器 page.on('request', (request) => { // 如果是脚本文件,终止请求 if (request.resourceType() === 'script') { request.abort(); } else { // 其他类型的请求继续进行 request.continue(); } }); // 打开网页 await page.goto('http://example.com'); // 其他页面操作... // 关闭浏览器 await browser.close(); })();

使用这种方法,所有的 JavaScript 脚本请求将被停止,但是这并不意味着页面上已经内嵌或者预先执行的脚本会被阻止。阻止内联脚本或页面上已经执行的 JavaScript 需要采用不同的策略,比如在页面加载之前注入自定义脚本来禁用或重写 eval 函数和其他相关的 JavaScript 执行函数。

例如,可以在页面载入之前执行以下代码来禁用内联脚本:

javascript
await page.evaluateOnNewDocument(() => { window.eval = global.eval = function() { throw new Error(`Eval is disabled`); }; });

总之,根据不同的需求,你可以选择合适的方法来停止 JavaScript 脚本在 Puppeteer 控制的页面上的执行。

2024年6月29日 12:07 回复

你的答案