Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JJUG-2018-Fall-MF2

 JJUG-2018-Fall-MF2

Takeshi Nakamoto

December 15, 2018
Tweet

More Decks by Takeshi Nakamoto

Other Decks in Programming

Transcript

  1. 3 熱海 小田原 新横浜 品川 • 通勤は約1時間 • 終電は品川発22:54 •

    週1でリモート勤務 ◦ 保育園の送迎 ◦ 家事 三島
  2. 対応金融機関 • 銀行、など ・・・ 2279 サイト • カード ・・・ 141

    サイト • 証券、投信、FX・貴金属 ・・・ 87 サイト • ポイント ・・・ 41 サイト • 電子マネー・プリペイド ・・・ 37 サイト • 交通(JAL, ANA) ・・・ 12 サイト • 通販(Amazon, 楽天) ・・・ 10 サイト • 携帯 ・・・ 12 サイト • など ・・・ 計 2678 サイト 7
  3. スクレイピングの課題 エラー内容 Caused by: net.sourceforge.htmlunit.corejs.javascript.EcmaError: TypeError: Cannot find function resolvedOptions

    in object [object DateTimeFormat]. https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions 2012年ごろ策定されたAPI (?) 10
  4. スクレイピングの課題 エラー内容 Caused by: net.sourceforge.htmlunit.corejs.javascript.EcmaError: TypeError: Cannot find function resolvedOptions

    in object [object DateTimeFormat]. https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions 2012年ごろ策定されたAPI (?) 11 エラーになる箇所と同等の処理を実装して回避
  5. ブラウザのヘッドレスモード • 2018年7月当時、ヘッドレスモードがあったのは ◦ Google Chrome v68 ◦ Mozilla Firefox

    v61 • とりあえず Chrome を使うことにした ◦ ブラウザシェアの多い方に 15
  6. Chrome DevTools Protocol Chrome DevTools Protocol(CDP) を使って操作することができる • WebSocket で通信

    • JSON 形式のコマンド 20 https://chromedevtools.github.io/devtools-protocol/
  7. Chrome DevTools Protocol { "method": "Page.navigate", "params": { "url": "https://moneyforward.com/"

    } } ページ遷移コマンド DevTools Protocol エンドポイントに対して、コマンドを渡して操作する 21
  8. Chrome DevTools Protocol DevTools Protocol のみだとけっこう煩雑 22 - 要素を検索 (DOM.performSearch)

    - 検索結果を取得 (DOM.getSearchResults) - 検索結果のボックス情報を取得 (DOM.getBoxModel) - ボックス情報から要素の中心座標を計算 - 中心座標で mousePressed イベントを発火(Input.dispatchMouseEvent) - 中心座標で mouseReleased イベントを発火(Input.dispatchMouseEvent) (注: デバッガ経由での観察結果で、実装の一例です。) ある要素をクリックするために必要な処理
  9. chromedriver chrome/chromium 向けの WebDriver 実装 WebDriver 標準API以外にも、いろんなAPIが定義されている https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver • W3C

    standard endpoints • Json wire protocol endpoints • Extension commands from other specs • ChromeDriver specific extension commands • Commands of unknown origins CDPコマンドを渡すAPIもある 25
  10. CDP / WebDriver の比較 機能(Chromeの場合) CDP WebDriver 多機能 (DevTools でできることができる)

    主にブラウザ操作関連 WebDriver でできることはCDPでもできる 28
  11. CDP / WebDriver の比較 実装(Chromeの場合) CDP WebDriver - ほぼ自前で実装する必要がある (ライブラリはあったが、ライセンスの関係で

    見送った) - 学習コストが高そう (puppetterなどのライブラリの実装を読んで 学んだ) - Selenium が提供するクラスが利用可能 - ドキュメントが豊富 - 事例も豊富 29
  12. 使ってみた感想1 • スクレイピングできなかったサイトができるようになって 単純にうれしい ◦ スクレイピングできないサイトがなくなった感がある • HtmlUnit と比べてそこまで遅くなった感じはない ◦

    ページ遷移時などは速く感じることも ◦ 外部サイトとの通信にかかる時間のほうが大きい ◦ 単純な動作速度よりも、正しいデータを取得できるようになるこ とのほうが重要なため問題ない 40
  13. 使ってみた感想2 • けっこうリソースを消費する(CPU/メモリ) ◦ 同時接続数を増やした場合の負荷がどうなるか ◦ 計測した値を元に調整していく • chrome のバージョンアップなどへの追従はどうするか

    ◦ apt では基本的に最新バージョンしかインストールできない ◦ リポジトリをコピーしてくるなどが必要そう • 既存のライブラリ資産を使えるようにしたい ◦ HtmlUnit 提供のクラスのラッパーなど ◦ 便利メソッドを使えるように改修しないといけない 41
  14. まとめ • HtmlUnit 以外のスクレイピングの選択肢を準備したい ◦ そのためにヘッドレス chrome を使う • Chrome

    DevTools Protocol は使えたら使いたい ◦ ライブラリ整備ができれば • WebDriver 便利 ◦ サクッと使い始められる ◦ chrome のバージョンアップ等の運用に課題 ◦ リソースは結構消費する模様 • 定量的な評価は今後の課題 43