java接口模拟登陆过程_java WebClient 模拟登陆 得到接口数据

java使用WebClient实现后台登陆爬取数据

WebClient

WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式对应的get、post、put、delete等方法,可以用来发起相应的请求。WebClient可以通过WebClient.create()创建一个WebClient的实例,之后可以通过get()、post()等选择调用方式,uri()指定需要请求的路径,retrieve()用来发起请求并获得响应,bodyToMono(String.class)用来指定请求结果需要处理为String,并包装为Reactor的Mono对象。

后台爬取数据主要是就是cookie怎么保持的问题,有些网站登陆加密很复杂,所以可以用webclient模拟登陆,绕过加密,只要WebClient不清除cookie就会一直在。

依赖

net.sourceforge.htmlunit

htmlunit

2.36.0

登陆

public void login() throws FailingHttpStatusCodeException, IOException {

HtmlPage page = null;

// 获取指定网页实体

URL url = new URL("****");//网页url

page = (HtmlPage) wc.getPage(url);//page就会得到一个页面实体

HtmlInput usernameInput = page.getHtmlElementById("LoginName");//通过getHtmlElementById获取输入框

HtmlInput pswInput = page.getHtmlElementById("Password");

// 往输入框 “填值”

usernameInput.setValueAttribute("admin");

pswInput.setValueAttribute("cjglyjsbyy");

// 获取登陆按钮

HtmlInput btn = page.getHtmlElementById("btnLogin");

try {

btn.click();//按下登陆按钮

Log.debug(wc.getCookies(url).toString());

} catch (IOException e) {

e.printStackTrace();

hLog.error(e);

}

}

拿数据

//url就是爬取数据的网页接口

public String ajax(String Url) throws FailingHttpStatusCodeException, IOException {

URL url = new URL(Url);

String res = "";

res = wc.getPage(url).getWebResponse().getContentAsString();

if (analysisRes(res)) {//这里是一个根据返回值判断是否存在登陆状态的方法

login();

res = wc.getPage(url).getWebResponse().getContentAsString();

}

Log.debug(res);

// 判断返回值是否正确

return res;//这里返回的就是接口数据

}

只要保持webClient不关闭,就可以用 wc.getPage(url).getWebResponse().getContentAsString(); 拿到所有接口返回数据

附上全部代码

public class Client {

WebClient wc;

public Client(WebClient webClient) {

wc = webClient;

wc.getOptions().setJavaScriptEnabled(true);//支持js

wc.getOptions().setCssEnabled(true);//支持CSS,一般CSS不需要

wc.setAjaxController(new NicelyResynchronizingAjaxController());//配置使用ajax,没有这一项调用网页接口会失败

}

public void login() throws FailingHttpStatusCodeException, IOException {

HtmlPage page = null;

// 获取指定网页实体

URL url = new URL("http://****");

page = (HtmlPage) wc.getPage(url);

HtmlInput usernameInput = page.getHtmlElementById("LoginName");

HtmlInput pswInput = page.getHtmlElementById("Password");

// 往输入框 “填值”

usernameInput.setValueAttribute("admin");

pswInput.setValueAttribute("cjgly**y");

// 获取搜索按钮

HtmlInput btn = page.getHtmlElementById("btnLogin");

try {

btn.click();

Log.debug(wc.getCookies(url).toString());

} catch (IOException e) {

e.printStackTrace();

hLog.error(e);

}

}

public String ajax(String Url) throws FailingHttpStatusCodeException, IOException {

URL url;

String res = "";

url = new URL(Url);

res = wc.getPage(url).getWebResponse().getContentAsString();

if (analysisRes(res)) {//analysisRes() 判断是否需要登陆

login();

res = wc.getPage(url).getWebResponse().getContentAsString();

}

Log.debug(res);

// 判断返回值是否正确

return res;

}

}

你可能感兴趣的:(java接口模拟登陆过程)