スクレイピングやブラウザの自動操作をするときに、Seleniumを使う人が多いと思います。しかしSeleniumを使うにはブラウザのバージョンとdriverのバージョンを合わせる必要があり、少し面倒臭いです。
この記事では、Chrome DevTools Protocol (CDP)を使ってdriverを経由せずPythonからChromeを操作する方法を紹介します。
ライブラリのインストール
今回はPyChromeDevToolsというものを紹介します。他にもpychromeというものもあります。
インストールはpipでできます。
pip install PyChromeDevTools
サンプルコード
まずChromeをdebugging-port経由で起動しておく必要があります。Macの場合は以下のように起動できます。
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 --user-data-dir=./user
次のコードはhttps://qiita.com/ を開くコードです。
import PyChromeDevTools
chrome = PyChromeDevTools.ChromeInterface()
chrome.Network.enable()
chrome.Page.enable()
chrome.Page.navigate(url='https://qiita.com/')
chrome.wait_event("Page.loadEventFired", timeout=60)
ここではCDPのPage.navigateメソッドを使っています。
JavaScriptのコードを実行するときはRuntime.evaluateメソッドを使います。次のコードはhttps://qiita.com/ の1番上の記事をクリックするコードです。
chrome.Runtime.evaluate(expression="document.querySelector('.style-11rvgoz').click()")
私は、Developer Toolでcssセレクタを確認→Console画面でJavaScriptのコードを実行して確認→コピペしてPythonから実行という流れでスクレイピングをよく行なっています。
Chrome DevTools Protocolを使ってChromeを自動操作してHTMLを取得し、Beautiful Soupでパースという流れで複雑なスクレピングも行うことができます。