puppeteer是一個基於cdp協議的功能強大的工具,在自動化測試和爬蟲方面應用廣泛,這裡談一下如何在puppeteer中關掉同源策略和進行請求攔截。
同源策略
同源策略為web 安全提供了有力的保障,但是有時候我們需要在localhost的情況下訪問伺服器的api,這時就需要去掉同源策略的限制,讓http暢通無阻。
chrome的啟動是支援很多引數的,其中一個就是來禁用同源策略的。當我們在chrome啟動時加入--disable-web-security
這個引數時,chrome的同源策略就會被關閉。對於關閉puppetter的同源策略就更簡單了,只要在launch方法中加入這個引數就可以了:
const browser = await puppeteer.launch({
headless: false,
devtools: true,
defaultViewport: {
width: 1280,
height: 720,
},
args: [
'--disable-web-security'
],
});
更多有用的引數可以參考這裡.
然後接下來談談攔截請求
page.setRequestInterception
可以攔截請求的就是這個方法了。我們來看官方給出的一段程式碼:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', interceptedRequest => {
if (interceptedRequest.url().endsWith('.png') || interceptedRequest.url().endsWith('.jpg'))
interceptedRequest.abort();
else
interceptedRequest.continue();
});
await page.goto('https://example.com');
await browser.close();
});
這裡,我們首先開啟了攔截請求,然後對url以jpg或者png結尾的,呼叫abort(),使這個請求失敗,其他的則繼續發到伺服器。當然,如果只是這麼簡單的話,是說明不了這個方法的強大之處的,因為我們還可以直接返回一個響應。舉個例子:
await page.setRequestInterception(true);
page.on('request', request => {
request.respond({
status: 404,
contentType: 'text/plain',
body: 'Not Found!'
});
});
對方不想說話,並丟過來一個404。當然,除了404,其他的200,301,500也都是可以的。
還可以在請求過程中''添油加醋'':
request.url() // 讀取url
request.headers() // 讀取headers
request.postData() // 讀取postData
request.method() // 讀取postData
request.continue({
url: '',
method: '',
postData: {},
headers: {}
})
你可以在請求過程中替換一些請求的引數,比如把url中的baidu替換成google,改掉postData或者headers裡的一些資訊,emmm,我忽然有了一個大膽的想法(完)。
參考:
https://pptr.dev/#?product=Puppeteer&version=v5.2.1&show=api-pageevaluatehandlepagefunction-args
https://zhaoqize.github.io/puppeteer-api-zh_CN/#?product=Puppeteer&version=v5.2.1&show=api-requestcontinueoverrides