一、事情的起因
之前因专项需要,需要实现爬虫。技术实现采用Selenium,本身是作为一个Web应用程序测试的工具,但是也广泛的被用于爬虫。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可运行于任何支持JavaScript的浏览器上。显然,Selenium非常适合解决上述我们提到的动态网页加载问题。 这里我们主要讲一下Selenium如何在java平台上使用、以及一些使用过程中出现的坑。
二、要说再见的PhantomJS
这里需要解释下,使用Selenium需要准备和注意的东西。首先是Selenium的版本,在最新的版本里已经不再支持PhantomJS。这里需要解释下PhantomJS。
PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVGPhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。
画个重点,PhantomJS可以理解成一个轻量的浏览器,这里有一个无界面(无头)的概念。因为在爬虫中,可能会展开多个标签页,如果要在界面显示,对于机器资源的占用是致命的,所以就需要一个只在程序中打开,但不需要界面显示的浏览器。(最开始的功能测试的时候,还是可以显示界面的,来判断爬虫的代码是否正确)
但是现在的情况是是Selenium,已经不再支持PhantomJS。主要的原因是,Chrome、Firefox等大厂已经出了驱动可以支持无界面(无头)的操作。PhantomJS作为一个小厂的产品,自然就被弃用。目前还只是警告,但后续的版本应该会直接不支持。
UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
于是到了本文的主题,selenium + 浏览器(火狐、Chrome) + 浏览器驱动,三者的版本兼容和匹配现在是一个大坑。
问题描述:
WebDriverException: Message: Service /usr/bin/geckodriver unexpectedly exite.Status code was: 1
上面这个问题,在selenium Firefox官网都没找到对应的解释,资料比较少。
四、Chrome与Firefox
4.1 Chrome
对于主流的浏览器,Chrome有一个版本的对应表
chromedriver版本 | 支持的Chrome版本 |
---|---|
v2.36 | v64-66 |
v2.35 | v62-64 |
v2.34 | v61-63 |
v2.33 | v60-62 |
v2.32 | v59-61 |
v2.31 | v58-60 |
v2.30 | v58-60 |
v2.29 | v56-58 |
v2.28 | v55-57 |
v2.27 | v54-56 |
v2.26 | v53-55 |
v2.25 | v53-55 |
v2.24 | v52-54 |
v2.23 | v51-53 |
v2.22 | v49-52 |
v2.21 | v46-50 |
v2.20 | v43-48 |
v2.19 | v43-47 |
v2.18 | v43-46 |
v2.17 | v42-43 |
v2.13 | v42-45 |
v2.15 | v40-43 |
v2.14 | v39-42 |
v2.13 | v38-41 |
v2.12 | v36-40 |
v2.11 | v36-40 |
v2.10 | v33-36 |
v2.9 | v31-34 |
v2.8 | v30-33 |
v2.7 | v30-33 |
v2.6 | v29-32 |
v2.5 | v29-32 |
v2.4 | v29-32 |
下载chromedriver地址:http://chromedriver.storage.googleapis.com/index.html
目前来看,最新的selenium版本+最新的Chrome+最新的驱动组合是没有问题的。
4.2 Firefox
第二部分是Firefox,这也是上面报错的时,使用的浏览器。firefox与geckodriver对应表,好像没有很明确对应关系,并且一旦不兼容就会报上述的错误,很头疼。Firefox中心提供的是延长支持版(简称“Firefox ESR版”),是专为那些无法或不愿每隔六周就升级一次的企业打造。Firefox ESR 版的升级周期为 42 周,而普通 Firefox 的升级周期为 6 周。
建议还是用回普通版,减少版本兼容上的麻烦。
下载geckodriver地址:https://github.com/mozilla/geckodriver/releases
既然无法有一个对应的表,这里提供一份可行的版本组合。
selenium-server-standlone-3.3.1.jar
geckodriver.exe V.15.0
firefox 48.0.2 /52.0.2