背景

最近在找关于爬虫相关的资料,突然就发现,常用且出名的“Phantomjs宣布终止开发”......
关于终止或者说暂停开发的前因跟后果对于我们来说也只能猜测,大佬的时间还是看不懂的
这里引下别人的看法:


北京时间2018年3月4日1:16(时间上面就这么写吧……gitHub也没有标当地时间……),PhantomJS的作者ariya在PhantomJS的GitHub页面的issue #15344中写道:

由于缺乏积极的贡献,我将会存档该项目。
如果将来我们又重新开发这个项目的话,这个项目还会被取出来。

因此,所有的之前的关于PhantomJS 2.5(由 @Vitallium 提起)和PhantomJS 2.1.x(由 @pixiuPL 提起)的计划也会废弃。接下来,为了防止混淆,上述被废弃的版本的源码和二进制包也会被删除。在未来的通知之前,PhantomJS 2.1.1将会是已知最后的稳定版本。

此处输入图片的描述
作者ariya宣布暂停开发PhantomJS

不过从开源中国发的文章来看,这背后是开发者内部的矛盾。之前核心开发者之一 Vitaly Slobodin 宣布退出,当时就有人对这个项目感到担忧。然后另一位核心开发者 pixiuPL 发布公开信表示,自己已被迫辞任合作者。这应该就是ariya宣布暂停开发的导火索吧。


这些其实都不是重点,当做娱乐新闻看看就好。重点是:Selenium分手PhantomJS
如果出现以下错误:

UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead

那么恭喜你,使用了教新的Selenium版本。新版的Selenium,已经不再支持PhantomJS了。

目前解决方案

使用无头(Headless)的chrome或Firefox

Selenium+Headless Firefox

其实Selenium+Headless Firefox没什么好说的,跟Selenium+Friefox的区别就是实例化的时候传个参数而已。
需要注意的点就是:

  • 本地要有Firefox,不然报找不到载体
  • 本地要有geckodriver,最好再配置一下环境变量

各个语言的示例代码都可以在这个链接里找到,这里就搬运一下python的示例代码吧:

from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support import expected_conditions as expected
from selenium.webdriver.support.wait import WebDriverWait

if __name__ == "__main__":
    options = Options()
    options.add_argument('-headless')  # 无头参数
    driver = Firefox(executable_path='geckodriver', firefox_options=options)  # 配了环境变量第一个参数就可以省了,不然传绝对路径
    wait = WebDriverWait(driver, timeout=10)
    driver.get('http://www.GOogle.com')
    wait.until(expected.visibility_of_element_located((By.NAME, 'q'))).send_keys('headless firefox' + Keys.ENTER)
    wait.until(expected.visibility_of_element_located((By.CSS_SELECTOR, '#ires a'))).click()
    print(driver.page_source)
    driver.quit()

win10和ubuntu下我都测试了没问题,从前实例化一个PhantomJS大约3秒,Headless Firefox的话,7秒左右……其实无伤大雅。

这里友情提示一下新手小伙伴,别每下载一个网页实例化一个webdriver(Firefox or Chrome)然后就close()掉,实例化webdriver的时间也是时间~推荐将下载器做成单例类或将webdirver做类变量。

Selenium+Headless Chrome

Headless模式是Chrome 59中的新特征。
要使用Chrome需要安装chromedriver。
这里提供两个下载地址:原厂,淘宝镜像
照例提供Python的示例:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("https://cnblogs.com/")

其他用法与PhantomJS基本相同。
更多资料请查看官方文档


:以上资料参考自(排名不分先后):