ライブラリ urllib を使って画像保存

Python

・webスクレイピングして画像を保存していく方法

webスクレイピングして画像を取得して保存する方法を紹介します

まずはモジュールをインポート

import urllib
import os

保存先のディレクトリを作成します

osモジュールを使って、download というディレクトリがなければ、現在の作業ディレクトリに作るというコードです

save_dir="download/"
if not os.path.exists(save_dir):
    os.mkdir(save_dir)

まずはwebページから画像の要素の src 属性を取得

img=driver.find_element(By.CSS_SELECTOR,"img['sample']").get_attribute("src")

次のコードでsrc属性の画像データを読み取ります

with urllib.request.urlopen(img) as rf:
    img_data = rf.read()

次のコードのwith openで、ディレクトリ名、ファイル名を記載してwb形式で書き込みます

wb形式とは、書き込みの w と、バイナリの b です

    with open(save_dir + img.jpg,"wb") as wf:
        wf.write(img_data)

最後にgoogle画像検索から画像データを集めて保存するサンプルコードを紹介します

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
import os
import urllib

options = Options()
#ヘッドレスモード
#options.add_argument("--headless=new")
options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(options = options)

#google 画像検索ページにアクセス
driver.get('https://www.google.com/imghp?hl=ja&tab=ri&ogbl')
#画面最大化
driver.maximize_window()

driver.implicitly_wait(10)

keyword="エスプレッソ"

#検索入力、エンターキー操作
driver.find_element(By.NAME, "q").send_keys(keyword)
driver.find_element(By.NAME, "q").send_keys('\ue007')
time.sleep(1)

driver.implicitly_wait(10)

#画面スクロール
"""
height=1000
while height <60000:
    driver.execute_script("window.scrollTo(0,{});".format(height))
    height += 2500
    time.sleep(1)
"""

#待機処理
driver.implicitly_wait(10)

#画像の要素を取得
elements = driver.find_elements(By.CSS_SELECTOR,"g-img[class='mNsIhb']>img[class='YQ4gaf']")

#src属性(画像URL)を取得
img_urls=[]
for img_url in elements:
    url_p=img_url.get_attribute("src")
    img_urls.append(url_p)

#保存フォルダ作成、パス指定
save_dir="download/"
if not os.path.exists(save_dir):
    os.mkdir(save_dir)

#バイナリデータ読み込み、保存
a=1
for img_url in img_urls:
    with urllib.request.urlopen(img_url) as rf:
        img_data = rf.read()
    with open(save_dir + f"{keyword}画像{a}.jpg","wb") as wf:
        wf.write(img_data)
    a=a+1
    time.sleep(1)

driver.quit()

コメント