首页 > 解决方案 > 使用 Puppeteer 捕获原始请求

问题描述

尝试通过 Puppeteer 捕获原始 HTTP 请求消息,而不是使用代理。

这是我正在做的一个基本示例。

const puppeteer = require('puppeteer');

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

  await page.setViewport({ width: 1200, height: 800 })

  await page.setRequestInterception(true)

  page.on('request', (request) => {
    console.log(request) // <-- I want raw HTTP(S) message, not an object
    request.continue()
  })

  page.on('response', (response) => {
    console.log('<<', response.status(), response.url())
  })

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

  await browser.close()
})()

当我打印出请求时,我得到了代表请求的 Node / JSON 对象。

如何获取原始请求消息?

标签: node.jspuppeteer

解决方案


@openwonk,你好!

您可以使用以下方式获取原始数据:

  1. 简单但不是所有数据:
page.on('request', async function (request) {
    // HTTP method
    console.log(request.method());
    // Request target, usually a URL
    console.log(request.url());
    // The HTTP version
    // N/A
    // HTTP headers
    console.log(request.headers());
    // Body
    console.log(request.postData());
});
  1. 不像以前那么简单,但有完整的数据:
await page.tracing.start({ path: 'trace.json', categories: ['netlog'] });
await page.goto('http://example.com/', { waitUntil: 'networkidle0' })
const tracing = JSON.parse(await page.tracing.stop());
// Some filtering
const res = await tracing.traceEvents.filter(te => te.name.toLowerCase().includes(`${some_desired_name}`));
  • 您可以包括不同的跟踪类别。在此示例中,仅使用了“ netlog ”类别。您可以在本文中阅读有关跟踪的简短介绍。
  • 您应该自己从该跟踪中收集数据。
  • 它使用跟踪类。
  • 此代码创建可以在 DevTools 中检查的跟踪文件 (' trace.json ')。

推荐阅读