PhantomJS已过时......
背景
最近在找关于爬虫相关的资料,突然就发现,常用且出名的“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基本相同。
更多资料请查看官方文档。
注:以上资料参考自(排名不分先后):