【Python3】Seleniumで画像を保存する方法
おはこんばんにちはせなです。
今回はSeleniumで画像を保存する方法を説明したいと思います。
初めに
例として、youtube.comの動画サムネイルを取得する想定で説明しようと思います。
まず、取得する画像周辺のDOMは以下のような構成となっています。(DOM一部)
<a id="thumbnail" class="yt-simple-endpoint inline-block style-scope ytd-thumbnail" aria-hidden="true" tabindex="-1" rel="null" href="">
<yt-image alt="" ftl-eligible="" notify-on-loaded="" notify-on-unloaded="" class="style-scope ytd-thumbnail" disable-upgrade="" hidden="">
</yt-image>
<yt-img-shadow ftl-eligible="" class="style-scope ytd-thumbnail no-transition" style="background-color: transparent;" loaded=""><!--css-build:shady--><img id="img" class="style-scope yt-img-shadow" alt="" width="9999" src="https://i.ytimg.com/vi/WOoQOd33ZTY/hqdefault.jpg?sqp=-oaymwEcCOADEI4CSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLD4W2gFxjs_VXvzMGoau1G2BlSFyQ"></yt-img-shadow>
</a>
ここで欲しい情報としては以下のimgタグのsrcですね。
<img id="img" class="style-scope yt-img-shadow" alt="" width="9999" src="https://i.ytimg.com/vi/WOoQOd33ZTY/hqdefault.jpg">
これがサムネイルのURLとなります。
こちらを保存したいわけですね。
方法としては二通りあります。
Seleniumのみで保存
Seleniumのみで画像保存したいときには screenshot_as_png
を使用します。
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://www.youtube.com/')
# サムネイル要素の取得
thumbnails = driver.find_elements(By.ID, 'thumbnail')
for index, thumbnail in enumerate(thumbnails):
# imgタグ要素を取得
img = thumbnail.find_element(By.TAG_NAME, 'img')
# urlを取得
src = img.get_attribute('src')
if src:
# ファイルの保存
with open(f'out_{index}.png', 'wb') as f:
f.write(img.screenshot_as_png)
Selenium+Pillowで保存
次にSeleniumとPillowで保存する方法です。
上記との違いはimportが増えた点とwith open以降の処理が変わった点ですね。
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import requests
import io
from PIL import Image
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://www.youtube.com/')
# サムネイル要素の取得
thumbnails = driver.find_elements(By.ID, 'thumbnail')
for index, thumbnail in enumerate(thumbnails):
# imgタグ要素を取得
img = thumbnail.find_element(By.TAG_NAME, 'img')
# urlを取得
src = img.get_attribute('src')
if src:
# 画像のバイト列取得
img_content = requests.get(src).content
# 画像に変換
img_file = io.BytesIO(img_content)
# 画像の表示
img_open = Image.open(img_file)
# 画像の保存
img_open.save(f'out_{index}.png')
最後に
画像の保存方法について説明してみました。
画像をたくさん集めたいときには自動化させると便利なので、参考にしてください。
ではでは〜
ディスカッション
コメント一覧
まだ、コメントがありません