如何使用工具获取动态HTML页面内容

如何使用工具获取动态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 divs = div1.getByXPath("//div[@class='sourceshow']");
        assert(divs.size() == 1);
        HtmlDivision div2 = divs.get(0);
        
        Iterable uls = div2.getChildElements();
        for (DomElement eul : uls) {
            HtmlUnorderedList ul = (HtmlUnorderedList)eul;
            Iterable 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差不多,具体参考文档即可。

你可能感兴趣的:(如何使用工具获取动态HTML页面内容)