htmlunit抓取动态网页(所说的问题试试)
优采云 发布时间: 2022-01-30 07:11htmlunit抓取动态网页(所说的问题试试)
没错,最后我还是用 Selenium 来实现我在上一篇文章中提到的问题。我没有尝试其他任何东西。我只试过火狐引擎。整体效果我还是可以接受的。
继续昨天的话题,既然要实现上一篇提到的问题,就需要一个可以执行js代码的框架。我的首选是htmlunit,先简单介绍一下htmlunit。以下段落摘自互联网。
htmlunit 是一个开源的java页面分析工具。启动htmlunit后,会在底层启动一个非界面浏览器。用户可以指定浏览器类型:firefox、ie等。如果不指定,默认使用INTERNET_EXPLORER_7:
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
只需调用:
HtmlPage 页面 = webClient.getPage(url);
可以获取页面的 HtmlPage 表示,然后通过:
InputStream 是 = targetPage.getWebResponse().getContentAsStream()
可以获取页面的输入流,从而获取页面的源代码,对于网络爬虫项目非常有用。
当然,你也可以从page中获取更多的页面元素。
重要的是,HtmlUnit 提供对执行 javascript 的支持:
page.executeJavaScript(javascript)
执行js后,返回一个ScriptResult对象,通过该对象可以获取执行js后的页面等信息。默认情况下,执行完js后,内部浏览器会进行页面跳转,跳转到执行完js后生成的新页面。如果js执行失败,则不会执行页面跳转。
最后可以通过page.executeJavaScript(javascript).getNewPage()获取执行的页面。也就是说,这里需要人为地执行javascript,这显然不符合我的初衷。另外,我的水平可能太差了。我在爬新浪新闻的页面时总是出错。根据网络上的查询结果,最可能的错误原因是htmlunit在执行一些带参数的请求时,由于参数顺序或者编码问题,请求失败,报错。关键是,运行它后我没有得到我需要的结果。
然后我寻找另一种解决方案。这时,我找到了 SeleniumWebDriver,这是我需要的解决方案。
参考资料和例子,就可以开始使用了。示例代码如下。
<p> 1 File pathToBinary = new File("D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
2 FirefoxBinary ffBinary = new FirefoxBinary(pathToBinary);
3 FirefoxProfile firefoxProfile = new FirefoxProfile();
4 FirefoxDriver driver = new FirefoxDriver(ffBinary,firefoxProfile);
5
6
7 driver.get("http://cq.qq.com/baoliao/detail.htm?294064");
8
9 ArrayList list = new ArrayList();
10 list.add("http://www.sina.com.cn");
11 list.add("http://www.sohu.com");
12 list.add("http://www.163.com");
13 list.add("http://www.qq.com");
14
15 long start,end;
16
17 for(int i=0;i