2 flat logo on transparent 256
2018-03-11

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

Photo 355948

Python3はスクレイピングを簡単にできるライブラリが提供されており、非常に簡単にスクレイピングを行うことが可能です。

今回はPython3の外部ライブラリBeautifulSoupを利用して 当サイトのトップページの記事一覧画像をスクレイピングして、ローカルフォルダにダウンロードする方法を解説します。

基本的に以下の内容を進めていけば、当サイトのトップページの画像をローカルに保存できます。

1:BeautifulSoup、requests、lxmlのpipをダウンロード

pip install requests
pip install beautifulsoup4
pip install lxml

requestsはWebページを取得する際に利用します、

beautifulsoup4は取得した要素を分解し、任意の箇所を取り出す処理で利用します。

lxmlはhtmlパーサー

2:以下コードを保存

# 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の画像

3213123123.pn

フォルダは作らなくてもよいですが、自身で指定フォルダが有る際は、コードの下記部分を自身の指定フォルダに変更してください。

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
画像保存が完了しました

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のクラスを指定します。

3123112.png)

for img in soup.find_all('img', class_="img", limit=5):

上記の通りimg要素とclass_="img"で要素を指定しています。classは予約語なので、classを指定する際は

class_

と指定します。その他IDでも指定可能です。

また全記事を指定してスクレイピングすると量が多いのでlimitで、5件のみを取得する設定にしています。

limitを消去すれば全記事の画像を取得します。が 当サイトへ負荷が発生するので、お控え下さい。

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)

以上になります。

その他の関連記事

Python3初心者向け|無料で使えるIDE PyCharmの紹介

Python3でDjangoをインストールし、hellowWoldを表示する

DjangoでMysqlを利用する

起動した際に SyntaxError: Non-ASCII character '\xe3' inというエラーが出る場合は下記記事をご参照下さい

PythonでエラーSyntaxError: Non-ASCII character '\xe3' in

前の記事
次の記事