htmlunit抓取动态网页( jsoup可以用来获取HTML页面并且分析读取页面内容吗?)
优采云 发布时间: 2021-11-14 02:06htmlunit抓取动态网页(
jsoup可以用来获取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可以支持这个功能。
但顾名思义,它并不是一个完整的产品,它仅用于测试以模拟浏览器的行为。
举个例子:
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类似,具体可以参考文档。