Skip to content

监听网络

Puppeteer 能够监听所有的网络请求,即在开发者工具中 Network 选项卡中展示的所有请求。

通过事件监听

所有的网络请求和响应都会触发 request 和 response 事件:

JavaScript
const page = await browser.newPage();
page.on("request", (request) => {
  console.log(request.url());
});

page.on("response", (response) => {
  console.log(response.url());
});

所有的请求都发出这两个事件,因此如果想要实现终止所有的图像请求可以通过添加拦截器事件就行:

JavaScript
import puppeteer from "puppeteer";

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.setRequestInterception(true);
  page.on("request", (interceptedRequest) => {
    if (interceptedRequest.isInterceptResolutionHandled()) return;
    if (
      interceptedRequest.url().endsWith(".png") ||
      interceptedRequest.url().endsWith(".jpg")
    )
      interceptedRequest.abort();
    else interceptedRequest.continue();
  });
  await page.goto("https://example.com");
  await browser.close();
})();

通过 wait 截取

通过 Page.waitForReuestPage.waitForResponse 来截取:

JavaScript
const firstRequest = await page.waitForRequest("https://example.com/resource");
const finalRequest = await page.waitForRequest(
  (request) => request.url() === "https://example.com",
);
return finalRequest.response()?.ok();

const firstResponse = await page.waitForResponse(
  "https://example.com/resource",
);
const finalResponse = await page.waitForResponse(
  (response) =>
    response.url() === "https://example.com" && response.status() === 200,
);
const finalResponse = await page.waitForResponse(async (response) => {
  return (await response.text()).includes("<html>");
});
return finalResponse.ok();