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;
}
}