htmlunit抓取动态网页(所说的问题试试)

优采云 发布时间: 2021-12-03 13:10

  htmlunit抓取动态网页(所说的问题试试)

  是的,最后还是用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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线