在使用 Puppeteer 进行网页自动化时,有时可能需要阻止页面上的所有 JavaScript 脚本的执行,以加快页面加载速度或阻止某些操作。可以通过以下步骤来实现这个需求:
-
拦截请求:通过 Puppeteer 的
page.setRequestInterception(true)
方法启用请求拦截功能。 -
分析请求:在请求拦截器中,检查每个网络请求的类型。
-
终止 JS 文件请求:如果检测到请求类型为脚本(
script
),使用request.abort()
方法阻止该请求,从而停止下载和执行相关的 JavaScript 文件。 -
允许其它请求:对于非脚本的其他类型的请求,使用
request.continue()
方法让它们正常进行。
这里是实现上述步骤的 Puppeteer 代码示例:
javascriptconst 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 执行函数。
例如,可以在页面载入之前执行以下代码来禁用内联脚本:
javascriptawait page.evaluateOnNewDocument(() => { window.eval = global.eval = function() { throw new Error(`Eval is disabled`); }; });
总之,根据不同的需求,你可以选择合适的方法来停止 JavaScript 脚本在 Puppeteer 控制的页面上的执行。
2024年6月29日 12:07 回复