在日常應用中,我們希望代理服務器可以擁有可以進行定製的能力,比如在瀏覽器透明的情況下修改瀏覽器的請求內容,響應結果,我們可以用browsermob來實現這一功能.
<dependency>
<groupId>net.lightbody.bmp</groupId>
<artifactId>browsermob-core</artifactId>
<version>2.1.5</version>
</dependency>
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.start(3022);//設置端口
proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
proxy.newHar("har");
proxy.addRequestFilter(new RequestFilter() {
@Override
public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) {
String url = messageInfo.getOriginalUrl();//獲取連接
if(url.contains("search.json")){//判斷目標請求
String s = contents.getTextContents();//獲取post請求的內容
s = s.replace("pageSize=9","pageSize=19");//替換內容
contents.setTextContents(s);//重新設置內容
}
return null;
}
});
proxy.addResponseFilter(new ResponseFilter() {
@Override
public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) {
//獲取結果
contents.getTextContents();
//修改內容
String originalText = "結果";
if (contents.isText()) {
if (contents.getTextContents().equals(originalText)) {
contents.setTextContents("新的內容");//修改響應的內容
}
}
}
});
從上面的案例中,我們可以看到,已經實現了修改請求內容,跟獲取修改響應結果。使用的地方舉例,比如我們用selenium或者其他瀏覽器集成的方式去進行數據採集,我們無法修改請求參數,比如列表的長度之類的,此時,我們可以用攔截篡改的方式,像例子中的,把每頁條數變更。另外,我們通常採集的ajax接口,都可以直接用獲取響應內容的形式直接採集,不需要去解析頁面了。好處多多。