如何使用工具获取动态HTML页面内容
我们知道jsoup可以用来获取HTML页面并且分析读取页面内容。
例如:
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Test {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Document doc = Jsoup.connect("http://www.XXX.com/path/to/page.htm").get();
System.out.println(doc.title());
Elements newsHeadlines = doc.select("#mp-itn b a");
for (Element headline : newsHeadlines) {
System.out.printf("%s\n\t%s",
headline.attr("title"), headline.absUrl("href"));
}
}
}
但是jsoup有一个缺点,即只能访问静态页面,对于动态页面,包括动态加载的元素jsoup无法处理;原因是有些网页为了浏览器的显示效果增加用户体检,并不是一次生成整个页面,而是在页面基本框架显示出来后,使用js/ajax技术动态的刷新填充页面,对于这种页面,简单地说需要解析HTML页面,执行JS代码才能完成整个页面的加载;换句话说就是需要尽可能的模拟浏览器的加载行为。
最近发现HtmlUnit可以支持这个功能。
http://htmlunit.sourceforge.net/
但是正如名字所取的一样,他不是一个完整的产品,只是给测试使用的用来模拟浏览器的行为。
给一个例子:
import java.io.IOException;
import java.util.List;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlListItem;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlUnorderedList;
public class Test {
private static WebClient webClient;
public static void main(String[] args) throws IOException {
//webClient = new WebClient(BrowserVersion.CHROME, "proxy.com", 80);
webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage page = webClient.getPage(""http://www.XXX.com/path/to/page.htm"");
HtmlDivision div1 = page.getHtmlElementById("ksorder");
List<HtmlDivision> divs = div1.getByXPath("//div[@class='sourceshow']");
assert(divs.size() == 1);
HtmlDivision div2 = divs.get(0);
Iterable<DomElement> uls = div2.getChildElements();
for (DomElement eul : uls) {
HtmlUnorderedList ul = (HtmlUnorderedList)eul;
Iterable<DomElement> lis = ul.getChildElements();
for (DomElement eli : lis) {
HtmlListItem li = (HtmlListItem)eli;
System.out.printf("data=[%s], class=[%s]\n", li.getAttribute("data-id"), li.getAttribute("class"));
}
}
}
}
对于HTML页面内容的分析框架和jsoup差不多,具体参考文档即可。