###行いたいこと
個人のスクレイピングの練習としてyoutubeの動画取得を行っております。
最初はNokogiriで特定のチャンネルの動画を取得していたのですが、youtubeのスクロールした後に出てくる動画を
取得できないため、seleniumを使ってみました。
ただseleniumでもスクロール前までの動画しか取得できていない状態です。
考えていることとしては
seleniumでスクロール→表示されたコンテンツを取得→seleniumでスクロール→これらを繰り返し
スクロールできない状態まで繰り返すのかなと考えております。
具体的にどう記述すればよいかわからない状態です。
アドバイスいただけますと幸いです。
controller
1require 'selenium-webdriver' 2 3def show 4 driver = Selenium::WebDriver.for :chrome 5 driver.get 'https://www.youtube.com/channel/UCoFLB_Gw_AoxUuuzKjXrc_Q/videos' 6 7 # URL生成 8 url = "https://www.youtube.com/user/hstsunday/videos" 9 # オプションの生成(ヘッドレスブラウザで動作するように) 10 options = Selenium::WebDriver::Remote::Capabilities 11 options = options.chrome('chromeOptions' => { args: ['--headless'] }) 12 # ドライバーの起動 13 driver = Selenium::WebDriver.for :chrome, desired_capabilities: options 14 # URLへアクセス 15 driver.navigate.to(url) 16 17 18 #driver.find_elementsでxpathに該当する要素を取得(遅延ロードは含まれていない) 19 @video_titles = driver.find_elements(:xpath, "//a['video-title']") 20 21
試してみたコードは以下です。
controller
1 上記driver.navigate.to(url)の後ろに下記のコード追加 2 loop do 3 last_height = driver.execute_script("return document.body.scrollHeight") 4 5 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 6 7 @video_titles = driver.find_elements(:xpath, "//a['video-title']") 8 9 Selenium::WebDriver::Wait.new(timeout: 10) 10 11 new_height = driver.execute_script("return document.body.scrollHeight") 12 if new_height == last_height 13 break 14 end 15 last_height = new_height 16 end
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。