質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

663閲覧

urlの特定箇所の数字を都度変更して大量の画像をダウンロードしたい

misox

総合スコア2

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/13 11:44

編集2023/01/13 13:22

前提

追記:回答者様のご指摘で下記の画像のダウンロードは規約に違反することが分かりました。
国土地理院に規約上問題のない似たサービスがありましたのでそちらで代用することにします。
https://cyberjapandata.gsi.go.jp/xyz/std/14/14553/6455.png


タイル状になった地図画像をPythonで大量にダウンロードしたいです。
例えばこういったurlをうてばurl下部の14553/9927という部分が座標になっていまして任意の画像をダウンロードできます。
https://ktgis.net/kjmapw/kjtilemap/tokyo50/07/14/14553/9927.png

実現したいこと

このpng画像をrequestを使ってダウンロードしたいのですが、座標部分の数字を任意の数値範囲で大量に用意する方法が分かりません。最終的には1455014600/99009950の範囲で画像のダウンロードをしたいと考えています。

Python初心者でどういった機能をつかえばいいのかが分かりません。どういったコマンドを使えばURLの数字部分を変えながら大量の画像をダウンロードできるか教えてほしいです。

イメージ説明

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python

1ソースコード

import os
import pprint
import time
import urllib.error
import urllib.request

def download_file(url, dst_path):
try:
with urllib.request.urlopen(url) as web_file:
data = web_file.read()
with open(dst_path, mode='wb') as local_file:
local_file.write(data)
except urllib.error.URLError as e:
print(e)
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

url = 'https://ktgis.net/kjmapw/kjtilemap/tokyo50/07/14/14553/9927.png'
dst_path = 'a/py-logo2.png'
download_file(url, dst_path)

image = mpimg.imread('a/py-logo2.png')
imgplot = plt.imshow(image)

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

使用上の注意として、

・本サイトの画像ファイル自体を複製してPCやサーバに保存する方法での使用はしないでください。
・本サイトの地図タイル画像を複製して別のサーバーやPCに置き、独自に配信することを禁止します。

とありますので質問者さんの「タイル状になった地図画像をPythonで大量にダウンロードしたいです。」は禁止行為にあたるかと思われます。
データが必要であれば国土地理院等に申請して入手されてはいかがでしょうか?

投稿2023/01/13 12:40

meg_

総合スコア10580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misox

2023/01/13 12:59

回答ありがとうございます。 すいません、使用上の注意は確認しておくべきでした。以後気をつけます。 最終の最終的には外部のアプリからこの地図画像を利用するというのを考えていまして その第一歩として考えていました。(外部アプリケーションでの利用は規約の範囲であれば許可されていますhttps://ktgis.net/kjmapw/tilemapservice.html) 国土地理院にも似たサービスがありました。こちらはダウンロードも規約上問題ないようなのでhttps://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html 画像のダウンロードが必要な練習、実験はそちらで代用することにします。 こちらも座標で取得するのですが繰り返し処理の方法も教えてはいただけないでしょうか? https://cyberjapandata.gsi.go.jp/xyz/std/14/14553/6455.png
guest

0

meg_さんの回答のとおり、やってはだめなことですからだめなのですが、pythonの勉強ということで。

URLも単なる文字列ですので、文字列の操作で生成することができます。
文字列の一部を可変にしたい場合、可変部を変数で表現してf文字列を使うのが簡単でしょう。

python

1for num_a in range(0, 10, 2): 2 for num_b in range (100, 200, 10): 3 print(f'http://sample.com/number/{num_a}/{num_b}'

投稿2023/01/13 14:29

TakaiY

総合スコア12765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misox

2023/01/13 19:15 編集

urlを直接いじれたんですね。 教えてくださってありがとうございます!
guest

0

ベストアンサー

追記:
禁止行為にあたるようなので推奨しません。

順を追って説明します

url = 'https://ktgis.net/kjmapw/kjtilemap/tokyo50/07/14/14553/9927.png'

まず、"14553/9927"の部分をPythonのコードで書き換えられるようにする必要がありますよね。
そのために、この部分を変数で置き換えられるようにします。
例えば以下のようにします

Python

1x=14553 2y=9927 3url = "https://ktgis.net/kjmapw/kjtilemap/tokyo50/07/14/{}/{}.png".format(x,y) 4 5print(url) 6# https://ktgis.net/kjmapw/kjtilemap/tokyo50/07/14/14553/9927.png

その後、このx,yを変化させる必要があります。for文を使います。

Python

1# for文を使って、指定した250個のurlを出力してみる 2for x in range(14550,14601): 3 for y in range(9900,9951): 4 print("https://ktgis.net/kjmapw/kjtilemap/tokyo50/07/14/{}/{}.png".format(x,y)) 5# 出力: 6# https://ktgis.net/kjmapw/kjtilemap/tokyo50/07/14/14550/9900.png 7# https://ktgis.net/kjmapw/kjtilemap/tokyo50/07/14/14550/9901.png 8# ... 9# https://ktgis.net/kjmapw/kjtilemap/tokyo50/07/14/14600/9950.png 10

このようにして、dst_pathについてもurlと同様にパスを決め、ダウンロードします。

Python

1for x in range(14550,14601): 2 for y in range(9900,9951): 3 url = "https://ktgis.net/kjmapw/kjtilemap/tokyo50/07/14/{}/{}.png".format(x,y) 4 dst_path = "a/py-logo2_{}_{}.png".format(x,y) 5 download_file(url, dst_path)

~~

投稿2023/01/13 12:52

編集2023/01/13 13:02
dtn8kp6s

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misox

2023/01/13 13:05

丁寧に教えてくださってありがとうございます! 変数回りの仕様がわからず戸惑っていたのでとても助かりました! 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問