[BeautifulSoup] Web上のスクレイピング・画像取得

Posted on 2020/02/23 in programming , Updated on: 2020/02/23

はじめに

python ライブラリの BeautifulSoup, requests を利用した web 上の画像取得方法の紹介。ライブラリの基本的な使い方は、別記事を参照。

インポート

In [2]:
import requests
from bs4 import BeautifulSoup

準備

取得する画像を含む(画像が複数でも可)サイトの URL から HTML 情報を取得(パース)する。

In [3]:
URL = 'https://www.sairablog.com'

soup = BeautifulSoup(requests.get(URL).content, 'lxml')

soup 内の img タグに画像が実際に保存されている場所へのリンク情報が含まれている。そこで、soup.find_all('img') ですべての img タグを取得し、そのリンク先から画像の src タグを取得する。
取得した複数画像を保管する空のリストを作成し、そのリストへ URL 内の画像コンテンツを保存して行く。

In [8]:
# src リスト
srcs = []

# 画像の拡張子が、.jpg, .png, jpeg いずれの場合も取得
for link in soup.find_all('img'):

    if link.get('src').endswith('.jpg'):
        srcs.append(link.get('src'))
        
    elif link.get('src').endswith('.png'):
        srcs.append(link.get('src'))
        
    elif link.get('src').endswith('.jpeg'):
        srcs.append(link.get('src'))

srcs を表示すると、各画像へのリンク先情報が保管されていることがわかる。

In [11]:
srcs
Out[11]:
['https://www.sairablog.com/theme/img/profile.png',
 'https://saira1920.github.io/images/logos/kaggle.png',
 'https://saira1920.github.io/images/logos/kaggle.png',
 'https://saira1920.github.io/images/logos/kaggle.png',
 'https://saira1920.github.io/images/logos/pandas.png',
 'https://saira1920.github.io/images/logos/matplotlib.png',
 'https://saira1920.github.io/images/logos/python.png',
 'https://saira1920.github.io/images/logos/jupyter.png',
 'https://saira1920.github.io/images/logos/scipy.png',
 'https://saira1920.github.io/images/logos/kaggle.png',
 'https://saira1920.github.io/images/logos/kaggle.png',
 'https://saira1920.github.io/images/logos/sklearn.png',
 'https://saira1920.github.io/images/logos/kaggle.png',
 'https://saira1920.github.io/images/logos/kaggle.png',
 'https://saira1920.github.io/images/logos/kaggle.png',
 'https://saira1920.github.io/images/logos/pandas.png']

これらのリンクを requests モジュールに、ひとつひとつ渡し、.get メソッドで画像を取得する。下記例では、保存先を images フォルダとして、保存する画像の名称を、一つ目を 「100 + 元画像の拡張子」として、移行は、101, 102,,, としている。

In [12]:
save_path = './images/'

for i, image in enumerate(srcs):
    re = requests.get(image)
    i += 100
    with open(save_path + f'{i}' + image.split('.')[-1], 'wb') as f:
        f.write(re.content)

最後に、必要であれば画像を保存したフォルダーを zip 化する。

In [ ]:
import shutil

shutil.make_archive('images/', 'zip', root_dir='./')