CentOS7 上部署 Headless Chrome + Selenium

Selenium 以后将不再支持 PhantomJS 。而 Headless Chrome 越来越被人们接受,俨然有成为事实标准之势。 在 CentOS 7 上部署 Headless Chrome + Selenium 好像比在桌面系统上麻烦一些。是以为记录。

  1. 安装 Chrome

    $ vi /etc/yum.repos.d/google-chrome.repo
    

    写入如下内容并保存:

    [google-chrome]
    name=google-chrome
    baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
    enabled=1
    gpgcheck=1
    gpgkey=https://dl.google.com/linux/linux_signing_key.pub
    

    然后

    $ sudo yum install google-chrome-stable
    
  2. 安装 chromedriver

    这个页面 下载与 Chrome 版本对应的 chromedriver , 解压后把 chromedriver 文件拷贝到 /opt/google/chrome/ 下(或其他你喜欢的路径)。 并确保其在 PATH 中可以找到,比如建个符号链接:

    $ sudo ln -s /opt/google/chrome/chromedriver /usr/bin/
    
  3. ~~安装 Xvfb~~(不再需要了

    $ sudo yum install Xvfb 
    
  4. 安装字体库

    $ sudo yum install libXfont xorg-x11-fonts*
    

    如果缺少这一步,运行最后的示例代码时会出现如下错误:

    selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: crashed
    
  5. 安装 selenium

    如果你使用了虚拟环境,则先进入虚拟环境:

    $ source /path/to/python/venv/activate
    

    如果未使用虚拟环境,则上步可省。

    然后,安装 selenium:

    $ pip install selenium
    
  6. ~~安装 pyvirtualdisplay~~(不再需要了

    $ pip install pyvirtualdisplay
    
  7. 测试一下

    附件中是测试代码,可按如下命令运行。该段代码会输出网页的标题。

    $ ./headless.py http://www.example.com
    

附1: 测试代码

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import sys

from selenium import webdriver


def get_title(url):
    chrome_options = webdriver.ChromeOptions()
    chrome_options.set_headless(True)
    browser = webdriver.Chrome(chrome_options=chrome_options)
    browser.get(url)
    print(browser.title)
    browser.quit()

def main(argv):
    n = int(argv[2]) if len(argv) > 2 else 1
    for i in range(n):
        get_title(argv[1])

if __name__ == '__main__':
    try:
        main(sys.argv)
    except KeyboardInterrupt:
        print ("Crtl+C Pressed. Shutting down.")

# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4

附2: 旧版示例代码:

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import sys
import platform

from selenium import webdriver


def get_title(url):
    chrome_options = webdriver.ChromeOptions()
    chrome_options.set_headless(True)
    browser = webdriver.Chrome(chrome_options=chrome_options)
    browser.get(url)
    print(browser.title)
    browser.quit()

def main(argv):
    if platform.system() == "Linux":
        from pyvirtualdisplay import Display
        Display(visible=0, size=(1920, 1080)).start()

    n = int(argv[2]) if len(argv) > 2 else 1

    for i in range(n):
        get_title(argv[1])

if __name__ == '__main__':
    try:
        main(sys.argv)
    except KeyboardInterrupt:
        print ("Crtl+C Pressed. Shutting down.")

# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4

Creative Commons License Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution 4.0 International license .