2014-01-02 from—http://blog.sina.com.cn/s/blog_53f7a75b0101l1jn.html
我用selenium webdriver(以后简称SW)
驱动谷歌浏览器进行网页数据的获取。之所以用谷歌,主要是由于它是轻量级的,速度快。
做数据获取,SW
是不错的选择。有人总是说,SW速度慢,比不上httpclient或者HtmlUnit,它们直接操作底层数据来的更加痛快。可是,不得不考虑的是,网络数据获取是“你情我愿”的事情。你本地的程序运行再快,服务器那边给你CUT!你照样玩不转。所以,只要计算机能力足够强大,SW配合多线程,足以。
是不错的选择。有人总是说,SW速度慢,比不上httpclient或者HtmlUnit,它们直接操作底层数据来的更加痛快。可是,不得不考虑的是,网络数据获取是“你情我愿”的事情。你本地的程序运行再快,服务器那边给你CUT!你照样玩不转。所以,只要计算机能力足够强大,SW配合多线程,足以。
最近遇到一个恼火的问题,就是quit 和close,二者都是关闭浏览器。
ChromeDriver chrome = new ChromeDriver();
chrome.close();
chrome.quit();
二者与什么区别吗?网上评论说,最好用quit而不用close. 因为quit
关闭的更加彻底。可是从各个方面的测看,我都看不出二者的区别。后来在线程池使用中,发现了quit的一个致命问题。
关闭的更加彻底。可是从各个方面的测看,我都看不出二者的区别。后来在线程池使用中,发现了quit的一个致命问题。
由于我是要获取超大量的数据,所以,需要访问海量网址。我计划的是完成一个任务(用一个线程搞定),关闭浏览器,然后开辟另一个线程完成下一个任务。
结果出现了问题:
org.openqa.selenium.os.UnixProcess$SeleniumWatchDog destroyHarder INFO: Command failed to close cleanly. Destroying forcefully (v2)
后来一个高手(估计是维护者)如是说:
that's an INFO logging line, not a warning. It's just saying that the process took too long to finish naturally and so is now being killed with the equivalent of "kill -9"。
这是啥意思?经过我仔细审核自己的代码,我发现,问题处在了QUIT这个方法上。可是,当我对单独测试的时候,结果这个问题又不见了。
因此,可以肯定。chrome.quit();实际上去试图关闭所有的windows,虽然我只用了一个window,但是我之前访问了太多的网页,而没有进行quit和重启我的chrome.这让我的chrome中残留了太多的东西需要clean and close. 在最大允许的时间范围内,quit无法结束chrome,所以只能kill.
出现这个提示后,程序卡住了,不再继续执行。
我不得不说,这是因为SW还不完善。但是,就目前看,多线程调用SW中关闭浏览器的最佳方式是使用close,这样就不会出现上述问题。
我还发现,chrome的方法中没有返回值为boolean的方法(除了equals之外),这一点很不利,因为我需要对chrome进行关闭,开启,切换等。如果不能准别把握chrome的状态,就可能出现很多异常陷阱。比如我想关闭,但是,如果这个chrome根本没开着,就会出现异常。所以,如果能增加一个chrome.isOpen方法,或者chrome.getState方法,就很好了。