Seleniumあれこれ

はじめに

Seleniumでちょっとあれこれした時のメモ

インストール

各種ドライバは環境に合わせて落とす

1$ pip install selenium
2$ wget https://chromedriver.storage.googleapis.com/2.37/chromedriver_win32.zip
3$ unzip chromedriver_win32.zip

今回の要件

スクロールに合わせてコンテンツが読み込まれていくタイプのページで何が読み込まれていったのか知りたい

自動でスクロールさせる

SeleniumでJSを実行させることができるのでJSを流し込んでスクロールさせます

1from selenium import webdriver
2
3driver = webdriver.Chrome()
4driver.get("http://example.com")
5cmd = "document.querySelector(\".example_class\").scrollTo(0, 100);")
6driver.execute_script(cmd)

コンテンツの高さを取得する

同じくjsを実行して取得します
returnすると値をPython側でもらうことができます

1from selenium import webdriver
2
3driver = webdriver.Chrome()
4driver.get("http://example.com")
5cmd = "return document.querySelector(\".example_class\").scrollHeight;")
6height = driver.execute_script(cmd)

バックグラウンドでアクセスしたページを調べる

SeleniumはChromeのみPerformanceへのアクセスができるみたいなのでこれを使います
いろいろデータが取れるので各自確認していただきたいですがコンテンツの取得が完了した際に「Network.responseReceived」というmethodが呼ばれるみたいなのでこれを捕まえます

 1from selenium import webdriver
 2from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
 3
 4caps = DesiredCapabilities.CHROME
 5caps["loggingPrefs"] = {"performance": "ALL"}
 6driver = webdriver.Chrome(desired_capabilities=caps)
 7
 8driver.get("http://example.com")
 9# スクロール処理
10for entry in driver.get_log("performance"):
11    d = json.loads(entry["message"])
12    if d["message"]["method"] == "Network.responseReceived":
13        res = d["message"]["params"]["response"]
14        if d["message"]["params"]["type"] == "Image":
15            print("画像", end="")
16        print(res["url"])

みたいな感じでレスポンスタイプが画像のやつだけ探したりできます