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というライブラリが便利らしいです。ぐぐってみてください。