あくまで個人用のメモ。
requests というライブラリを使って、さくっと画像をダウンロードするPythonプログラムを作成する。
python3では urllib.requests
が便利そうだが、python2では使えなさそう(調査不足)なのでこれを利用した。
Cookieなど色々と設定もできるが、アクセスしてDLするだけの簡単なプログラムを作成する。
公式: python-requests
インストール
$ pip install requests
ためしに使ってみる
$ python
>>> import requests
>>> url = "http://docs.python-requests.org/en/master/#"
>>> res = requests(url)
>>> res = requests.get(url)
>>> res.status_code
200
>>> res.headers["content-type"]
'text/html'
>>> res.content
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html xmlns="http://www.w3.org/1999/xhtml">\n <head>\n...
>>> res.text
u'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html xmlns="http://www.w3.org/1999/xhtml">\n <head>\n ...
使い方 (抜粋)
詳しくは The User Guide を参照してください。
1. requestの送り方
URLパラメータを設定したときは、引数paramsに辞書形式で与える。
res = requests.get('http://httpbin.org/get', params={'key':'value'})
print(res.url) #=> http://httpbin.org/get?key=value
post, putでは引数dataでフォーム情報を流すことができる。
res = requests.post('http://httpbin.org/post', data = {'key':'value'})
res = requests.put('http://httpbin.org/put', data = {'key':'value'})
requestの種類に応じたメソッドが用意されている。
res = requests.get('http://httpbin.org/get')
res = requests.post('http://httpbin.org/post', data = {'key':'value'})
res = requests.put('http://httpbin.org/put', data = {'key':'value'})
res = requests.delete('http://httpbin.org/delete')
res = requests.head('http://httpbin.org/get')
res = requests.options('http://httpbin.org/get')
2. レスポンスの処理
以下の変数を参照すればよい。
res = requests.get('http://httpbin.org/get')
# HTML Status Code
response.status_code
# レスポンスのヘッダのContent-Typeを調べる
print res.header["content-type"]
# 取得したデータ(バイナリ)
print res.content
# 取得したデータ(エンコード済み)とエンコーディング
print res.text
print res.encoding
実際に画像をダウンロードしてみよう
入力はURLが羅列されたテキストファイル input.txt
で、出力用ディレクトリ images/
に0.jpg, 1.jpg, 2.jpg, ...の順に画像を出力する。
ところどころ、変てこなコードが混じっているのはご愛嬌ってことで。
import requests
import os
import sys
# 画像をダウンロードする
def download_image(url, timeout = 10):
response = requests.get(url, allow_redirects=False, timeout=timeout)
if response.status_code != 200:
e = Exception("HTTP status: " + response.status_code)
raise e
content_type = response.headers["content-type"]
if 'image' not in content_type:
e = Exception("Content-Type: " + content_type)
raise e
return response.content
# 画像のファイル名を決める
def make_filename(base_dir, number, url):
ext = os.path.splitext(url)[1] # 拡張子を取得
filename = number + ext # 番号に拡張子をつけてファイル名にする
fullpath = os.path.join(base_dir, filename)
return fullpath
# 画像を保存する
def save_image(filename, image):
with open(filename, "wb") as fout:
fout.write(image)
# メイン
if __name__ == "__main__":
urls_txt = "input.txt"
images_dir = "images"
idx = 0
with open(urls_txt, "r") as fin:
for line in fin:
url = line.strip()
filename = make_filename(images_dir, idx, url)
print "%s" % (url)
try:
image = download_image(url)
save_image(filename, image)
idx += 1
except KeyboardInterrupt:
break
except Exception as err:
print "%s" % (err)