普通web网站的信息,用下载URL的HTML源代码的方式就能满足基本需求,但是当今的使用web2.0技术的网站比较多,像一些电商网站、SNS网站等,在抓取网页的部分信息时,比如评论、滚动、延迟加载等,直接下载HTML源代码,就满足不了需求,需要定制出很多的ajax规则,通过多次请求来完成一个页面的信息收集。在这个情况下,爬虫的代码定制就比较复杂,开发和维护的难度增加。
找了一些支持ajax抓取的开源工具比如 Crawlajax(?),是基于webdriver技术,需要有个界面来辅助,但是爬虫最好是无界面,减少加载时间,减少复杂程度,增加程序的便捷和稳定度,经过一番寻找,有个开源工具能基本满足需求,就是 HtmlUnit.
这个工具集成了Rhino的javascript引擎,能解析HTML,模拟js的执行。通过HtmlUnit打开网页后,能获取当前的DOM结构,能执行js,能点击链接,能提交form表单,最大的优势是无界面。
import java.net.URL;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class Sample {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//设置访问ChromeDriver的路径
final WebClient webClient = new WebClient();
// 构造一个URL,指向需要测试的URL,如http://www.javaeye.com
URL url = new URL("http://item.jd.com/754320.html");
// 通过getPage()方法,返回相应的页面
webClient.getCurrentWindow().setInnerHeight(60000);
webClient.setCssEnabled(false);
HtmlPage page = (HtmlPage) webClient.getPage(url);
System.out.println("InnerHeight:"+webClient.getCurrentWindow().getInnerHeight());
//System.out.println(page.getTitleText());
System.out.println(page.asText());
}
}
特别说明:HtmlUnit的不支持scroll消息,有一些网页是滚动在加载的情况,通过执行js语句让webcontrol滚动到底部,是没有效果的,国外也有人提出这个问题,但没有提供解决办法,折腾了许久,我终于找了一个办法绕过去,就是设置页面的高度为60000,一个很大的值,能容纳所有页面的可视范围,这样就能满足滚动加载的需求(就是让页面不需要滚动就可以了)。