- はじめに -
Chrome 59が正式版となりheadless版も正式に動き始めました。めでたい。
New in Chrome 59 | Web | Google Developers
headless chromeをUbuntuに導入してPythonから触ったという記事です。
Ubuntuへの導入から、実行時の引数となるargsの考察などを含みます。
スクレイピング関連記事です。
- インストール -
まず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
Chromeのdebパッケージを取得してきます。
公式ページに行くと、小さな文字で「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してみたら以下のように
多分デフォルトだと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