如何在puppeteer中拦截带有请求拦截的响应文本?

时间:2020-11-11 16:52:31

标签: javascript node.js puppeteer

我知道如何获取网址,但是我在页面响应文本上找不到很多。

        await page.on('request', request => {
            console.log('INTERCEPTED: ' + request.url());
            request.continue();
        });

我如何记录页面响应文本?

3 个答案:

答案 0 :(得分:0)

绑定到请求之前,您必须先致电setRequestInterception

await page.setRequestInterception(true);
page.on('response', (response) => {
    console.log('RESPONSE RECEIVED');
    console.log(response.status + ' ' + response.url);
});
page.on('request', request => {
    console.log('INTERCEPTED: ' + request.url());
    request.continue();
});

答案 1 :(得分:0)

您可以找到有关response.text() here的信息。可以这样使用:

page.on('response', async (response) => {    
    console.log(await response.text());
});

但是问题可能还在于脚本的终止。您正在寻找的响应可能不会在脚本结束之前到达。想象一下您有这样的事情:

await page.setRequestInterception(true);      
page.on('request', request => {            
    request.continue();
});
page.on('response', response => {
    if (response.url().includes('scripts'))
        console.log(response.url());       
});

await page.type('#search', 'foo');
await page.click('#send-search');
await context.close();
await browser.close();

然后,您无法确定带有“脚本”的网址将在脚本结尾之前到达。如果没有,您将在控制台中看不到任何内容。

如果您要等待特定的响应并对其文本进行处理,最好键入:

const res = await page.waitForResponse(response => response.url().includes('scripts'));
console.log(await res.text());

答案 2 :(得分:0)

    await page.setRequestInterception(true);
    await page.on('requestfinished', async (request) => {
        var response = await request.response();
        try {
            if (request.redirectChain().length === 0) {
               var responseBody = await response.buffer();
               console.log(responseBody.toString());
            }
        }catch (err) { console.log(err); }
    });
    await page.on('request', request => {
        request.continue();
    });

response.text()实际上将始终返回null,这是puppeteer的另一个冗余功能,但是上述方法可以很好地获得页面响应,而页面响应显然仅在请求完全加载时才存在。永远都无法摆脱木偶戏的多少功能,它们似乎什么也没做