PythonはWebスクレイピングに適した言語のうちの一つです。最近ではpuppeteerが登場したことにより、JavaScriptでもWebスクレイピングができるようになってきましたが、Pythonは関連書籍やWebでの情報も豊富、多くのライブラリを組み合わせて使えることから、依然として人気が高いと思います。
今回はPythonとWebブラウザの操作を自動化するSeleniumのラッパーライブラリであるseleneでヘッドレスブラウザによる操作のやり方を説明します。
ヘッドレスブラウザとは
ヘッドレスブラウザといっても新しいブラウザではありません。Webアプリケーションの自動テストで使われる技術で、ブラウザを画面に表示せず動作させることができます。主にChromeとFirefoxでサポートされており、多くの開発現場で採用されています。今回はChromeがインストールされている前提で、Chromeを対象としたやり方の説明となります。
必要なライブラリ「selene」をインストールする
ヘッドレスブラウザを動かすために必要なのはSeleniumラッパーである「selene」というライブラリのみです。下記のコマンドでインストールすることができます。
pip3 install selene
JavaでもSeleniumラッパーとして有名な「Selenide」というのがありますが、seleneはSelenideの移植版であると公式サイトでも記載されています。Java版と使い方は非常によく似ているので、Javaで経験のある方には扱いやすそうです。
サンプルコード
早速サンプルコードから紹介します。下記を実行することで当サイトのトップページのキャプチャを保存してくれます。キャプチャ画像はブラウザページそのものですが、ブラウザが画面に表示されることなく画像が保存されることが分かります。
from selene.browsers import BrowserName
from selene.api import *
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import traceback
def main():
try:
config.browser_name = BrowserName.CHROME
chrome_option = webdriver.ChromeOptions()
chrome_option.add_argument('--headless')
chrome_option.add_argument('--disable-gpu')
driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=chrome_option)
browser.set_driver(driver)
browser.open_url("https://worldis.fun")
driver.save_screenshot('screenshot.png')
browser.quit()
except:
print(traceback.format_exc())
browser.quit()
if __name__ == '__main__':
main()
解説
一番のポイントは下記です。「--headless」オプションを指定することで、ブラウザがヘッドレスで起動するようになります。逆に、このオプションを指定しなければ通常通りブラウザが画面に表示されるようになります。
chrome_option.add_argument('--headless')
下記は以前は必要でしたが、今はなくても動作するようです。不要になったという記述を見つけることができなかったので、いったん載せたままにしておきます。
chrome_option.add_argument('--disable-gpu')
次のコードは管理を便利にしてくれる1行です。通常だと使うブラウザバージョンに合わせてDriverをインストールしなければならないので、ブラウザがバージョンアップすればDriverのバージョンを上げるという管理が必要になります。ChromeDriverManagerを使うことで、その煩わしさから開放されます。「ChromeDriverManager().install()」が重要なのですが、これが最新のDriverをダウンロードし、ローカルにキャッシュしてくれます。
driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=chrome_option)
次はほぼそのままですが、指定したURLを開いてスクリーンショットを"screenshot.png"という名前で保存し、ブラウザを終了しています。
browser.open_url("https://worldis.fun")
driver.save_screenshot('screenshot.png')
browser.quit()
最後に
PythonとChromeに加えて、seleneをインストールするだけで簡単にヘッドレスブラウザを操作することができました。今回は画面キャプチャだけですが、ユーザーが操作することであれば大抵のことができます。テキストボックスに文字を入力したり、ボタンやリンクをクリックしたり、画面をスクロールさせたり、様々なことができます。しかも、ヘッドレスであれば画面に表示されないので、自身の作業を邪魔されることがないので便利です。
ブラウザの操作自体が見えないところで自動化されるなんて楽しいですね。それでは、また。