文章

在CentOS7下使用ChromeDriver

自己写了一个小工具来帮助自己练习听力,所以想自动抓取一些素材。需要使用selenium。在自己的Mac机器写好了,想部到自己的服务器上去,每天定时执行。所以捣鼓了一下如何在linux上执行selenium。

1.系统环境

CentOS 7, x86_64。初始安装后,基本没有安装其他软件包。

2.安装google-chrome

要在selenium中使用chrome。需要安装google-chrome以及chromedriver。

2.1 安装依赖包

1
2
3
4
5
6
7
8
9
# 将系统升级到最新
yum update

# 安装所需要依赖
yum -y install liberation-fonts
yum -y install vulkan
yum -y install redhat-lsb*
yum -y install libXss*
yum -y install libappindicator*

2.2 下载google-chrome测试版本及chromedriver

下载之前,建议阅读一下ChromeDriver使用入门.

注意:: 需要特别注意chrome版本115及更高版本与更早的版本下载地址是不一样的。

下载地址

我选择了下载当前最新的版本:125.0.6422.76。

1
2
wget https://storage.googleapis.com/chrome-for-testing-public/125.0.6422.76/linux64/chrome-linux64.zip
wget https://storage.googleapis.com/chrome-for-testing-public/125.0.6422.76/linux64/chromedriver-linux64.zip

如果提示没有wget命令。安装即可。

1
yum -y install wget

2.3 安装google-chrome及chromedriver

两个安装文件都是zip的压缩包。用unzip命令解压即可。

如果unzip找不到,安装unzip包即可。

1
yum -y install unzip

安装google-chrome:

1
2
3
4
5
6
7
8
9
10
11
12
# 解压
[root@centos ~]# unzip chrome-linux64.zip

# 安装(任何你想放的地方都可以.只是我习惯于放到/usr/local下面)
[root@centos ~]# mv chrome-linux64 /usr/local

# 建立chrome链接
[root@centos ~]# ln -s /usr/local/chrome-linux64/chrome /usr/local/bin

# 检查安装
[root@centos ~]# chrome --version
Google Chrome for Testing 125.0.6422.76

安装chromedriver: 下载完成进行解压,并将可执行文件chromedriver拷到/usr/local/bin目录下即可。

1
2
3
4
5
6
7
[root@centos ~]# unzip chromedriver-linux64.zip
[root@centos ~]# cd chromedriver-linux64
[root@centos ~]# mv chromedriver /usr/local/bin

# 执行以下命令确认完装正确
[root@centos ~]# chromedriver -v
ChromeDriver 125.0.6422.76 (67dcf7562b8fb4ab0819135589e37a97bcc8942c-refs/branch-heads/6422@{#1086})

3. 安装python3以及相应包

centos默认安装python2.7。所以先安装python3.

1
yum -y install python3

5.测试

写一个简单的测试文件testChrome.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from selenium import webdriver
def createDriver():
    options = webdriver.ChromeOptions()
    options.add_argument("--headless")
    options.add_argument("--no-sandbox")
    options.add_argument("--start-maximized")
    options.add_argument("--log-level=3")
    options.add_argument("--ignore-certificate-errors")
    options.add_argument("--window-size=1920,1080")
    options.add_argument(
        "user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36")
    driver = webdriver.Chrome(options=options)
    return driver

def requestBySelenium(driver, url):
    driver.get(url)
    content = driver.page_source
    with open('content.html', 'w', encoding='utf-8') as f:
        f.write(content)
    return content

if __name__ == '__main__':
    url = 'https://www.google.com'
    driver = createDriver()
    content = requestBySelenium(driver, url)
    print(content)
    driver.quit()

执行:

1
python3 testChrome.py

执行会提示,缺少Selenium。安装并再次执行即可。

1
2
pip3 install selenium
python3 testChrome.py

6. 其他问题

  1. 我因为需要解析结果并保存到mysql数据库中。所以还安装了以下一些包:
1
pip3 install requests bs4 pymysql
  1. 在执行这个脚本的时候,遇到一个与本主题不是太有关的错误。那就是始终提示如下错误:
1
UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 152846: ordinal not in range(128)

一看就是一个编码的问题。但是如何解决很犯嘀咕。google了一番也没啥结果。最后还是github copilot帮助解决了。 我把错误抛给它,它返回说应该是系统环境没有正确设置。建议用的locale确认环境。然后,我把locale输出的内容再抛给它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
LANG=en_US.UTF-8 
LC_CTYPE=C 
LC_NUMERIC="en_US.UTF-8" 
LC_TIME="en_US.UTF-8" 
LC_COLLATE="en_US.UTF-8" 
LC_MONETARY="en_US.UTF-8" 
LC_MESSAGES="en_US.UTF-8" 
LC_PAPER="en_US.UTF-8" 
LC_NAME="en_US.UTF-8" 
LC_ADDRESS="en_US.UTF-8" 
LC_TELEPHONE="en_US.UTF-8" 
LC_MEASUREMENT="en_US.UTF-8" 
LC_IDENTIFICATION="en_US.UTF-8" 
LC_ALL=

然后它立马指出是LC_CTYPE的问题。应该将其设为en_US.UTF-8。 修改/etc/environment,将其设置为en_US.UTF-8。重新登录,再执行,问题解决。

1
2
vi /etc/environment
LC_CTYPE=en_US.UTF-8
  1. 执行testChrome.py时,可能遇到如下错误:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Traceback (most recent call last):
  File "testChome.py", line 23, in <module>
    driver = createDriver()
  File "testChome.py", line 11, in createDriver
    driver = webdriver.Chrome(options=options)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
    desired_capabilities=desired_capabilities)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: Chrome failed to start: exited normally.
  (session not created: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /opt/google/chrome/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

这个问题是首先常规版本的chrome后遇到的,后来改装chrome测试版本就正常了。 整个过程我其实做了三次。最后这个问题是第二次执行的时候遇到的。从最后的解决来看,其实最先安装google-chrome的步骤其实是多余的。直接先安装chrome测试版本,再安装chromedriver就可以了。

当前版本是最后经过验证的版本。

注意:有时候,可能因为某些原因找不到chromedriver或chrome。可以通过以下问题解决: 修改以下这一行:

1
driver = webdriver.Chrome(options=options)

修改为:

1
2
3
4
5
# 指定chrome文件的路径
options.binary_location = '/usr/local/chrome-linux64/chrome'
# 指定chromedriver的路径
chrome_driver_binary = '/usr/local/bin/chromedriver'
driver = webdriver.Chrome(executable_path=chrome_driver_binary, options = options)
本文由作者按照 CC BY 4.0 进行授权

Comments powered by Disqus.