Python+Selenium+ChromeでWebサイトのHARを取る

Created 2018年8月22日17:29
Updated 2018年8月23日15:53
Categories Python スクレイピング

Chromeのデベロッパーツールから取れるHARファイルはWebサイトの挙動を見る際にとても役に立ちます。

色々なWebサイトのHARを取得したかったのですが、いちいちWebサイトを開いてデベロッパーツールから取得するのはあまりにも面倒すぎます。

そこで、HARファイルを取得できるスクリプトを作成しました。

環境

  • WIndows 10 Pro 1803 64bit
  • Python 3.6

brousermob-proxy

Seleniumを使ってharを取得する場合、brousermob-proxyを使うと良いようです。

webdriverを作成する際にプロキシとして渡すことで、トラフィック情報などを保持してくれます。

スクリプト

こちらのサイトから、brousermob-proxyのバイナリをダウンロードしてください。

以下スクリプトのproxy_pathに解凍したバイナリのパスを指定して下さい。

from browsermobproxy import Server
from selenium import webdriver
import json
from pathlib import Path
import time


class GetWebPageHar:
    proxy_path = "browsermob-proxy-2.1.4/bin/browsermob-proxy.bat"

    def __init__(self):
        self.server = Server(str(Path(self.proxy_path).absolute()))
        self.server.start()
        self.proxy = self.server.create_proxy()

    def get_har(self, url, output_filename):
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument("--proxy-server={0}".format(self.proxy.proxy))
        chrome_options.add_argument("--ignore-certificate-errors")
        chrome_options.add_argument("--incognito")
        driver = webdriver.Chrome(chrome_options=chrome_options)

        self.proxy.new_har("google")
        driver.get(url)
        time.sleep(10)
        har_json = json.dumps(self.proxy.har, indent=4, ensure_ascii=False)
        with open(output_filename, "w") as f:
            f.write(har_json)
        driver.quit()

    def stop(self):
        self.server.stop()


if __name__ == "__main__":
    getter = GetWebPageHar()
    getter.get_har("https://www.google.com", "test_har.json")
    getter.stop()

get_har関数でHARファイルを取得します。

ただ、プロキシ経由なのでSSLエラーが出てしまいます。

かなり気になるので、ガッツリ使う場合は改善したいと思います。

コメントを投稿

コメント