htmlunit抓取动态网页(所说的问题试试)
优采云 发布时间: 2021-12-03 13:10htmlunit抓取动态网页(所说的问题试试)
是的,最后还是用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()
可以获取页面的输入流,进而获取页面的源代码,这对于网络爬虫项目非常有用。
当然,你也可以从页面中获取更多的页面元素。
很重要的一点是 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