puppeteer 如何拦截页面请求?

42 min read

在 Puppeteer 中拦截页面请求可以使用 waitForRequestwaitForResponse 方法来实现。

以下是一个示例:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // 拦截请求
  await page.setRequestInterception(true);

  page.on('request', (request) => {
    // 可以根据请求的 URL、类型等进行拦截处理
    if (request.url().endsWith('.png') || request.url().endsWith('.jpg')) {
      request.abort(); // 终止请求
    } else {
      request.continue(); // 继续请求
    }
  });

  await page.goto('https://www.example.com');

  await browser.close();
})();

在上述示例中,page.setRequestInterception(true) 用于启用请求拦截。然后通过 page.on('request', (request) => { ... }) 来监听请求事件,并在回调函数中进行相应的处理。使用 request.abort() 终止请求,request.continue() 继续请求。

使用 waitForRequestwaitForResponse 方法更为灵活,可以根据请求的 URL、类型等进行具体的拦截判断。例如:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // 拦截请求
  await page.setRequestInterception(true);

  page.on('request', async (request) => {
    // 等待请求的 URL 包含特定关键字
    if (request.url().includes('example')) {
      const response = await request.waitForResponse(); // 等待响应
      console.log(`Received response for '${response.url()}'`);
    }

    request.continue(); // 继续请求
  });

  await page.goto('https://www.example.com');

  await browser.close();
})();

在上述示例中,使用 request.url().includes('example') 来判断请求的 URL 是否包含关键字 'example',如果包含,则使用 request.waitForResponse() 等待响应,并打印响应的 URL。

这样可以根据具体的需求,来灵活地拦截和处理页面请求。