あらすじ
今回スクレイピングしたいサイトがスクロールバーを
ある程度下まで下げると、まだ読み込まれていない
コンテンツが出力される無限スクロールページだった。
対象データは約3万件。
最下端まで手動で手動でたどってHTMLから抜き出すのも
良いといえば良いけどそんなにヒマではない……
そんなこんなで、Google先生に伺ったところ
下記がヒットしたので備忘で押さえておきたいと思った次第。
下端が存在する無限スクロールを自動化
有限な無限スクロール対策
def endlessScroll():
# 対象ページにアクセス
driver.get(targetURL)
# アクセスできたらとりあえず、全部スクロール
sleep(3)
# 現在のウィンドウの高さを取得
winHeight = driver.execute_script("return window.innerHeight")
# スクロール開始位置の初期化
lastTop = 1
# 無限スクロールページの最下部までループ
while True:
# スクロール前のページの高さを取得
lastHeight = driver.execute_script("return document.body.scrollHeight")
# スクロールの開始位置を設定
top = lastTop
# 最下部まで徐々にスクロールする
while top < lastHeight:
top += int(winHeight * 0.8)
driver.execute_script("window.scrollTo(0, %d)" % top)
sleep(1)
# スクロール後のページの高さを取得
sleep(1)
newLastHeight = driver.execute_script("return document.body.scrollHeight")
# スクロール前後で高さに変化がなくなったら終了
if lastHeight == newLastHeight:
break
# ループが終了しなければ現在の高さを再設定して次のループ
lastTop = lastHeight
流れとしては、
- 起動しているブラウザのスクロールバーの長さを取得
- 現在の下端付近(サンプルでは80%地点)までスクロールを実施
- サイト側で無限スクロールのメソッドが実行される
- 1-3を繰り返すと最下端に到達するので、到達した時点で終了
あとはいい感じに情報をいただいてミッションコンプリート……
わざわざ張り付いてENDキーを延々と押し込む作業から解放されました……
良かったよかった( ˘ω˘ )
※ 都度sleepとか入れてるけど、丸コピだと動かないので
必要なモジュールは都度importしようね。
感謝
見てみて!Python+Selenium で無限スクロールページを自動スクロールする
めっちゃ助かりました。感謝です。