urllib、urllib2、urllib3とリクエストモジュールの違いは何ですか?


750

Pythonでは、間の違い何ですかurlliburllib2urllib3およびrequestsモジュールは?なぜ3つあるのですか?彼らは同じことをしているようです...


77
リクエストは最高です。
Yarin、2012年

2
はい、リクエストを使用します。stackoverflow.com/questions/22676/...
hughdbrown

75
リクエストはurllib3を使用します。3は大きい番号です
Bro

2
概要:requestsほとんどの時間を使用します。時々urllib2動作しますが、より多くのコードが必要で、エレガントではありません。使用しないでくださいurllib
Trevor Boyd Smith

10
この質問はurllib、Python 3ではさまざまな方法で整理されたさらに別のオプションであることを明確にするために更新する必要があります。しかし、ありがたいことに、公式ドキュメントには、「要求パッケージは、より高いレベルのHTTPクライアントインターフェースに推奨されます。」と記載されています。urllib.request — URLを開くための拡張可能なライブラリ— Python 3.6.3ドキュメント
nealmcb

回答:


714

私はそれがすでに言われたことを知っています、しかし私はrequestsPythonパッケージを強くお勧めします。

Python以外の言語を使用したことがあれば、おそらく考えurllibていurllib2て、使いやすく、コードも多くなく、高度な機能を備えていると私は考えていました。しかし、requestsパッケージは信じられないほど便利で短く、誰もがそれを使用する必要があります。

まず、完全に安らかなAPIをサポートし、次のように簡単です。

import requests

resp = requests.get('http://www.mywebsite.com/user')
resp = requests.post('http://www.mywebsite.com/user')
resp = requests.put('http://www.mywebsite.com/user/put')
resp = requests.delete('http://www.mywebsite.com/user/delete')

GET / POSTかどうかに関係なく、パラメーターを再度エンコードする必要はありません。引数としてディクショナリーを使用するだけなので、問題ありません。

userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}
resp = requests.post('http://www.mywebsite.com/user', data=userdata)

さらに、JSONデコーダーも組み込まれています(ここでも、json.loads()書くことはそれほど多くないことを知っていますが、これは確かに便利です)。

resp.json()

または、応答データが単なるテキストの場合は、次を使用します。

resp.text

これは氷山の一角にすぎません。これはリクエストサイトからの機能のリストです:

  • 国際ドメインとURL
  • キープアライブと接続プーリング
  • Cookieの永続性があるセッション
  • ブラウザスタイルのSSL検証
  • 基本/ダイジェスト認証
  • エレガントなキー/バリューCookie
  • 自動解凍
  • Unicode応答ボディ
  • マルチパートファイルのアップロード
  • 接続タイムアウト
  • .netrcサポート
  • リストアイテム
  • Python 2.6-3.4
  • スレッドセーフ。

32
元の回答が古くなっているため、これを回答として選択しました。したがって、なぜこの回答が76の賛成票での回答よりも先行しているのか疑問に思っている場合は、リクエストが新しい事実上の方法であるためです。
ポールビガー2013

132
@PaulBiggarあなたはこれが最良の答えだと言います。しかし、それは実際には質問に答えません。urllibとurllib2の違いを知るためにここに来ました。特にURLエンコード機能について。答え:リクエストを使用してください!;)質問を明確にしたいと思うかもしれません。現状では、Crastからの回答は実際に質問に完全に回答します。
exhuma 2013年

2
これは、Python 3のドキュメントは、さらに別の明確なライブラリを持っていることに注意することが役立つだろうurllib「ということも正式にノートとそのマニュアルという要求パッケージは、より高いレベルのHTTPクライアントインターフェイスのために推奨されています。」で21.6。urllib.request — URLを開くための拡張可能なライブラリ— Python 3.6.3ドキュメント。これurllib3はが使用する優れたライブラリrequestsです。
nealmcb

[OK]を、私は印象たこと以外は、要求は何の代替を持っていないためにurllib.parse()
ボブ・スタイン

同意する。@PaulBiggar-リクエストは事実上の方法のようです。実際、urllib(および他のバージョン)が機能しないか、要求と比較して最適ではないという理由で、ここに到着しました。
DL

205

urllib2のは、いくつかの追加機能、すなわち、提供urlopen()機能を使用して、ヘッダを指定できるようにすることができます(通常はあなたがはるかに冗長です過去にhttplibを使用しなければならなかったと思います。)さらに重要なのが、urllib2のが提供するRequestより多くのを可能にしたクラスを、リクエストを行うための宣言的アプローチ:

r = Request(url='http://www.mysite.com')
r.add_header('User-Agent', 'awesome fetcher')
r.add_data(urllib.urlencode({'foo': 'bar'})
response = urlopen(r)

urlencode()はurllibにのみ存在し、urllib2には存在しないことに注意してください。

urllib2でより高度なURLサポートを実装するためのハンドラーもあります。短い答えは、レガシーコードを使用していない限り、おそらくurllib2のURLオープナーを使用したいが、ユーティリティ関数のいくつかのためにurllibにインポートする必要があるということです。

おまけの回答 Google App Engineでは、httplib、urllib、urllib2のいずれかを使用できますが、それらはすべてGoogleのURL Fetch APIのラッパーにすぎません。つまり、ポート、プロトコル、許可される応答の長さなど、同じ制限を受けます。ただし、HTTP URLを取得する場合と同様に、ライブラリのコアを使用できます。


1
urllib2を使用して、エンコードされたクエリ文字列でURLを作成するにはどうすればよいですか?これがurllibを使用している唯一の理由であり、すべてを最新の/最も優れた方法で実行していることを確認したいと思います。
Gattster

2
上記の例のように、urlopen()andおよびurllib2を使用し、Requestfrom urllibを使用urlencode()ます。正しいurlopenを使用していることを確認する限り、両方のライブラリを使用しても特に害はありません。[urllib docs] [1]は、これを使用することが受け入れられた使用法であることを明確にしています。[1]:docs.python.org/library/urllib2.html#urllib2.urlopen
10

私はこの要点をに使用ましたurllib2.urlopen。他のバリエーションも含まれています。
Andrei-Niculae Petre 2014年

urllib2はputまたはdeleteをサポートしていません。これは問題です
fkl

2
requestsまた、カスタムヘッダーを許可する:docs.python-requests.org/en/master/user/quickstart/...
オマールダガン

46

urlliburllib2はどちらも、URLリクエストに関連することを行うPythonモジュールですが、異なる機能を提供します。

1)urllib2はRequestオブジェクトを受け入れてURL要求のヘッダーを設定できます。urllibはURLのみを受け入れます。

2)urllibはGETクエリ文字列の生成に使用されるurlencodeメソッドを提供します。urllib2にはそのような関数はありません。これは、urllibがurllib2と共によく使用される理由の1つです。

リクエスト -リクエストは、Pythonで記述されたシンプルで使いやすいHTTPライブラリです。

1)Pythonリクエストはパラメータを自動的にエンコードするため、urllib.encode()メソッドを使用してパラメータをエンコードしてから渡す必要があるurllibの場合とは異なり、単純な引数として渡すだけです。

2)応答をUnicodeに自動的にデコードしました。

3)リクエストもはるかに便利なエラー処理を備えています。認証が失敗した場合、urllib2はurllib2.URLErrorを送出しますが、リクエストは期待どおりに通常の応答オブジェクトを返します。boolean response.okによってリクエストが成功したかどうかを確認する必要があるすべて


10
urllib3はどうですか?
PirateApp 2018

1
@PirateAppの要求はの上に構築されていurllib3。urllib3を直接使用するコードは、セッションを再利用できるため、より効率的であると思います。リクエスト(少なくともリクエスト2、誰もが使用するもの)は、すべてのリクエストに対して1つ作成しますが、それについて私に引用しないでください。どちらも標準ライブラリの一部ではありません(まだ
Boris

12

大きな違いの1つは、Python2をPython3に移植することです。urllib2は、python3およびそのメソッドがurllibに移植された場合は存在しません。したがって、これを頻繁に使用していて、将来Python3に移行したい場合は、urllibの使用を検討してください。ただし、2to3ツールはほとんどの作業を自動的に行います。


12

既存の回答に追加するために、Pythonリクエストがネイティブライブラリではないことについて言及している人はいないでしょう。依存関係を追加することに問題がなければ、リクエストは問題ありません。ただし、依存関係の追加を避けようとしている場合、urllibはすでに利用可能なネイティブPythonライブラリです。


11

このurllib.urlencode機能が好きですが、には存在しないようurllib2です。

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'

4
<unicode>オブジェクトを直接処理できないため、注意が必要です。urlencodeに送信する前にエンコードする必要があります(u'blá'.encode( 'utf-8')など)。

@ user18015:これはPython 3に当てはまるとは思いませんが、明確にできますか?
Janus Troelsen、

上記で述べたように、この質問とさまざまな回答を更新してurllib、Python 3ではさまざまな方法で整理されたさらに別のオプションであることを明確にする必要があります。しかし、ありがたいことに、公式ドキュメントには、「要求パッケージは、より高いレベルのHTTPクライアントインターフェースに推奨されます。」と記載されています。urllib.request — URLを開くための拡張可能なライブラリ— Python 3.6.3ドキュメント
nealmcb

Python 3にはurllib2はまったく存在しません
Boris

7

URLのコンテンツを取得するには:

try: # Try importing requests first.
    import requests
except ImportError: 
    try: # Try importing Python3 urllib
        import urllib.request
    except AttributeError: # Now importing Python2 urllib
        import urllib


def get_content(url):
    try:  # Using requests.
        return requests.get(url).content # Returns requests.models.Response.
    except NameError:  
        try: # Using Python3 urllib.
            with urllib.request.urlopen(index_url) as response:
                return response.read() # Returns http.client.HTTPResponse.
        except AttributeError: # Using Python3 urllib.
            return urllib.urlopen(url).read() # Returns an instance.

関数と関数は異なる型を返すrequestため、応答のPython2とPython3および依存関係コードを記述するのは困難です。urlopen()requests.get()

  • Python2 urllib.request.urlopen()http.client.HTTPResponse
  • Python3 urllib.urlopen(url)instance
  • リクエストrequest.get(url)が返すrequests.models.Response

5

通常はurllib2を使用する必要があります。これにより、Requestオブジェクトを受け入れることで状況が少し簡単になり、プロトコルエラーでURLExceptionも発生するためです。ただし、Google App Engineでは、どちらも使用できません。Googleがサンドボックス化されたPython環境で提供するURL Fetch APIを使用する必要があります


2
appengineについてあなたが言ったことは完全に真実ではありません。App Engineでhttplib、urllib、urllib2を実際に使用できるようになりました(これらはURLフェッチのラッパーであり、より多くのコードがappengineと互換性を持つように行われています。)
Crast

ああ、新しいに違いない。私のコードは最後に失敗し、フェッチで動作するように書き直さなければなりませんでした...
Chinmay Kanchi


Python 3にはurllib2はまったく存在しません
Boris

それはに移行@Boris urllib.requesturllib.error
アラン

1

上記の回答で欠けていると思う重要な点は、urllibがタイプのオブジェクトを返すの<class http.client.HTTPResponse>に対して、をrequests返すこと<class 'requests.models.Response'>です。

このため、read()メソッドはで使用できますurllibが、では使用できませんrequests

PS:requestsすでに多くのメソッドが豊富なので、もう1つはほとんど必要ありませんread()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.