スクレイピングで無限スクロールするときのTips


機械学習するときのデータ収集

機械学習をやっていて、欲しい画像をえるためにスクレイピングで、googleエンジンなどを使うとぶち当たるのは無限スクロールの壁。
ページネーションされていればいいけど・・・
マウスでのスクロールを機械的にする方法はいろいろとあるようですが、
その中で自分の環境でうまくいった方法をお教えします。
多分これが一番早いと思います・・・

実行させるJavescript

まずはスクロール
多くのサイトで挙げられているのが
driver. window.scrollTo(0, window.innerHeight)
ですが、自分は
document.getElementById('b_footer').scrollIntoView(true)
を採用して、フッターのところまでスクロールさせてます。
サイトによってはフッターがなかったり、代わりにToastsがあったりしますが、基本的に一番下のタグを選択できればOKかと

読み込み終了まで待機する

下までスクロールしたら画像が表示するまで待機する必要がありますが、
Seleniumには暗黙的に待つimplicitly_wait()メソッドが用意されていますが、これではうまくいきませんでした。
な、の、で、
time.sleep()でプログラム自体を待機させてます。とあるサイトでは御法度とされてますが・・・

プログラミングコード例

Bing画像検索で画像サムネイルを得るためのコードです。

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.keys import Keys
from time import sleep

keyword="牛丼"

driver = webdriver.Firefox()

url="https://www.bing.com/?scope=images&FORM=Z9LH1"
driver.get(url)

form = driver.find_element_by_name("q")
form.send_keys(Keys.ENTER,keyword,Keys.ENTER)
WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.CLASS_NAME,"mimg"))
)
imgset=set()
for i in range(20):
    print(i)
    #driver.execute_script("window.scrollTo(0,100 );")
    driver.execute_script("document.getElementById('b_footer').scrollIntoView(true)")
    driver.implicitly_wait
    sleep(2)
    img = [ele.get_attribute("src") for ele in driver.find_elements_by_class_name("mimg")]
    imgset |= set(img)

重複を防ぐために画像のurlをセットに格納しています。

最後に

もしいい案があれば教えて下さい。