在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. 其他问题
- 我因为需要解析结果并保存到mysql数据库中。所以还安装了以下一些包:
1
pip3 install requests bs4 pymysql
- 在执行这个脚本的时候,遇到一个与本主题不是太有关的错误。那就是始终提示如下错误:
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
- 执行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)
Comments powered by Disqus.