LoginSignup
2
0

More than 1 year has passed since last update.

【Python初学者】jsonに存在するURLから画像を一括保存し、パスをローカルに書き換える

Last updated at Posted at 2023-05-04

※当記事はプログラミング初学者がPythonスクレイピングをやってみたの続きを想定しています。

概要

前回の記事で指定したサイトからスクレイピングするところまでは出来ましたが、
画像がローカルにある訳ではなく、スクレイピング先のサイトURLになっているので、
使い勝手に欠けたり、そのまま使うと相手サイトに迷惑がかかる点がございます
(下記の"photo")。

result.json
    {
        "name": "がっつり味噌らーめん",
        "description": "めちゃくちゃ美味い",
        "price": "850円",
        "photo": "https://hogehoge/ramen1.png",
        "shop_name": "ラーメン屋の名前を一括挿入"
    }

そのため、Pythonを用いてjsonに保存されているURLから画像をローカルに一括保存します。
また、ついでに画像のパスを保存したローカルのものへと変更いたします。

実際のPythonコード

result.jsonが同フォルダで存在するディレクトリにて、下記.pyを実行します。

get_and_replace_image.py

## モジュールをインポート
import os
import requests
import json

# 画像を保存するためのフォルダ"photo"が存在しなければ、新規作成
if not os.path.exists('./photo'):
    os.mkdir('./photo')

# 対象のjsonファイル"result.json"を読み込みモードで開く
with open('result.json', 'r') as f:
    data = json.load(f)

# forループでurl変数にjsonのリストから"photo"に存在するURLをすべて割り当てる
for i in range(len(data)):
    url = data[i]['photo']
    if url is not None:
        response = requests.get(url)

        # 「photo_"番号"」という名前でjpgファイルを保存
        with open(f'./photo/photo_{i}.jpg', 'wb') as f:
            f.write(response.content)

        # jsonに存在する"phpto"の画像URLをローカルのパスに差し替え
        data[i]['photo'] = f'./photo/photo_{i}.jpg'

# json.dump()関数を使用してjsonファイルを上書き保存
with open('result.json', 'w') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

これにより、"photo"フォルダが作成され、画像が保存されるとともに、
result.jsonの"photo"カラムのURLがローカルへと変更されました。
image.png

後書き

元々、収集したjsonファイルをwebサイトでデータ表示を考えておりましたが、
その前にこの処理を挟むことで、不必要にスクレイピング先に何度も負担を与えずに済みそうです。

スクレイピングをする時はこのような処理を必須として行っていきたいと思います。
また、より負担を軽減するために、画像を1度取得した場合は、2回目以降スルーすることなども考えて参ります。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0