urllib
Pythonではurllib2
、、、、urllib3
およびrequests
モジュールの違いは何ですか?なぜ3つあるのですか?彼らは同じことをしているようです...
11 に答える
すでに言われていることは知っていますが、requests
Pythonパッケージを強くお勧めします。
Python以外の言語を使用したことがある場合は、おそらく考えurllib
てurllib2
いて、使いやすく、コードが少なく、非常に機能的であると私は考えていました。しかし、requests
パッケージは信じられないほど便利で短いので、誰もがそれを使用する必要があります。
まず、完全にRESTfulな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.7、3.6〜3.9
- スレッドセーフ。
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にインポートする必要があります。
ボーナスアンサー GoogleAppEngineでは、httplib、urllib、urllib2のいずれかを使用できますが、これらはすべてGoogleのURLFetchAPIのラッパーにすぎません。つまり、ポート、プロトコル、許可される応答の長さなど、同じ制限が適用されます。ただし、HTTP URLの取得に期待するように、ライブラリのコアを使用できます。
これは、さまざまな「urllibs」間の関係が何であるかについての私の理解です。
Python 2標準ライブラリには、2つのHTTPライブラリが並んで存在します。同じような名前にもかかわらず、それらは無関係です:それらは異なるデザインと異なる実装を持っています。
urllib
Python1.2の標準ライブラリに追加された元のPythonHTTPクライアントでした。の以前のドキュメントはPython1.4にurllib
あります。urllib2
Python 1.6で追加された、より高性能なHTTPクライアントであり、以下の代わりを目的としていurllib
ます。urllib2-urllibの新しく改良されたが互換性のないバージョン(まだ実験的)。
の以前のドキュメントはPython2.1に
urllib2
あります。
Python 3標準ライブラリには、古いモジュールのマージ/リファクタリング/書き換えられたバージョンである新しいものがあります。 urllib
urllib3
はサードパーティのパッケージです(つまり、CPythonの標準ライブラリにはありません)。名前にもかかわらず、標準ライブラリパッケージとは無関係であり、将来的に標準ライブラリに含める予定はありません。
最後に、requests
内部でを使用しますurllib3
が、より使いやすいAPIを目指しています。
urllibとurllib2はどちらもPythonモジュールであり、URLリクエスト関連のものを実行しますが、異なる機能を提供します。
1)urllib2はRequestオブジェクトを受け入れてURL要求のヘッダーを設定できますが、urllibはURLのみを受け入れます。
2)urllibは、 GETクエリ文字列の生成に使用されるurlencodeメソッドを提供しますが、urllib2にはそのような関数はありません。これが、urllibがurllib2と一緒に使用されることが多い理由の1つです。
Requests -Requests'は、Pythonで記述されたシンプルで使いやすいHTTPライブラリです。
1)Python Requestsはパラメーターを自動的にエンコードするため、パラメーターを渡す前にurllib.encode()メソッドを使用してパラメーターをエンコードする必要があるurllibの場合とは異なり、単純な引数としてパラメーターを渡すだけです。
2)応答を自動的にUnicodeにデコードしました。
3)Requestsには、はるかに便利なエラー処理もあります。認証が失敗した場合、urllib2はurllib2.URLErrorを発生させますが、Requestsは期待どおりに通常の応答オブジェクトを返します。booleanresponse.okによってリクエストが成功したかどうかを確認する必要があるすべて
既存の回答に追加するだけで、Pythonリクエストがネイティブライブラリではないと言及している人は誰もいません。依存関係を追加しても問題がない場合は、リクエストで問題ありません。ただし、依存関係の追加を避けようとしている場合、urllibはネイティブのPythonライブラリであり、すでに利用可能です。
大きな違いの1つは、Python2をPython3に移植することです。urllib2は、python3およびurllibに移植されたそのメソッドには存在しません。したがって、これを頻繁に使用していて、将来Python3に移行したい場合は、urllibの使用を検討してください。ただし、2to3ツールがほとんどの作業を自動的に行います。
私はこのurllib.urlencode
関数が好きですが、には存在しないようurllib2
です。
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
私はすべての答えがかなり良いと思います。ただし、urllib3.urllib3に関する詳細は、Python用の非常に強力なHTTPクライアントです。次の両方のコマンドをインストールすると、次のように機能します。
urllib3
pipを使用して、
pip install urllib3
または、Githubから最新のコードを取得し、次を使用してインストールできます。
$ git clone git://github.com/urllib3/urllib3.git
$ cd urllib3
$ python setup.py install
その後、あなたは行く準備ができています、
を使用してurllib3をインポートするだけです。
import urllib3
ここでは、直接接続を作成する代わりに、リクエストを行うためにPoolManagerインスタンスが必要になります。これにより、接続プールとスレッドセーフが処理されます。HTTP / HTTPSプロキシを介してリクエストをルーティングするためのProxyManagerオブジェクトもあります。ここでは、ドキュメントを参照できます。使用例:
>>> from urllib3 import PoolManager
>>> manager = PoolManager(10)
>>> r = manager.request('GET', 'http://google.com/')
>>> r.headers['server']
'gws'
>>> r = manager.request('GET', 'http://yahoo.com/')
>>> r.headers['server']
'YTS/1.20.0'
>>> r = manager.request('POST', 'http://google.com/mail')
>>> r = manager.request('HEAD', 'http://google.com/calendar')
>>> len(manager.pools)
2
>>> conn = manager.connection_from_host('google.com')
>>> conn.num_requests
3
urrlib3
ドキュメントに記載されているようにurllib3
、Python標準ライブラリにはない多くの重要な機能をもたらします。
- スレッドセーフ。
- 接続プール。
- クライアント側のSSL/TLS検証。
- マルチパートエンコーディングを使用したファイルのアップロード。
- リクエストを再試行し、HTTPリダイレクトを処理するためのヘルパー。
- gzipおよびdeflateエンコーディングのサポート。
- HTTPおよびSOCKSのプロキシサポート。
- 100%のテストカバレッジ。
詳細については、ユーザーガイドに従ってください。
- 応答コンテンツ(HTTPResponseオブジェクトは、ステータス、データ、およびヘッダー属性を提供します)
- 応答コンテンツでのioラッパーの使用
- クエリパラメータの作成
- urllib3の高度な使用法
requests
リクエストは内部で使用され、データの作成と取得urllib3
をさらに簡単にします。requests
一つには、キープアライブはurllib3
そうでない場所と比較して100%自動です。また、応答の受信など、イベントがトリガーされたときにコールバック関数を呼び出すイベントフックもあります。ではrequests
、各要求タイプに独自の関数があります。したがって、接続またはプールを作成する代わりに、URLを直接取得します。
requests
pipを使用してインストールするには、実行するだけです
pip install requests
または、ソースコードからインストールすることもできます。
$ git clone git://github.com/psf/requests.git
$ cd requests
$ python setup.py install
それで、import requests
ここで公式ドキュメントを参照できます。セッションオブジェクト、SSL検証、イベントフックなどの高度な使用法については、このURLを参照してください。
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.
Python2とPython3、およびrequest
応答の依存関係コードを作成するのは困難です。これらのurlopen()
関数とrequests.get()
関数は異なるタイプを返すためです。
- Python2
urllib.request.urlopen()
はhttp.client.HTTPResponse
- Python3
urllib.urlopen(url)
はinstance
- リクエスト
request.get(url)
はrequests.models.Response
通常はurllib2を使用する必要があります。これにより、Requestオブジェクトを受け入れることで作業が少し簡単になり、プロトコルエラーでURLExceptionが発生する場合もあります。ただし、GoogleAppEngineではどちらも使用できません。Googleがサンドボックス化されたPython環境で提供するURLFetchAPIを使用する必要があります。
上記の回答に欠けていることがわかった重要な点は、urllibが型のオブジェクトを返すの<class http.client.HTTPResponse>
に対し、 。をrequests
返すこと<class 'requests.models.Response'>
です。
このため、read()メソッドはで使用できますが、では使用できurllib
ませんrequests
。
PS:requests
すでに多くのメソッドが豊富にあるため、もう1つ必要になることはほとんどありませんread()
;>