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のような画像には使えないですが、何度もサーバにリクエストを送って、使えなくなるよりかは安全かなと思います。
コメント
[…] ブラウザで表示できるイメージが対象の場合、他の方法もあります。 【Python】Seleniumで安全に画像保存する方法 […]