Python urllibの使い方|GET・POST・JSON・エラー処理とurllib3・requestsとの違い
Pythonのurllibは、インストール不要でHTTP通信とURLの処理ができる標準ライブラリです。import urllib.request のようにサブモジュールまで書いて使い、GETは urlopen()、POSTやヘッダーの指定は Request、クエリ文字列の組み立ては urllib.parse.urlencode() で行います。
この記事は、urllibでよく使う処理を1ページで一通り試せるようにまとめた入門です。コードはすべてPython 3.12.15で実行し、実際の出力を載せています(2026年10月18日実行)。個々の関数の細かい使い方は、各見出しから専用の記事へ進めます。
urllibとは|4つのサブモジュール
urllibは4つのモジュールをまとめたパッケージです(Python公式ドキュメント urllib)。
| モジュール | 役割 | よく使うもの |
|---|---|---|
urllib.request |
URLを開いて読む(HTTP通信) | urlopen()、Request |
urllib.parse |
URLの分解・組み立て | urlencode()、urlparse()、quote() |
urllib.error |
urllib.requestが出す例外 | HTTPError、URLError |
urllib.robotparser |
robots.txtの解析 | RobotFileParser |
import urllib だけでは動かない
パッケージ本体だけを読み込んでも、サブモジュールは使えるようになりません。
import urllib
try:
urllib.request.urlopen
except AttributeError as e:
print("AttributeError:", e)
実行結果:
AttributeError: module 'urllib' has no attribute 'request'
import urllib.request や from urllib.parse import urlencode のように、使うサブモジュールを明示してください。
urllib・urllib2・urllib3・requestsの違い
名前が似たものが多く、検索でも混ざりやすいので最初に整理します。
| 名前 | 種類 | インストール | 今の扱い |
|---|---|---|---|
| urllib | Python 3の標準ライブラリ | 不要 | この記事の対象 |
| urllib2 | Python 2の標準ライブラリ | — | Python 3には無い。機能はurllib.requestとurllib.errorへ移った |
| urllib3 | 外部ライブラリ(PyPI) | pip install urllib3 |
最新版は2.8.0(PyPI、2026年10月18日確認) |
| requests | 外部ライブラリ(PyPI) | pip install requests |
内部でurllib3を使う高水準のHTTPクライアント |
urllib3そのものの使い方はurllib3の解説記事、requestsはPython requestsとは?使い方を初心者向けに解説を参照してください。Python公式ドキュメントのurllib.requestのページにも「より高水準のHTTPクライアントインターフェースとして Requestsパッケージ がお奨め」と書かれています。それでもurllibを使うのは、ライブラリを追加できないサーバーや、配布するスクリプトの依存を増やしたくない場合です。
GETでページを取得する|urlopen()
import urllib.request
with urllib.request.urlopen("https://example.com/", timeout=10) as res:
print(res.status, res.headers.get_content_charset())
html = res.read().decode("utf-8")
print(html.splitlines()[0][:40])
print(len(html) > 0)
実行結果:
200 utf-8
<!doctype html><html lang=en><head><meta
True
ポイントは3つです。
withで開くと、読み終わったあと接続が閉じられるread()の戻り値はbytes。文字列にするにはdecode()が要る。文字コードはres.headers.get_content_charset()で確認できるtimeoutを付ける。付けないと、相手が応答しないときにいつまでも待ち続ける
urlopen()の引数や戻り値の詳細はPython urlopen()とは?標準ライブラリでHTTP通信する方法で解説しています。タイムアウトで起きる例外はPython TimeoutErrorの原因と対処法も参考になります。
POSTでJSONを送る|Request
Request に data を渡すとPOSTになり、headers でContent-TypeやUser-Agentを指定できます。送信先には、送った内容をそのまま返すテスト用サービスhttpbin.orgを使いました。
import json
import urllib.request
payload = json.dumps({"name": "techgym", "lang": "python"}).encode("utf-8")
req = urllib.request.Request(
"https://httpbin.org/post",
data=payload, # data を渡すと POST になる
headers={"Content-Type": "application/json", "User-Agent": "my-script/1.0"},
)
print(req.get_method())
with urllib.request.urlopen(req, timeout=10) as res:
body = json.load(res) # レスポンスのJSONを辞書に
print(body["json"])
print(body["headers"]["User-Agent"])
実行結果:
POST
{'lang': 'python', 'name': 'techgym'}
my-script/1.0
data は bytes で渡す必要があるため、json.dumps() の結果を encode("utf-8") しています。レスポンスは json.load(res) でそのまま辞書になります。メソッドを明示したいときは Request(url, data=..., method="PUT") のように書けます。ヘッダーの付け方はPython urllib.request.Requestとは?ヘッダやPOSTを送る方法でさらに詳しく扱っています。
URLを組み立てる・分解する|urllib.parse
from urllib.parse import urlencode, urlparse, parse_qs, quote
query = urlencode({"q": "Python 入門", "page": 2})
url = "https://example.com/search?" + query
print(url)
u = urlparse(url)
print(u.scheme, u.netloc, u.path)
print(parse_qs(u.query))
print(quote("テック ジム/a"))
実行結果:
https://example.com/search?q=Python+%E5%85%A5%E9%96%80&page=2
https example.com /search
{'q': ['Python 入門'], 'page': ['2']}
%E3%83%86%E3%83%83%E3%82%AF%20%E3%82%B8%E3%83%A0/a
urlencode():辞書からクエリ文字列を作る。日本語や空白も変換されるurlparse():URLをスキーム、ホスト、パスなどに分けるparse_qs():クエリ文字列を辞書に戻す(値はリスト)quote():パスの一部などをパーセントエンコードする。/は初期設定では変換されない
f文字列でクエリを連結すると、値に & や = が入ったときに別のパラメータとして解釈されてしまいます。クエリは urlencode() で作るのが安全です。詳しくはPython urlencode()とは?とurllib.parse.quoteとunquoteの使い方をご覧ください。
エラー処理|HTTPErrorとURLError
urllibは、404や500などのエラー応答を受け取ると例外を投げます(requestsは raise_for_status() を呼ばない限り例外にしません)。
import urllib.error
import urllib.request
for url in ["https://httpbin.org/status/404", "https://no-such-host.invalid/"]:
try:
urllib.request.urlopen(url, timeout=10)
except urllib.error.HTTPError as e: # サーバーは返事をした(404・500など)
print("HTTPError", e.code, e.reason)
except urllib.error.URLError as e: # そもそも届かなかった
print("URLError", type(e.reason).__name__)
print(issubclass(urllib.error.HTTPError, urllib.error.URLError))
実行結果:
HTTPError 404 NOT FOUND
URLError gaierror
True
| 例外 | 起きる場面 | 中身 |
|---|---|---|
HTTPError |
サーバーは応答したが、ステータスがエラー(404・500など) | e.code、e.reason |
URLError |
そもそも届かない(名前解決の失敗、接続拒否など) | e.reason(上の例ではsocket.gaierror) |
HTTPError は URLError のサブクラスなので(最後の行の True)、except は HTTPError を先に書きます。逆にすると404も URLError の節で捕まってしまいます。
Python 2のコードを書き換える
古い記事のコードを動かして ModuleNotFoundError: No module named 'urllib2' が出たら、Python 2向けのコードです。次のように置き換えます。
| Python 2 | Python 3 |
|---|---|
urllib2.urlopen() |
urllib.request.urlopen() |
urllib2.Request() |
urllib.request.Request() |
urllib2.HTTPError |
urllib.error.HTTPError |
urllib.urlencode() |
urllib.parse.urlencode() |
urllib.quote() |
urllib.parse.quote() |
urlparse.urlparse() |
urllib.parse.urlparse() |
使い分けの早見表
| やりたいこと | 使うもの |
|---|---|
| ページやAPIをGETする | urllib.request.urlopen(url, timeout=10) |
| JSONをPOSTする、ヘッダーを付ける | urllib.request.Request(url, data=..., headers=...) |
| レスポンスのJSONを読む | json.load(res) |
| クエリ文字列を作る | urllib.parse.urlencode() |
| URLを分解する | urllib.parse.urlparse()、parse_qs() |
| エラーで分岐する | urllib.error.HTTPError → URLError の順で捕まえる |
手元で動かしながら覚えたい方は、テックジムの無料Python講座(ゼロからはじめるPython入門講座)も利用できます。東京本校で毎週土曜13:00〜14:00に開いていて、これまでに全国で2万人以上が参加しています。講座のあとは19時まで自習室を使い、講師に質問できます。
よくある質問
Q. urllibはpip installが必要ですか?
いいえ。urllibはPythonに最初から入っている標準ライブラリなので、インストールは不要です。pip install urllib3 で入るのは別物のurllib3です。
Q. urllibとurllib3の違いは何ですか?
urllibは標準ライブラリ、urllib3はPyPIで配布されている外部ライブラリです。名前は似ていますが別のプロジェクトで、urllib3はコネクションプーリングなどを持ち、requestsの内部でも使われています。
Q. import urllib だけで使えないのはなぜですか?
urllibはパッケージで、import urllib だけではサブモジュールのrequestやparseが読み込まれないためです。import urllib.request のようにサブモジュールまで書きます。
Q. urllib2はPython 3で使えますか?
使えません。Python 2のurllib2の機能は、Python 3ではurllib.requestとurllib.errorに移りました。
Q. requestsとどちらを使うべきですか?
追加インストールできるならrequestsのほうが短く書けます。Python公式ドキュメントも高水準のHTTPクライアントとしてRequestsを勧めています。インストールできない環境や依存を増やしたくないスクリプトではurllibを使います。
まとめ
urllibは標準ライブラリだけでHTTP通信とURL処理を済ませたいときの道具です。import urllib.request とサブモジュールまで書き、GETは urlopen()、POSTは Request、クエリは urlencode()、エラーは HTTPError を先に捕まえる。この4点と timeout の指定を押さえれば、たいていのスクリプトは書けます。
あわせて読みたい
- Python urlopen()とは?標準ライブラリでHTTP通信する方法
- Python urllib.request.Requestとは?ヘッダやPOSTを送る方法
- Python urlencode()とは?URLのクエリ文字列を組み立てる方法
- Python urllib.parse.quoteとunquoteの使い方|quote_plusとの違い・safe引数
- Python requestsとは?使い方を初心者向けに解説|HTTP通信・GET・POST・JSON取得
- Python WEBスクレイピング入門|ライブラリの選び方と実践方法
- Python http.clientとは?低レベルでHTTP通信する方法
- Python ftplibとは?FTPでファイルを転送する方法
- Python webbrowserとは?ブラウザでURLを開く方法




