我正在尝试使用Puppeteer api获取所有域重定向,在获取最终URL的屏幕截图之前保存到数组中,但到目前为止我的代码也获得了其他重定向。
例如,如果我goto youtube.com
,那么我的代码将正确获取重定向'https://youtube.com/', 'https://www.youtube.com/',
,但它也会获得其他重定向,例如doubleclick.net。
我只想获得会在URL栏中发生的重定向。
我设法用request.resourceType === 'document'
缩小范围。
我怎样才能进一步缩小范围?
以下是代码:
// node chrome.js http://youtube.com
const puppeteer = require('puppeteer');
var url = process.argv[2];
(async () => {
const browser = await puppeteer.launch({headless: true, timeout: 30000, ignoreHTTPSErrors: true});
const page = await browser.newPage();
// await page.setRequestInterception(true); // hangs with resourcetype
const urls = [];
page.on('request', request => {
// if (request.resourceType === 'document' || request.resourceType === 'script') {
if (request.resourceType === 'document') {
urls.push(request.url);
request.continue();
}
});
await page.goto(url, {timeout: 20000, waitUntil: 'load'}); //default load
await page.screenshot({path: 'test.jpg', type: 'jpeg', quality: 80, fullPage: false});
console.log(urls);
await browser.close();
})();
答案 0 :(得分:0)
主要回应是第一反应。因此,您可以使用Emitter类的once方法进行检查:
page.once('response', function(response) {
console.log(`${response.status()} ${response.url()}`);
});
// page.goto(...);
如果你想要所有重定向的列表,你可以这样做:
let responses = [];
const _parseMainResponses = function(response) {
if(response.status() >= 300 && response.status() <= 399) {
responses.push(response);
}else {
responses.push(response);
// get a non redirect. We can now remove the listener
page.removeListener('response', _parseMainResponses);
}
};
// page.goto(...)
responses.map(function(response) {
console.log(`${response.status()} -> ${response.url()}`);
});