CentOS + Selenium 用法小结

CentOS + Selenium 用法小结

使用场景

CentOS下使用Selenium,这里的CentOS是指无GUIServer版,其特殊性在于,没有可以供输出的显示界面,除了常见的headless方法以外,还有xvfb等工具可以使用,本文即记录我使用时碰到的一些流程及坑点。

解决方案

1. headless方法的使用

# 以Chrome为例

# 安装selenium
pip install selenium

# 安装chrome-browser
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm --no-check-certificate  
sudo yum install google-chrome-stable_current_x86_64.rpm

# 安装chromedriver:一个用来和chrome交互的接口
sudo yum install chromedriver

# 编写test.py文件
vim test.py
# test.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless') # 16年之后,chrome给出的解决办法,抢了PhantomJS饭碗
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')  # root用户不加这条会无法运行

driver = webdriver.Chrome(chrome_options=chrome_options)
for i in range(10):
    driver.get("https://www.baidu.com/")
    print(driver.title)
driver.close()
# 正常的输出就是10个"百度一下,你就知道"

这个方案中,唯一需要注意的就是--no-sandbox参数的添加,root用户需要注意这点,但是添加以后,访问一些不安全的网站时,容易受到威胁,这需要自己权衡。

2. Xvfb配合使用

In contrast to other display servers, Xvfb performs all graphical operations in virtual memory without showing any screen output.

上面这段话摘自维基百科,简单讲就是,xvfb是一个可以将屏幕的图像输出给放到虚拟内存中的东西,这样一来,在没有GUI的服务器上也能运行一些带图像输出的程序了。

# 安装xvfb
sudo yum update
sudo yum install Xvfb

# 编写test.py文件

# 关于启动,有两种方法可选
# 1. xvfb-run python test.py

# 2. Xvfb :99 & # 给Xvfb开一个指定的显示端口
#    export DISPLAY=:99 # 告诉终端session用哪个端口
#    python test.py
# test.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

driver = webdriver.Chrome()
for i in range(10):
    driver.get("https://www.baidu.com/")
    print(driver.title)
driver.close()
# 正常情况下的输出和前面一样

这里需要注意的就是启动方法中2需要给定监视设备端口,否则chrome是没法启动的,具体表现就是无输出,然后卡住。在安装好Xvfb的前提下,还可以使用xvfbwrapper进行调用,统一在python文件中启动,管理也更方便,使用方法如下。

# pip install pyvirtualdisplay

from selenium import webdriver
from pyvirtualdisplay import Display


display = Display(visible=0, size=(800,600))
display.start()

driver = webdriver.Chrome()
for i in range(10):
    driver.get("https://www.baidu.com/")
    print(driver.title)
driver.close()
# 正常的话输出和第一个方法一样

小结

上述两种方法都能在无界面的服务器上使用,文中不当之处还请指出,以上就是我安装使用过程中的一点记录。

你可能感兴趣的:(Python,CentOS)