見出し画像

【無料】instagramのハッシュタグから画像を保存しまくるseleniumのコード

※seleniumを始めたい方向けにruby + selenium webdriverチュートリアルという記事もあります。。


こんにちわ。合同会社ベステンダンク代表の大浦です。


急に...急に...





急にTWICEの画像が大量に欲しくなりました!!!!


・・・すみません、取り乱しました。
さて、皆さんも急に画像が大量に欲しくなることがあると思います。
そんな時にサクッと動かせるやつ作りました。50行足らずです。

構成はこんな感じ
・windows 10
・ruby 2.3.3
・chromedriver最新
・selenium-webdriver最新

instagramはめちゃめちゃソースの変更があるので、明日には使えなくなるかもしれません。
class名とかのメンテナンスはご自分で行ってくださいね。

環境構築は私のブログに書いてあります。ご参考にどうぞ。
windowsならruby + selenium webdriverも環境設定は15分で終わる | katsulog

あと、画像保存用に証明書が必要なのでcacert.pemをコードと同ディレクトリに置いてください。
こちらからダウンロードできます。


ENV["SSL_CERT_FILE"] = "./cacert.pem"

require 'selenium-webdriver'
require 'open-uri'

opt = {}
opt['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/XXXXXXXXXXXXX Safari/XXXXXX Vivaldi/XXXXXXXXXX'

# 画像を保存したいハッシュタグ
hash_tag = "傳谷英里香"

# 保存する枚数
image_count = 10

FileUtils.mkdir_p("./images") unless FileTest.exist?("./images")

d = Selenium::WebDriver.for :chrome
wait = Selenium::WebDriver::Wait.new(:read_timeout => 120)

d.get("https://www.instagram.com/explore/tags/#{hash_tag}/")

wait.until{ d.find_elements(:xpath, '//*[@id="react-root"]/section/main/article/div[2]/div/div[1]/div[1]/a/div').size > 0 }
# 最新の1枚目をクリック
d.find_element(:xpath, '//*[@id="react-root"]/section/main/article/div[2]/div/div[1]/div[1]/a/div').click

i = 1
loop do
  wait.until{ d.find_elements(:xpath, '//*[@class="PdwC2 _6oveC Z_y-9"]').size > 0 }
  # videoだったらスキップ
  if d.find_element(:xpath, '//*[@class="PdwC2 _6oveC Z_y-9"]').find_elements(:tag_name, 'video').size == 0
    image_url = d.find_element(:xpath, '//*[@class="PdwC2 _6oveC Z_y-9"]').find_element(:class, 'FFVAD').attribute("src")
    open("./images/#{i}.jpg", 'wb') do |output|
      open(image_url,opt) do |data|
        output.write(data.read)
      end
    end
    d.find_element(:xpath, '//*[@class="HBoOv coreSpriteRightPaginationArrow"]').click
    i += 1
    if i == image_count + 1
      break
    end
  else
    d.find_element(:xpath, '//*[@class="HBoOv coreSpriteRightPaginationArrow"]').click
  end
end

です。
「TWICEじゃないんかい!!」というツッコミお待ちしております。日本語でもそのままいけるのは便利ですねruby。

インスタに限らずこんな感じのものなら作れるのでお声がけください。
もちろん代金はいただきますけど。。

質問あればコメントいただければと思います。
では温かい年末年始をお過ごしくださいませ。
TWICE!!