在日常应用中,我们希望代理服务器可以拥有可以进行定制的能力,比如在浏览器透明的情况下修改浏览器的请求内容,响应结果,我们可以用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接口,都可以直接用获取响应内容的形式直接采集,不需要去解析页面了。好处多多。