Pythonista3で「Requests」を利用してインターネットにアクセスする。
Pythonista3にRequestsライブラリをインストールできたので、まずは「URLを指定してインターネットにアクセスする」という最も基本的な動作をコーディングします。
RequestsのGETメソッド
get ( ) メソッドは、インターネットアクセス先のWebサーバからWebデータを取得するという動作をします。
Yahoo! JAPANのトップページのWebデータ(HTML)を取得するコードです。
# requestsライブラリをインポート
import requests
# アクセス先のアドレスを変数に格納
url = 'http://www.yahoo.co.jp'
# getメソッドでWebデータを取得し、変数に格納
rq = requests.get(url)
# 取得したWebデータを出力
print(rq.text)
get ( ) メソッドで取得したWebデータを print ( ) メソッドで出力すると、数百行に及ぶWebサーバからの応答メッセージ(レスポンスメッセージ)が表示されます。
Webページの表示は、HTTPプロトコル(Web上で通信を行うための通信規約)に基づき実行されます。WebブラウザーにWebページが表示される仕組みは以下のとおりです。
(1) WebブラウザーがGETメソッドによりURLを指定してリクエスト(要求)メッセージをWebサーバに送信
(2) Webサーバがレスポンス(応答)メッセージを送信
(3) Webブラウザーは、レスポンスメッセージに含まれるHTMLデータを解析してWebページを表示
(4) Webページに画像などのデータが含まれている場合、ブラウザーは引き続き画像等を取得するためのリクエストを繰り返す
get ( ) メソッドはアクセス先のURLを引数とすることによりWebサーバから送信されたレスポンスメッセージをResponseオブジェクトに格納し、これを戻り値として返します。
Getメソッドの引数
get ( ) メソッドの記述方法は次のとおりです。
response = requests.get(URL, その他任意の引数)
引数として指定できる主な項目は次のとおりです。
Responseオブジェクトのプロパティ
get ( ) メソッドの戻り値として返ってくるresponseオブジェクトには様々な属性値(プロパティ)があります。
HTTPステータスコードは、HTTPプロトコルにおいてWebサーバからのレスポンスの状況を示すコードで、レスポンスメッセージのステータスラインに含まれます。
Web上の画像ファイルを取得
get ( ) メソッドでURLを指定して画像ファイルをダウンロードすることもできます。
# requestsライブラリをインポート
import requests
# ImageライブラリからPIL(Python Imaging Library)をインポート
from PIL import Image
# ダウンロードする画像のURLを変数に格納
url = 'https://assets.st-note.com/production/uploads/images/\
33209381/profile_46b71b523de4ea301ca229bc4e1a38b3.jpg?\
fit=bounds&format=jpeg&quality=45&width=330'
# 画像データを保存するファイル名
file_name = "testimage.jpg"
# getメソッドでWebデータを取得し、responseオブジェクトに格納
response = requests.get(url)
# responseオブジェクトからバイナリデータを取得
image = response.content
# 画像データの保存
with open(file_name, "wb") as file_data:
file_data.write(image)
# 画像ファイルの読み込み、表示
picture = Image.open(file_name)
picture.show()
画像データを扱うため、PIL(Python Imaging Library)というライブラリをインポートします。
ImageライブラリからPIL(Python Imaging Library)をインポート
from PIL import Image
PILは画像データを取り扱うための機能を担うライブラリで、bmp 、tiff 、 gif 、jpg 、png といった主要な画像フォーマットの読み書きに対応しています。
引数に画像ファイルのURLを指定してget ( ) メソッドによりResponseオブジェクトに画像データを格納します。
getメソッドでWebデータを取得し、responseオブジェクトに格納
response = requests.get(url)
画像データはバイナリデータとしてレスポンスメッセージに含まれているため、Responseオブジェクトのcontentメソッドで抽出します。
responseオブジェクトからバイナリデータを取得
image = response.content
ファイル操作を実行するための open関数を使用して取得した画像ファイルを保存します。open関数に「操作対象のファイルパス」と「操作モード」を引数に指定して生成したファイルに画像ファイルのバイナリデータを上書きして保存します。
with open(file_name, "wb") as file_data:
file_data.write(image)
open関数は、引数のファイルパスにデータが存在しない場合は空のファイルを生成します。その中身のないファイルに画像データを書き込んで保存するという処理にしています。
操作モードは、open関数で取り扱うファイルの読み書きに関する方法を指定します。読み出し「r」、書き込み「w」、追記「a」、読み書き「r+」のモードがあり、バイナリデータを操作する場合は「b」を追記します。
保存するファイル名は、ちょっと強引ですが拡張子を指定して保存するという処理にしました。
最後にImageライブラリのopenメソッドで画像ファイルを読み込み、showメソッドで画像ファイルを表示します。ダウンロードした画像ファイルは、Scriptフォルダ直下に保存されます。
しかし、このコードでは「指定したURLが誤っている」「指定したURLが画像データではない」「保存するファイル名の重複」といった場合のエラーに全く対応できない不完全なものですので、今後、エラー処理などを勉強しながら改良していこうと思います。
この記事が気に入ったらサポートをしてみませんか?