※当記事はプログラミング初学者がPythonスクレイピングをやってみたの続きを想定しています。
概要
前回の記事で指定したサイトからスクレイピングするところまでは出来ましたが、
画像がローカルにある訳ではなく、スクレイピング先のサイトURLになっているので、
使い勝手に欠けたり、そのまま使うと相手サイトに迷惑がかかる点がございます
(下記の"photo")。
{
"name": "がっつり味噌らーめん",
"description": "めちゃくちゃ美味い",
"price": "850円",
"photo": "https://hogehoge/ramen1.png",
"shop_name": "ラーメン屋の名前を一括挿入"
}
そのため、Pythonを用いてjsonに保存されているURLから画像をローカルに一括保存します。
また、ついでに画像のパスを保存したローカルのものへと変更いたします。
実際のPythonコード
result.jsonが同フォルダで存在するディレクトリにて、下記.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がローカルへと変更されました。
後書き
元々、収集したjsonファイルをwebサイトでデータ表示を考えておりましたが、
その前にこの処理を挟むことで、不必要にスクレイピング先に何度も負担を与えずに済みそうです。
スクレイピングをする時はこのような処理を必須として行っていきたいと思います。
また、より負担を軽減するために、画像を1度取得した場合は、2回目以降スルーすることなども考えて参ります。