行いたいこと
いらすとやの画像より、
複数の画像を一気にダウンロードする。
ということを試してみたいと思います。
例えば以下のようなページの場合、サッカーを行っている画像だけではなく
表示されている全ての画像ファイルが対象となります。
コードを実行すると、↓のように画像ファイルが保存されます。
今回のコードは
下記Python本に記載されている内容を参考に作成しております。
リンク
Pythonコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
import os, time, requests, urllib from bs4 import BeautifulSoup # いらすとや:DL対象のページ get_url = 'https://www.irasutoya.com/2019/09/blog-post_47.html' # 実行フォルダ内に新規で作成するフォルダ名 new_dir = './image-irasutoya' # URLへのアクセス後に解析 > DL を行う def dl_link_img(): # いろいろなサッカーをやる動物のキャラクター のページを渡す html = requests.get(get_url).text # htmlの解析を行う imgs = get_dl_link_img(html) # .pngが複数格納された配列を渡す img_download(imgs) # 取得したHTMLを解析し、imgタグからsrc属性を抜き出す def get_dl_link_img(html): # BeautifulSoupを使用して解析する soup = BeautifulSoup(html, 'html.parser') # imgタグを格納する配列 imgs = [] # htmlの中からimgタグの分だけforを回す for soup_img in soup.find_all('img'): # 'https://xxxx/s1600/logo_sml.png'の形でsrcに格納される src = soup_img['src'] imgs.append(src) return imgs # https://xxxx/s1600/logo_sml.png # https://xxxx/s1600/logo2.png # のような内容がurlsに格納されている def img_download(imgs): # .pyファイルと同フォルダ内にフォルダが未作成なら、新規作成する if not os.path.exists(new_dir): os.mkdir(new_dir) # 複数の画像をダウンロードする for img_url in imgs: # ローカルファイル名を決定 --- (*11) fname = os.path.basename(img_url) save_file = new_dir + '/' + fname # 同名のファイルが存在していたらダウンロードしない if os.path.exists(save_file) == True: print("同名のファイルが存在します") else : # 同名のファイルが存在しない場合ダウンロードする img_get = requests.get(img_url) with open(save_file, 'wb') as fp: fp.write(img_get.content) print("save:", save_file) # ダウンロード時に負荷をかけないように2秒設定 time.sleep(2) # メインで実行した場合 if __name__ == '__main__': dl_link_img() |
解説
最初にDLを行うURLと、
画像を格納するフォルダ名を変数に格納しています。
・フォルダは.pyと同フォルダ内に作成されます。
・同名のフォルダが存在する場合は作成されません。
1 2 3 4 5 |
# いらすとや:DL対象のページ get_url = 'https://www.irasutoya.com/2019/09/blog-post_47.html' # 実行フォルダ内に新規で作成するフォルダ名 new_dir = './image-irasutoya' |
・htmlの中から、find_allで「img」タグを抜き出します
・「img」タグの中から「src」属性を抜き出します
・「src」属性には画像への絶対パスが格納されています
1 2 3 4 5 6 7 8 |
for soup_img in soup.find_all('img'): # 'https://xxxx/s1600/logo_sml.png'の形でsrcに格納される src = soup_img['src'] imgs.append(src) return imgs |
・「imgs」には画像ファイルへの絶対パスが格納されています
・forにて「img」へ1つずつ取り出します
・os.path.basenameを使用して
絶対パスから最後のファイル名のみを取り出します
・1枚画像をDLしたら、サーバーに負荷をかけないように2秒待機しています
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 複数の画像をダウンロードする for img_url in imgs: # ローカルファイル名を決定 --- (*11) fname = os.path.basename(img_url) save_file = new_dir + '/' + fname # 同名のファイルが存在していたらダウンロードしない if os.path.exists(save_file) == True: print("同名のファイルが存在します") else : # 同名のファイルが存在しない場合ダウンロードする img_get = requests.get(img_url) with open(save_file, 'wb') as fp: fp.write(img_get.content) print("save:", save_file) # ダウンロード時に負荷をかけないように2秒設定 time.sleep(2) |
以上です。
最後までお読みいただきありがとうございました!