SeleniumでWebスクレイピング(5) 画像の取得
SeleniumでWebスクレイピング(5) 画像の取得
Pillowというライブラリを使って画像を取得してきます。
ローカル画像の読み込み
Pillowを使えばImage.openで読み込めます。
from PIL import Image img = Image.open('img1.jpg') img
画像サイズを確認。
img.size
(1200, 798)
リサイズ。
img2 = img.resize((1024, 768)) img2.size
(1024, 768)
保存。
img2.save('img1_resize.jpg')
Web上の1枚の画像を保存
まずはseleniumのwebdriverを使って、画像のあるページにアクセスします。
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://url/to/the/image')
先ほどのウェブページのスクレイピングと同様に、class名で要素を特定します。
その後、find_element_by_tag_name('img')とget_attribute('src')で画像URLを取得します。
elem = browser.find_element_by_class_name('material') img = elem.find_element_by_tag_name('img') imgurl = img.get_attribute('src') imgurl
ioとurllibモジュールを使ってimgurlの画像をメモリ上にダウンロード
import io from urllib import request f = io.BytesIO(request.urlopen(imgurl).read())
Pillowを使ってダウンロードした画像を開く
from PIL import Image img = Image.open(f) img
保存。
img.save('img1.jpg')
Web上の複数枚の画像を保存
基本的には、1枚画像取得の処理をループで回してやればOK。
ファイル名を連番にするために、for文でenumerateを使ってindexも取得し、それをファイル名に付加するとよいです。
from selenium import webdriver import io from urllib import request from PIL import Image browser = webdriver.Chrome() browser.get('http://url/to/the/image') elems = browser.find_elements_by_class_name('material') for index, elem in enumerate(elems): img = elem.find_element_by_tag_name('img') imgurl = img.get_attribute('src') f = io.BytesIO(request.urlopen(imgurl).read()) img = Image.open(f) img.save('image/img{}.jpg'.format(index))
ご参考
画像を編集する場合は、OpenCVというライブラリが便利らしいです。ぐぐってみてください。