end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

google chrome for linux (cui only cent7) を headless で selenium

google chrome for linux は、gui 環境でのみ利用できると思っていましたが、 headless モードであれば、利用できるらしく、驚いた。

install python 3.8 from source & selenium 4

2022/5現在のseleniumの最新は、ver.4.1.5ですが cent7に付属するpython 3.6 では、selenium 4.0.0a7 が最新のようですので python 3.8をsourceからインストール。

$ sudo yum install libffi-devel

$ wget https://www.python.org/ftp/python/3.8.13/Python-3.8.13.tgz
$ tar -xvf Python-3.8.13.tgz 
$ cd Python-3.8.13

$ less README.rst
$ ./configure
$ make
$ make test
$ sudo make install

$ /usr/local/bin/python3 --version
Python 3.8.13

$ sudo /usr/local/bin/pip3 install selenium==4.1.5

install google chrome via yum & font

install google chrome

$ cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)

repository追加

$ sudo 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-ssl.google.com/linux/linux_signing_key.pub
https://rin-ka.net/centos-google-chrome-install/
$ sudo yum install google-chrome-stable

$ google-chrome --version
Google Chrome 101.0.4951.54 

install 日本語 font

$ sudo yum install ipa-gothic-fonts ipa-mincho-fonts \
                   ipa-pgothic-fonts ipa-pmincho-fonts

google-chrome --headless コマンドによる動作確認

以下で、chromeがheadlessモードで起動し、画面キャプチャを取得できます

$ google-chrome --headless \
                --window-size=1200,1600 \
            --no-sandbox \
                --screenshot=screen_capture.png \
            https://www.yahoo.co.jp/

install chromedriver

と言っても、いつも通り、download & 解凍のみです

$ https://chromedriver.storage.googleapis.com/101.0.4951.41/chromedriver_linux64.zip
$ unzip chromedriver_linux64.zip

selenium4 for python3 による 動作確認

#!python3
# -*- coding: utf-8 -*-
import getopt
import sys
import os

from selenium import webdriver # ex. pip install selenium==4.0.0a7
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

driver_path = os.path.join( os.getcwd(), 'chromedriver')

browser_conf = {
    "browser_options" : [
        "--headless",
        "--enable-logging=False",
        #以下、3行はSSLエラー対策らしい
        "--ignore-certificate-errors",
        "--disable-extensions",
        "--disable-print-preview"],
    "implicitly_wait": 10 }

def main():
    browser = init_browser()

    browser.get("https://www.yahoo.co.jp")

    size_w = browser.execute_script("return document.body.scrollWidth;")
    size_h = browser.execute_script("return document.body.scrollHeight;")
    browser.set_window_size(size_w, size_h)
    
    browser.save_screenshot("./screenshot.png")
    
    browser.close()


def init_browser():
    browser_service = Service( executable_path=driver_path )

    browser_opts = Options()
    for tmp_opt in browser_conf["browser_options"]:
        browser_opts.add_argument( tmp_opt )

    browser = webdriver.Edge(service = browser_service,
                             options = browser_opts )
    # 要素が見つかるまで、最大 ?秒 待つ
    browser.implicitly_wait( browser_conf["implicitly_wait"] )
    return browser

if __name__ == '__main__':
    main()