【Python】Seleniumで安全に画像保存する方法

seleniumによるHTML解析を10倍速くした方法 Pythonの使い方

Seleniumを使ったPythonによるスクレイピングで、イメージファイルをダウンロードをする方法です。ダウンロードのため、もう一回サーバにgetリクエストするのは無駄な気がしたので、ブラウザに表示されているものを保存します。

Seleniumで、画像をファイル保存するサンプル

seleniumには、要素のスクリーンショットを取れる機能があります。これをイメージを持つ要素に対して行い、PNGファイルとして保存します。WEBページ上のJPEG、PNG等の静止画が対象です。

from selenium import webdriver


web_driver = webdriver.Chrome()
web_driver.get("https://yahoo.co.jp")

img_elem = web_driver.find_element_by_css_selector("~ img")
with open(f"out.png", 'wb') as f:
    f.write(img_elem.screenshot_as_png)

表示されるものなら、どのようなファイルフォーマットでも変換なしに、保存できます。WEBページのデザイン変更にも、対処しやすいかと思います。

Seleniumで、画像の上に載っている要素を消すサンプル

イメージ上に被さる様にテキスト文字がのっていることがあります。これを先の方法でスクリーンショットを取ると、テキスト文字もスクリーンショットされます。具合がよくありません。そこで、イメージの上にのっている要素を見つけて、非表示にします。

spanタグがimgタグの上に被さっているとします。spanタグのstyleに”display:none;”を設定すれば非表示にできます。spanタグの要素の特定はseleniumで行い、JavaScriptを使って特定した要素のstyleを書き換えます。

#   イメージ上の要素 非表示にする
span_elem = web_driver.find_element_by_css_selector('~ span')
web_driver.execute_script("arguments[0].setAttribute('style','display: none;')", span_elem)

Seleniumで、イメージをPNG保存するサンプルの全文

from selenium import webdriver


web_driver = webdriver.Chrome()
web_driver.get("https://yahoo.co.jp")

#   取得したいイメージの要素
img_elem = web_driver.find_element_by_css_selector("~ span")

#   イメージ上の要素 非表示にする
span_elem = web_driver.find_element_by_css_selector('~ img')
web_driver.execute_script("arguments[0].setAttribute('style','display: none;')", span_elem)

with open(f"out.png", 'wb') as f:
    f.write(img_elem.screenshot_as_png)

スクリーンショットなので静止画になります。そのため、GIFのような画像には使えないですが、何度もサーバにリクエストを送って、使えなくなるよりかは安全かなと思います。

コメント

  1. […] ブラウザで表示できるイメージが対象の場合、他の方法もあります。 【Python】Seleniumで安全に画像保存する方法 […]

タイトルとURLをコピーしました