HtmlUnit的学习与摸索 解决某搜索网站登录验证与submit无法提交的问题

前言

HtmlUnit是一款“虚拟浏览器”,以模拟浏览器的运行来达到爬取数据的目的,与Jsoup有显著区别

问题与实现

现需要爬取某网站数据,但该网站几乎全用ajax提交获取数据,并且对js代码进行了加密,用Jsoup难以爬取,因此用到HtmlUnit。首先可以确定的几点:

1.该网站需要执行ajax
2.网站需要登录
3.网站遵循https协议

因此先有以下代码:
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_45);  
		        webClient.getOptions().setJavaScriptEnabled(true);  //开启javascript解释
		        webClient.getOptions().setCssEnabled(false);  //禁用Css,可避免自动二次请求CSS进行渲染     
		        webClient.getOptions().setUseInsecureSSL(true);//忽略ssl认证    
		        webClient.setAjaxController(new NicelyResynchronizingAjaxController());//开启ajax
		        webClient.getCookieManager().setCookiesEnabled(true); //开启cookie管理  

以上开启了基本需求,上面部分设置后面可能不会用到,下面开始着手登录问题,没登录的时候他们的跳页按钮如下


对登录页面进行爬取模拟提交点击事件

String login_url = "https://www.xxx.com/login?redirectUrl=xxxxx";
		        HtmlPage page_login = webClient.getPage(login_url); 
		        HtmlForm  form = page_login.getForms().get(0);//获取form表单
		        
//		       System.out.println(form.asXml());
		       
		        HtmlTextInput name = form.getInputByName("signusername");
		        name.setValueAttribute("xxxxxxx");
		        HtmlPasswordInput password = form.getInputByName("signpassword");
		        password.setValueAttribute("xxxxxxx");
		        HtmlSubmitInput  submit = form.getInputByName("loginsubmit");
		        
		        submit.click();
		        webClient.waitForBackgroundJavaScript(1000);//等待1秒  

随后进入了无限苦恼中,因为页面根本没跳转,还在登录页面,上面填的数据可以输出,于是代码审查,在ajax的代码中发现如下代码


由此代码判断虽然页面没有跳转,但是登录信息应该已经保存,因此直接进行后续代码操作

String url ="同网站搜索页";  
HtmlPage page = webClient.getPage(url);

输出之,发现登录成功,分页跳转链接变成如下代码


继续用htmlunit模拟浏览器点击即可爬取

你可能感兴趣的:(HtmlUnit的学习与摸索 解决某搜索网站登录验证与submit无法提交的问题)