#機械学習するときのデータ収集
機械学習をやっていて、欲しい画像をえるためにスクレイピングで、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をセットに格納しています。
###最後に
もしいい案があれば教えて下さい。