WebDriverException:消息:服务 chromedriver 意外退出.状态码是:127
问题描述
我想在我的服务器上使用 selenium 构建我的爬虫.
I'd like to construct my crawler using selenium on my server.
因此我已经在我的 Ubuntu17.10 服务器上安装/下载了所需的依赖项,例如 chromedriver、chromium-browser 等
Thus I had installed/download required dependencies- such as chromedriver, chromium-browser etc on my Ubuntu17.10 server
但是,当我运行以下代码时:
However, when I run following code:
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
兴奋是什么意思..?
我不知道那个错误代码的初衷是什么,从哪里开始修复它.
I can't get what the original intention of that error code and where to start to fix it.
这看起来非常罕见.
可能相关:
我已经在我的桌面上安装了 ubuntu desktop 17.10,但未能获得 GUI 启动.因此我只使用终端,但到目前为止效果很好.我已经将 ssh 和远程控制 jupyter notebook 从我的 mac 安装到服务器桌面,而这些错误来自它.希望此信息与解决此错误相关,否则将中止它.
I had install ubuntu desktop 17.10 on my desktop but failed to get GUI boot. Thus I am just using terminal only, but it well works so far. I had installed ssh and remote controlling jupyter notebook from my mac to server desktop, and those errors comes from it. Hope this info is relevant to solve this error, otherwise will abort it.
解决方案
看来 chromedriver
需要一些额外的库.这为我解决了这个问题:
It seems chromedriver
needs some extra libraries. This solved the issue for me:
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 的服务器/VM 进行类似的设置.
I was working on a similar setup using a docker container instead of a server/VM without X / GUI.
为了弄清楚需要哪些依赖项,我反复尝试从命令行运行它,如下所示:/opt/chromedriver/2.33/chromedriver --version
一遍又一遍.
To figure out which dependencies are required I tried iteratively to run it from the command line like this: /opt/chromedriver/2.33/chromedriver --version
over and over again.
然后我每次都使用 apt-cache search <STUFF>
和 apt-cache madison <STUFF>
等命令来找出确切的版本chromedriver
2.33 所需的 deb
包(在我的情况下,但我想类似的东西适用于任何版本的 chromedriver
).
Then at eache time I used commands like apt-cache search <STUFF>
and apt-cache madison <STUFF>
to figure out the exact version of the deb
package needed by chromedriver
2.33 (in my case, but I guess something similar would work for any version of chromedriver
).
编辑
正如评论中所建议的,使用 ldd
命令打印共享对象依赖关系可能是另一种选择.到今天为止,我的 chromedriver
版本在原始答案几年后是 83.0.4103.14
- 依赖项也不同,但请参阅下文以了解可能发生的情况失踪:
As suggested in the comments, using the ldd
command to print shared object dependencies may be another option. As of today my chromedriver
version after a few years from the original answer is 83.0.4103.14
- the dependencies are different as well, but see below to get an idea of what could be missing:
$ /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 prints the shared objects (shared libraries) required by each program or shared object specified on the command line.
...
在通常情况下,ldd 调用标准动态链接器(参见 ld.so(8))将 LD_TRACE_LOADED_OBJECTS 环境变量设置为 1.这使动态链接器检查程序的动态依赖项,并查找(根据 ld.so(8) 中描述的规则)并加载满足这些依赖关系的对象.对于每个依赖关系,ldd 显示匹配对象的位置和(十六进制)加载它的地址.
In the usual case, ldd invokes the standard dynamic linker (see ld.so(8)) with the LD_TRACE_LOADED_OBJECTS environment variable set to 1. This causes the dynamic linker to inspect the program's dynamic dependencies, and find (according to the rules described in ld.so(8)) and load the objects that satisfy those dependencies. For each dependency, ldd displays the location of the matching object and the (hexadecimal) address at which it is loaded.
相关文章