【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==&amp;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')

最後に

画像の保存方法について説明してみました。
画像をたくさん集めたいときには自動化させると便利なので、参考にしてください。

ではでは〜

Selenium,Python

Posted by sena