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就会一直在。

依赖
        <dependency>
			<groupId>net.sourceforge.htmlunit</groupId>
			<artifactId>htmlunit</artifactId>
			<version>2.36.0</version>
		</dependency>
登陆
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)