前言
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模拟浏览器点击即可爬取