Python3で画像をスクレイピングしてローカルに保存する|BeautifulSoupを利用

Python3はスクレイピングを簡単にできるライブラリが提供されており、非常に簡単にスクレイピングを行うことが可能です。
今回はPython3の外部ライブラリである
BeautifulSoupを利用して、
当サイトのトップページの記事一覧画像をスクレイピングして、ローカルフォルダにダウンロードする方法を解説します。
スクレイピングはサイトへの負荷発生が考えられるので、大量情報のスクレイピングには注意をお願いします。
プログラミング初心者 独学者向けに分かりやすく解説できるようこの記事を進めていけば、当サイトのトップページの画像をローカルに保存できます。
サンプルコードを実行する事は問題ないですが、特定のIPから大量にダイレクトアクセスが発生した場合は、 それ相応の対応をさせていただきます。ご注意ください
Rubyの場合は Rubyでサイトをスクレイピングし、ローカルに画像を保存する をご覧ください
関連記事
【初心者・入門者向け】MacでPython3をインストールする方法
1:BeautifulSoup、requests、lxmlのpipをダウンロード
事前にpipを利用して各種ライブラリをダウンロードします。
pip install requests pip install beautifulsoup4 pip install lxml
requestsはWebページを取得する際に利用します
beautifulsoup4は取得した要素を分解し、任意の箇所を取り出す処理で利用します。
lxmlはhtmlパーサーになります。
2:以下コードを保存
サンプルコードを実行する事は問題ないですが、特定のIPから大量にダイレクトアクセスが発生した場合は、 それ相応の対応をさせていただきます。ご注意ください
# coding:utf-8 import requests from bs4 import BeautifulSoup url = 'https://programming-beginner-zeroichi.jp/' # スクレイピングするユーザーエージェントを指定 headers = {'User-Agent':'Mozilla/5.0'} soup = BeautifulSoup(requests.get(url,headers=headers).content,'lxml') images = [] # 画像リストの空配列 for img in soup.find_all('img', class_="img", limit=5): # コンソールへスクレイピング対象の画像URLを表示。特段必須ではない print(img.get("src")) # imagesの空配列へsrcを登録 images.append(img.get("src")) # imagesからtargetに入れる for target in images: re = requests.get(target) with open('/Users/smt/Documents/img/' + target.split('/')[-1], 'wb') as f: # imgフォルダに格納 # .contentで画像データとして書き込む f.write(re.content) # スクレイピング終了確認 print("画像保存が完了しました。")
3: ローカルにimgフォルダを作成
作成されたimgの保存pathは下記になるように設定します
img path:/Users/smt/Documents/img/
pathの画像
フォルダは作らなくてもよいですが、自身で指定フォルダが有る際は、コードの下記部分を自身の指定フォルダに変更してください。
with open('/Users/smt/Documents/img/' + target.split('/')[-1], 'wb') as f:
4:コンソール上で実行
コンソール上で下記が表示されれば、スクレイピングとローカルフォルダへの画像保存が完了しています。
https://s3-ap-northeast-1.amazonaws.com/images.programming-beginner-zeroichi.jp/uploads/2_Flat_logo_on_transparent_256.png https://s3-ap-northeast-1.amazonaws.com/images.programming-beginner-zeroichi.jp/uploads/267569.jpeg https://s3-ap-northeast-1.amazonaws.com/images.programming-beginner-zeroichi.jp/uploads/pc2121.jpg https://s3-ap-northeast-1.amazonaws.com/images.programming-beginner-zeroichi.jp/uploads/createblog1.jpg https://s3-ap-northeast-1.amazonaws.com/images.programming-beginner-zeroichi.jp/pictures/avatars/000/000/089/medium/wwwpic.jpg 画像保存が完了しました。
サンプルコードを実行する事は問題ないですが、特定のIPから大量にダイレクトアクセスが発生した場合は、 それ相応の対応をさせていただきます。ご注意ください
5:各コードの解説
ユーザーエージェントを指定
headers = {'User-Agent':'Mozilla/5.0'}
当サイトはMBとPCでデザインが違う為PCのユーザーエージェントを指定しています。
MBの場合はMBのユーザーエージェントを指定することが可能です。
htmlでパースして取得
.contentで文字列として対象を取得 'lxmlでhtmlをパースします
soup = BeautifulSoup(requests.get(url,headers=headers).content,'lxml')
取得要素を指定
imgタグだけを指定すると全imgを取得してしまうので imgのクラスを指定します。
for img in soup.find_all('img', class_="img", limit=5):
上記の通りimg要素とclass_="img"で要素を指定しています。 classは予約語なので、classを指定する際は
class_
と指定します。その他IDでも指定可能です。
また全記事を指定してスクレイピングすると量が多いのでlimitで、5件のみを取得する設定にしています。
limitを消去すれば全記事の画像を取得します。が 当サイトへ負荷が発生するので、お控え下さい。
特定のIPから大量にダイレクトアクセスが発生した場合は、 それ相応の対応をさせていただきます。ご注意ください
IMG要素のリンクURLを取得する
img.get("src")でimg要素のsrc(URL)を取得します。 images.appendで空配列に対象URLを追加します。
images.append(img.get("src"))
画像を保存する
images配列をtarget変数に格納します。 その後with openで指定フォルダにimg要素を格納し .contentで画像データとして書き込みます。 ※.contentを指定しなければ.textで保存されます。
for target in images: re = requests.get(target) with open('/Users/smt/Documents/img/' + target.split('/')[-1], 'wb') as f: # imgフォルダに格納 # .contentで画像データとして書き込む f.write(re.content)
以上になります。
プログラムを起動した際に SyntaxError: Non-ASCII character '\xe3' inというエラーが出る場合は下記記事をご参照下さい
PythonでエラーSyntaxError: Non-ASCII character '\xe3' in
その他の関連記事
ラズパイ(Raspberry Pi)へOpenCVをインストールして画像解析する
Python3初心者向け|無料で使えるIDE PyCharmの紹介