Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

headless chromeをPythonのseleniumから動かして引数を考えた (Ubuntu 16.04)

- はじめに -

Chrome 59が正式版となりheadless版も正式に動き始めました。めでたい。

New in Chrome 59  |  Web  |  Google Developers

headless chromeUbuntuに導入してPythonから触ったという記事です。

Ubuntuへの導入から、実行時の引数となるargsの考察などを含みます。



スクレイピング関連記事です。

vaaaaaanquish.hatenablog.com



- インストール -

まずPythonからの起動に必要なchromedriverを取得しておきます。
apt-getでも入りますが最新版が欲しいので以下のように。
(記事書いた当時で最新版は2.29)

wget https://chromedriver.storage.googleapis.com/2.29/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/


依存ライブラリとなるlibappindicator1をインストールしておきます。
事前にやらないとハマるっぽいので、先走ったら後述で入れたChromeをアンインストールしてやり直すのが良いです。

sudo apt-get install libappindicator1


Chromedebパッケージを取得してきます。
公式ページに行くと、小さな文字で「Google Chrome をインストールすると Google レポジトリが追加され、Google Chrome がシステムで自動更新されます。Google のレポジトリを追加したくない場合は、パッケージをインストールする前に「sudo touch /etc/default/google-chrome」を実行してください。」と書かれています。
スクレイピング等ガンガン回したい場合などはやっておくべきでしょう。(やらなくてもOK)

sudo touch /etc/default/google-chrome
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb


以下でインストールします。

sudo dpkg -i google-chrome-stable_current_amd64.deb


この時以下のようなエラーが出るかもしれません。

Errors were encountered while processing:
google-chrome-stable


その時はapt-getでこうしてこう。

sudo apt-get install -f
sudo dpkg -i google-chrome-stable_current_amd64.deb


インストールおわりです。


- Pythonで実行 -

Python3.xを使います。2系は小学生にバカにされるからです。
seleniumのwebdriver配下にchrome.optionsというのがあるのでそれを利用して、--headlessを指定します。

「--disable-gpu」は以下Google曰く現状暫定必須だそうです。
ヘッドレス Chrome ことはじめ  |  Web  |  Google Developers


from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=options)
driver.get('hogehoge.com')
print(driver.page_source)

後はPhontomJS等と同じように使えます。


driver.save_screenshotしてみたら以下のように

f:id:vaaaaaanquish:20170606194222p:plain


多分デフォルトだとUbuntuのフォントが足りず文字化けする。
私は導入済み。以下参考。


 

- パラメータに関する考察 -

Google Chromeはとにかく実行時の引数が多い。

List of Chrome Driver command line arguments – Assert Selenium

ここではスクレイピングに関係しそうなパラメータだけ抜粋して考える。

「--headless」「--disable-gpu」は必須。
SSL周りのエラーを許容するために「--ignore-certificate-errors」を付ける。
実行不可なコンテンツやセキュリティの許容範囲を広げるなら「--allow-running-insecure-content」「'--disable-web-security'」すると良さそうだけど、常用はできそうにない。
デスクトップ通知やExtensionの利用も基本不要だと思われるので「--disable-desktop-notifications」「--disable-extensions」する。
ユーザエージェントの指定は「--user-agent=hogehoge」でダブルクオーテーションで囲まなくても大丈夫。

かつては「--disable-images」なるフラグで画像を読み込まない設定が可能だったけど、バージョン5.0.335.0より使用不能に。
画像をオフにするにはprefsに対してprofileを設定する方法があるよ〜との記述もちらほらある。
こんなやつ

prefs = {"profile.managed_default_content_settings.images":2}
options.add_experimental_option("prefs",prefs)

でもこれではダメで、正解は「--blink-settings=imagesEnabled=false」っぽい。
設定画面でimagesを切りに行くと以下を参考にしたらできた。
https://groups.google.com/a/chromium.org/forum/#!topic/headless-dev/0zD4nAyVoCY


あとは「--lang」で言語の指定。
必要に応じて「--proxy-server」などを利用する。

例えばこんな感じ

from selenium import webdriver

options = webdriver.ChromeOptions()
# 必須
options.add_argument('--headless')
options.add_argument('--disable-gpu')
# エラーの許容
options.add_argument('--ignore-certificate-errors')
options.add_argument('--allow-running-insecure-content')
options.add_argument('--disable-web-security')
# headlessでは不要そうな機能
options.add_argument('--disable-desktop-notifications')
options.add_argument("--disable-extensions")
# UA
options.add_argument('--user-agent=hogehoge')
# 言語
options.add_argument('--lang=ja')
# 画像を読み込まないで軽くする
options.add_argument('--blink-settings=imagesEnabled=false')
driver = webdriver.Chrome(chrome_options=options)
driver.get('hogehoge.com')
print(driver.page_source)


以下も参考に
起動オプション - Google Chrome まとめWiki
 

 

- おわりに -

今までPythonでWebスクレイピングというとPhontomJSなるブラウザが圧倒的シェアでした。

しかしPhontomJSもなかなかバギーで、プロセスがゾンビ化するなどの問題を抱えていました。

headless chromeに関する日本語ページが更新されるなど、期待が高まっていたここ半年です。

こんな記事も。

www.infoq.com

このままheadless chromeが希望の星となる事を期待しています。