java基于browsermob实现代理服务器

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章