Webアプリケーションやデータ処理においては、URLの解析、HTTP通信、データエンコーディングは非常に重要な技術です。本記事では、Pythonの標準ライブラリであるurllib.parse、urllib.request、base64モジュールを使用して、これらの基本的な操作方法を詳しく解説します。ウェブスクレイピング、APIとの連携、セキュアなデータ変換に役立つ、実践的なテクニックを学んでいきましょう。
urllib.parse
・parse.urlparse(URL)で、URLをプロトコルやホスト、パス、パラメタなど詳細に分解して取得できる。.schemeなどで各要素にアクセスできます。
・parse.parse_qs(URL)では、クエリ文字列を辞書形式で取得できます。
・parse.url_encode(dict)で辞書などを引数に渡すことで、クエリ文字列を作成してくれます。
・parse.quote(URL)では、エンコードしてくれます。
・parse.url_join(url,url)では、urlとパスを結合してくれます。
from urllib import parse
# urlparse(URLを要素ごとに分解)
url = parse.urlparse("https://example.com/test/dir/index.html?key=1&key=こんにちは")
# >>> ParseResult(scheme='https', netloc='example.com', path='/test/dir/index.html', params='', query='key=1&key=こんにちは', fragment='')
# parse_qs(クエリ文字列を辞書に変換)
# keep_blank_valuesは値がない場合に空白を返す
parse.parse_qs(url.query, keep_blank_values=True)
# >>> {'key': ['1', 'こんにちは']}
# url_encode(辞書をクエリに変換)
# doseqを指定すると、複数の要素を持つシーケンスを別々に処理する
parse.urlencode({"key": [1, 2], "key2": "こんにちは"}, doseq=True)
# >>> key=1&key=2&key2=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF
# quote/quote_plus(スラッシュもエンコード)
url = "https://example.com/test/ディレクトリ/index.html"
parse.quote(url)
parse.quote_plus(url)
# >>> https%3A//example.com/test/%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA/index.html
# >>> https%3A%2F%2Fexample.com%2Ftest%2F%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%2Findex.html
# url_join(URLのパスを結合する)
url = "https://example.com"
url2 = "/dir/index.html"
parse.urljoin(url, url2)
# >>> https://example.com/dir/index.html
urllib.request
・複雑な処理はRequestsが使用されるが、軽量な通信であれば利用されるケースもあります。
・request.urlopen(url)でGETメソッドが利用できます。第二引数にdataを渡すことで、POSTメソッドも利用できます。第二引数は、バイトデータを扱うため、文字列を扱う場合はエンコードする必要があります。
・GET、POST以外を使用する場合は、request.Requtest(url,data,method,headers)クラスを指定s、urlopen()の引数に設定します。
from urllib import request
# GETメソッド
res = request.urlopen("https://example.com/get?key1=value1")
res.status
# >>> 200
# POSTメソッド
data = "key1=value1&key2=value2"
res = request.urlopen("https://exapmle.com/post", data=data.encode())
res.status
# >>> 200
# PUT/DELETEメソッドなど
data = "key1=value1&key2=value2"
headers = {"Accept": "application/json"}
req = request.Request(
"https://example.com/other", data=data.encode(), headers=headers, method="DELETE"
)
res = request.urlopen(req)
res.status
# >>> 200
base64
・b64encode(byte)とb64decode(byte)でbase64にエンコード、デコードできます。引数は文字列ではなくバイト列に変換しておく必要があります。
from base64 import b64encode,b64decode
# b64encode
text='12345:abcde'
enc=b64encode(text.encode())
# >>> b'MTIzNDU6YWJjZGU='
# b64decode
dnc=b64decode(enc)
dnc.decode()
# >>> 12345:abcde