こんにちは
この夏ウクレレにはまるSRE課栩野です。
目次
CentOS7でPython+Selenium+Chromeの動作環境の作成
簡単なブラウザ操作(特定の画面開いてスクリーンショット撮るだけとか)
を自動化するために、自分のPC上にPython+Selenium+Chromeの動作環境を整えて
手動でPythonでSelemiumを実行していたのですが
実行を夜間にスケジューリングして、実行も自動化したいなー
と思ったので、今回はサーバ上にSeleniumの動作環境を構築して実際に実行するところまでやってみます。
Python+Selenium+Chromeの動作環境構築
検証環境
- CentOS Linux release 7.8
Python3系のインストール
まずPythonの3系をインストールしていきます。
CentOSにPython3系をインストールする際、以前は以下の参考サイトのように
Python3系用のリポジトリを準備して、そこからインストールする必要がありましたが
参考:CentOS7にPython3系をインストールする手順
なんとCentOS7.7系以降からは標準リポジトリからyumでPython3.6系をインストール出来るようになったみたいです。
参考:CENTOS7.7でPYTHON3.6をインストールしてみよう
今回実行環境はCentOS7.8なので、標準リポジトリからPythonをインストールします。
CentOS7.7未満のバージョンの場合、問題なければyum updateを実行してからPython3系のインストールお願いします。
// もしCentOS7.7未満の場合、特に問題なければyum updateを実施して最新にします。
yum update
// 現時点ではPython3.6がインストールされます。
yum install python3
Python3系のインストールはこれでOKです。
一応確認しておくと
python -V
-------------
Python 3.6.8
-------------
// 依存関係でpip3もインストールされます。
pip3 -V
-------------
pip 9.0.3 from /usr/lib/python3.6/site-packages (python 3.6)
-------------
問題なくインストールされています。
Seleniumのインストール
次にSeleniumをインストールします。
先ほど依存関係でpip3コマンドも一緒にインストールされているので
pipでSeleniumをインストールします。
pip3 install selenium
一応確認
pip3 show selenium
-------------
Name: selenium
Version: 3.141.0
Summary: Python bindings for Selenium
Home-page: https://github.com/SeleniumHQ/selenium/
Author: UNKNOWN
Author-email: UNKNOWN
License: Apache 2.0
Location: /usr/local/lib/python3.6/site-packages
Requires: urllib3
-------------
こちらも問題なくインストールされました。
Chromeのインストール
最後にCentOS7上にChromeを準備していきます。
インストールのためChromeのレポジトリを設定します。
viで[google-chrome.repo]を作成します。
vi /etc/yum.repos.d/google-chrome.repo
-------------
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=0
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
-------------
作成が完了したら、yumで先ほど設定したレポジトリを使ってChromeをインストールします。
yum install --enablerepo=google-chrome google-chrome-stable
インストールできたことを確認
google-chrome --version
-------------
Google Chrome 84.0.4147.89
-------------
ただSeleniumでChromeを使う場合、これだけではなく
chromedriverをダウンロードする必要があります。
またchromedriverは、先ほどインストールしたChromeとバージョンを合わせる必要があるため
今回はバージョンが84のchromedriverをダウンロードします。
// wgetで該当するバージョンのchromedriverをとってきます。
wget https://chromedriver.storage.googleapis.com/84.0.4147.30/chromedriver_linux64.zip
他のバージョンが必要な場合は以下ダウンロードサイトを確認ください。
参考:chromedriverのダウンロード
ダウンロードができたら、zipを解凍してPATHが通っているディレクトリにコマンドを設置します。
// 解凍(unzipがなければyum install unzip)
unzip chromedriver_linux64.zip
// PATHが通っている場所にchromedriverを移動させます。
mv chromedriver /usr/local/bin/
// 権限を755に変更します。
chmod 755 /usr/local/bin/chromedriver
// 不要になったchromedriverのzipファイルは削除しておきます。
rm chromedriver_linux64.zip
これでchromedriver設定も完了になります。
一応確認しておくと
chromedriver --version
-------------
ChromeDriver 84.0.4147.30
-------------
バージョンも84なので問題なしです。
実際にCentOS7上でSeleniumを実行してみる
Seleniumの動作環境はこれで整いましたので
最後に実際にプログラムを書いて動かしてみようと思います。
今回はとりあえず、ただただgoogleのトップページのスクリーンショットを取得するだけの
プログラムを設置します。
サンプルコード
sample.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# ヘッドレスでの実行が必要になるため、ヘッドレスで必要なオプションを追加します。
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
browser = webdriver.Chrome(options=options)
browser.implicitly_wait(10)
url = "https://google.com"
browser.get(url)
browser.save_screenshot('google.png')
browser.quit()
実行する前に、このままではスクリーンショットを取得した時に日本語フォントが読み込まれずに
文字化けしてしまうので、以下必要なフォントをyumでインストールしておきます。
yum install ipa-pgothic-fonts.noarch
これで準備は整ったのでプログラムを実行すると
python3 sample.py
sample.py と同階層に google.png が保存されるので
FTPやSCP等で自PCに落として確認してみると...
無事にスクリーンショットが取得できました。
あとはスケジューリングして自動実行するために
crontabに設定しておけば、指定した時間にプログラムを実行してスクリーンショットを取得できます。
crontab -e
-------------
// 毎日AM01:00に実行する設定
0 1 * * * /usr/bin/python3 /root/sample.py
-------------
あとがき
サーバ上にSeleniumの実行環境を構築することで
Seleniumの実行も日時を指定して、夜間でも自動的に実行できるようにできました。
あとは色々プログラムに手を加えて試してみてください。
参考:CentOS7にPython3系をインストールする手順
参考:CENTOS7.7でPYTHON3.6をインストールしてみよう
参考:chromedriverのダウンロード
参考:CentOS7×Chromeでスクレイピング環境を構築するチュートリアル
運用サービス課 課長
運用・監視の設計から導入まで、運用サービスを担当してます。
運用監視やセキュリティ関連の話題に興味があるので、そのあたりのブログを多めで投稿していきたいと思ってます。
LINK
クラウドベリージャム:プロフィールページ
こんにちは。
CentOS7環境でPython+Selenium+Chromeスクレイピングしたいと思い、記事を参考にさせて頂きました。
しかしながら以下エラーになってしまいます。
pythonファイルを設置する場所の指定などあるのでしょうか?
Python 3.9.9
Google Chrome 105.0.5195.52
ChromeDriver 105.0.5195.52
—————————————–
[root@160-251-78-248 test]# python3 sample.py
Traceback (most recent call last):
File “/root/pyscript/test/sample.py”, line 9, in
browser = webdriver.Chrome(options=options)
File “/usr/local/lib/python3.9/site-packages/selenium/webdriver/chrome/webdriver.py”, line 69, in __init__
super().__init__(DesiredCapabilities.CHROME[‘browserName’], “goog”,
File “/usr/local/lib/python3.9/site-packages/selenium/webdriver/chromium/webdriver.py”, line 92, in __init__
super().__init__(
File “/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py”, line 270, in __init__
self.start_session(capabilities, browser_profile)
File “/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py”, line 363, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File “/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py”, line 428, in execute
self.error_handler.check_response(response)
File “/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py”, line 243, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.
(unknown error: DevToolsActivePort file doesn’t exist)
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Stacktrace:
#0 0x5563678ca693
#1 0x5563676c3b0a
#2 0x5563676e8ef2
#3 0x5563676e41f4
#4 0x55636771f953
#5 0x556367719743
#6 0x5563676ef533
#7 0x5563676f0715
#8 0x55636791a7bd
#9 0x55636791dbf9
#10 0x5563678fff2e
#11 0x55636791e9b3
#12 0x5563678f3e4f
#13 0x55636793dea8
#14 0x55636793e052
#15 0x55636795871f
#16 0x7f095db3daaf
—————————————–
たにちゃん様
ブログをご参考にいただきありがとうございます。
エラーの内容を拝見したところ、恐らくですが
Headlessオプションが有効になっていない可能性がございます。
pyhotnファイルの設置場所には特に指定ありませんので
一度、実行いただいたsample.pyにheadlessのオプションが含まれているか
ご確認いただけますでしょうか。