记录一下:前两天有个爬虫的项目出问题了,爬取的服务端升级了mlgbd,给每一个关键页面加了cookie验证。html
访问服务器端给返回状态码202,而且返回的html里有一段加密过的js,这段js经过获取meta标签里动态传入的content值进行计算而后把值存入cookie,原本想看js直接写的啥 本身经过逻辑取出值去生成cookie的,结果发现js里的几个关键值都是后台动态生成的 ,想来想去直接取值麻烦 (1万行加密js代码,看的他妈头都大了 仍是混淆过的)。java
实在是受不了了 领导还每天催。结果想有没有什么能直接运行js的东西,就找到了htmlunit。web
经过htmlunit拿到页面而后运行里面的js将js设置的cookie拿到,放到本身请求的cookie中,问题顺利解决了(因为每一个页面都有js设置cookie,先用htmlunit执行js拿到cookie再用httpclient去获取页面访问)。服务器
public String getJsCookie(String url,String... cName) { WebClient webClient = new WebClient(BrowserVersion.CHROME); //2.设置链接的相关选项 webClient.getOptions().setCssEnabled(false); webClient.getOptions().setJavaScriptEnabled(true); //须要解析js webClient.getOptions().setThrowExceptionOnScriptError(false); //解析js出错时不抛异常 //webClient.setJavaScriptEngine(new MyJavaScriptEngine(webClient));//自定义JavaScript引擎,有js错误不打印 webClient.getOptions().setTimeout(10000); //超时时间 ms webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成 //3.抓取页面 HtmlPage page = null; try { page = webClient.getPage(url);//爬取页面的路径 } catch (IOException e) { e.printStackTrace(); } //4.将页面转成指定格式 //System.out.println(page.asXml()); CookieManager CM = webClient.getCookieManager(); //WC = Your WebClient's name Set<com.gargoylesoftware.htmlunit.util.Cookie> cookies_ret = CM.getCookies();//拿到htmlunit存取的页面cookie String cookiestr="";//按照默认方式进行拼接 for(com.gargoylesoftware.htmlunit.util.Cookie cookie:cookies_ret){ //System.out.println(cookie.getName()+":"+cookie.getValue()); for(String name:cName){ if(cookie.getName().equals(name)){ cookiestr+=name+"="+cookie.getValue()+";"; } } } return cookiestr; }
服务端是能够访问了,可是有几个问题还待解决。
1.js报错关不掉,重写了不知是版本问题仍是啥 没时间去弄了 直接设置异常不抛出也无论用。测试的时候不知道改了啥了 有几回没抛 结果还原代码 改不回去了。。。
2.解析js很慢。解析js太慢了 可能跟须要下载js文件有关 待优化,不过据说htmlunit对js支持不太好
3.试了几个版本发现都须要httpclient 4.5.2版本。 htmlunit最后用的 2.25最新版的。cookie