WebDriverException:消息:服务chromedriver意外退出。状态码为:127。

60

我想使用Selenium在我的服务器上构建爬虫。

因此,我已经在我的Ubuntu17.10服务器上安装/下载了所需的依赖项,例如chromedriver,chromium-browser等。

但是,当我运行以下代码时:

driver = webdriver.Chrome()

它返回以下错误:

---------------------------------------------------------------------------
WebDriverException                        Traceback (most recent call last)
<ipython-input-14-2cdab8938403> in <module>()
----> 1 driver = webdriver.Chrome()

/home/zachary/.local/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py in __init__(self, executable_path, port, options, service_args, desired_capabilities, service_log_path, chrome_options)
     66             service_args=service_args,
     67             log_path=service_log_path)
---> 68         self.service.start()
     69 
     70         try:

/home/zachary/.local/lib/python3.6/site-packages/selenium/webdriver/common/service.py in start(self)
     96         count = 0
     97         while True:
---> 98             self.assert_process_still_running()
     99             if self.is_connectable():
    100                 break

/home/zachary/.local/lib/python3.6/site-packages/selenium/webdriver/common/service.py in assert_process_still_running(self)
    109             raise WebDriverException(
    110                 'Service %s unexpectedly exited. Status code was: %s'
--> 111                 % (self.path, return_code)
    112             )
    113 

WebDriverException: Message: Service chromedriver unexpectedly exited. Status code was: 127

什么意思它被“excited”了?

我不知道这个错误代码的原始意图是什么,也不知道从哪里开始修复它。

这似乎是一个非常罕见的情况。

可能相关:

我在我的台式机上安装了Ubuntu桌面版17.10,但无法获得GUI引导。因此,我只能使用终端,但目前它运行良好。 我已经安装了ssh和远程控制jupyter笔记本电脑从我的Mac到服务器台式机,并且这些错误来自于它。 希望这些信息有助于解决这个错误,否则将会放弃它。

14个回答

61

看起来 chromedriver 需要一些额外的库。这对我解决了问题:

apt-get install -y libglib2.0-0=2.50.3-2 \
    libnss3=2:3.26.2-1.1+deb9u1 \
    libgconf-2-4=3.2.6-4+b1 \
    libfontconfig1=2.11.0-6.7+b1

我正在使用Docker容器而不是服务器/虚拟机来设置类似的环境,没有X/GUI界面。

为了找出所需的依赖项,我尝试通过命令行反复运行像这样的命令:/opt/chromedriver/2.33/chromedriver --version

然后每次我都使用像apt-cache search <STUFF>apt-cache madison <STUFF>这样的命令来找出chromedriver 2.33所需的deb包的确切版本(在我的情况下,但我猜任何版本的chromedriver也会有类似的方法)。

编辑

如评论中建议的那样,使用ldd命令打印共享对象依赖关系可能是另一种选择。截至今天,我的chromedriver版本已经几年了,是83.0.4103.14 - 依赖项也不同,但请参见以下内容以了解可能缺少的内容:

$ /usr/local/bin/chromedriver --version
ChromeDriver 83.0.4103.14 (be04594a2b8411758b860104bc0a1033417178be-refs/branch-heads/4103@{#119})
$ ldd /usr/local/bin/chromedriver
        linux-vdso.so.1 (0x00007fffff7f0000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f414739d000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f414737a000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f414736f000)
        libglib-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f4147246000)
        libnss3.so => /usr/lib/x86_64-linux-gnu/libnss3.so (0x00007f41470f7000)
        libnssutil3.so => /usr/lib/x86_64-linux-gnu/libnssutil3.so (0x00007f41470c4000)
        libnspr4.so => /usr/lib/x86_64-linux-gnu/libnspr4.so (0x00007f4147082000)
        libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f4146f45000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4146df6000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4146ddb000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4146be9000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f4147e56000)
        libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f4146b76000)
        libplc4.so => /usr/lib/x86_64-linux-gnu/libplc4.so (0x00007f4146b6d000)
        libplds4.so => /usr/lib/x86_64-linux-gnu/libplds4.so (0x00007f4146b68000)
        libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f4146b3e000)
        libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f4146b38000)
        libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f4146b30000)
        libbsd.so.0 => /usr/lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f4146b14000)

来自man ldd

ldd会打印出在命令行中指定的每个程序或共享对象所需的共享对象(共享库)。

...

通常情况下,ldd会调用标准的动态链接器(参见 ld.so(8)),并将 LD_TRACE_LOADED_OBJECTS 环境变量设置为1。这将导致动态链接器检查程序的动态依赖关系,并找到(根据 ld.so(8) 中描述的规则)满足这些依赖关系的对象并加载它们。对于每个依赖项,ldd都会显示匹配对象的位置和其加载的十六进制地址。


18
我特别欣赏您描述如何解决依赖关系(使用--version运行),以及如何使用apt-cache search。这真的对我有很大帮助,谢谢! - Sam
1
FYI:我基本上遵循了这个解决方案,只是版本号现在已经过时了。像这样使用基本引用下载对我有用: libglib2.0-0 \ libnss3 \ libgconf-2-4 \ libfontconfig1 \我正在docker中运行,所以我还需要添加curl -LO $CHROMIUM_DRIVER_LOCATION unzip chromedriver_linux64.zip到我的入口点,并以无头模式运行我的驱动程序。 - aaron
2
我不确定是否有更好的方法,但查看所需库的另一种方法是使用ldd。例如:ldd /opt/chromedriver/x.xx/chromedriver,它将显示一个.so文件列表。搜索未找到的文件。这至少是一个较少迭代的过程。 - Codebling

31

在我的 VPS 上使用 selenium/chromedriver 时,我遇到了相同的错误。我安装了 chromium-browser,问题就解决了。

sudo apt-get install -y chromium-browser
也许不需要 chromium-browser,但是它附带的包已经安装了。然而这只是一个快速解决方法。

也许不需要chromium-browser,但随它一起安装的软件包可能是必需的。但这只是一个快速的解决方案。


3
软件包chromium-browser不可用,但被另一个软件包所引用。 这可能意味着该软件包已丢失、已过时或仅能从其他资源获得。 - JulienD
3
对于像@JulienD一样遇到相同问题的任何人,请尝试使用sudo apt-get install -y chromium。更多信息请访问https://dev59.com/klYN5IYBdhLWcg3wlZB7#65586840。 - thlik

27

运行以下命令进行故障排除:./chromedriver(其中包含您的chrome driver二进制文件)。

可能会出现如下错误:

./chromedriver:在加载共享库libnss3.so时出错:找不到共享对象文件:没有那个文件或目录

要解决此错误,只需运行:sudo apt-get install libnss3

然后再次检查并查看它是否可以工作:./chromedriver

还可能缺少其他某些软件包。这是详尽的列表:

gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget

您可能不需要所有这些软件包,但您需要的软件包可能在上面的列表中列出。


1
在我的情况下,这个命令有效:sudo apt-get install libnss3。 - B. Kanani
好的,知道了。谢谢@B.Kanani! - Philippe Remy
我找不到可用的软件包。 - Abdul Haseeb
@AbdulHaseeb 这取决于你使用的Linux发行版,但通常sudo apt-get update就可以了。 - Philippe Remy

8

我有过类似的问题,但后来发现我的问题是service_log_path被错误地设置成了指向已删除文件夹的路径。

webdriver.Chrome(executable_path='/path/to/chromedriver', service_log_path='/path/to/existing/folder')

我也遇到了日志路径和文件不存在的同样问题。一旦我创建了日志路径和文件,它就成功了。 - Karthik

5

使用 Selenium v3.11.0ChromeDriver v2.36Chrome v64.x 进行工作时, 您需要从 ChromeDriver - WebDriver for Chrome 下载最新的 ChromeDriver 并将其放置在您的系统中。接下来,在初始化 WebDriverWebBrowser 时,您需要按照以下方式传递参数 executable_path 以及 ChromeDriver 的绝对路径:

from selenium import webdriver

driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
driver.get("http://www.python.org")

1
在执行 brew cask install chromedriver 后,您可以通过 driver = webdriver.Chrome("/usr/local/bin/chromedriver") 在 Python 脚本中初始化。 - s2t2

4
我使用了这样一个脚本来安装Chrome。
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | tee /etc/apt/sources.list.d/google-chrome.list
apt update -y
apt install -y gconf-service libasound2 libatk1.0-0 libcairo2 libcups2 libfontconfig1 libgdk-pixbuf2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libxss1 fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils
apt install -y google-chrome-stable

3
@TPPZ的回答需要更新。
$ apt-get update -y
$ apt-get install -y libglib2.0-0 libnss3 libgconf-2-4 libfontconfig1

1
小心地删除现有的chromedriver并将其更新到更高版本即可解决问题:
  1. 删除所有现有的chromedriver文件
  2. 下载wget https://chromedriver.storage.googleapis.com/2.46/chromedriver_linux64.zip(如果需要,请将2.46替换为更新版本,查看兼容版本请参见此处:http://chromedriver.chromium.org/downloads)
  3. 解压缩后,运行chmod +x chromedriver将其转换为可执行文件
  4. 将其移动到mv -f chromedriver /usr/local/bin/chromedriver 以便它出现在PATH中
这应该可以解决问题。我认为更新不起作用是因为当我第一次尝试更新时,我没有删除旧版本,并且意外地继续使用它。

1
我遇到了与selenium跟踪错误相同的问题:

WebDriverException: 消息:服务chromedriver意外退出。状态码为:127

我的问题是由于在手动运行chromedriver时使用不同版本的chromedriver(版本78)和浏览器(版本79),我会看到段错误(核心已转储)
一旦我更新了我的chromedriver以匹配浏览器,它就能够成功启动。

Starting ChromeDriver 79.0.3945.36 (3582db32b33893869b8c1339e8f4d9ed1816f143-refs/branch-heads/3945@{#614}) on port 9515

只允许本地连接。
请保护ChromeDriver和相关测试框架使用的端口,以防止恶意代码访问。

1
我通过升级Selenium版本解决了这个问题。
对于那些使用conda安装Selenium的人来说,需要注意的是,conda上的最新Selenium版本相对于pip上的版本要落后很多,所以请切换到pip安装方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接