urllib、urllib2、urllib3、およびrequestsモジュールの違いは何ですか?
-
19-09-2019 - |
解決
すでに言われているとは思いますが、私はこれを強くお勧めします 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検証
- 基本認証/ダイジェスト認証
- エレガントなキー/値クッキー
- 自動減圧
- Unicode レスポンスボディ
- マルチパートファイルのアップロード
- 接続タイムアウト
- .netrcのサポート
- リスト項目
- Python 2.6—3.4
- スレッドセーフ。
他のヒント
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 フェッチ API のラッパーにすぎません。つまり、ポート、プロトコル、許可される応答の長さなど、同じ制限が依然として適用されます。ただし、ライブラリのコアは、HTTP URL の取得に期待どおりに使用できます。
URLライブラリ そして URLlib2 どちらも URL リクエスト関連の処理を行う Python モジュールですが、異なる機能を提供します。
1) urllib2 は、URL リクエストのヘッダーを設定するための Request オブジェクトを受け入れることができます。urllib は URL のみを受け入れます。
2) urllib は、 URLコード GET クエリ文字列の生成に使用されるメソッドですが、urllib2 にはそのような関数がありません。これが、urllib が urllib2 とともによく使用される理由の 1 つです。
リクエスト - Requests は、Python で書かれたシンプルで使いやすい HTTP ライブラリです。
1) Python リクエストはパラメータを自動的にエンコードするため、メソッドを使用する必要がある urllib の場合とは異なり、パラメータを単純な引数として渡すだけです。 urllib.encode() パラメータを渡す前にエンコードします。
2) 応答を自動的に Unicode にデコードします。
3) Requests には、より便利なエラー処理機能もあります。認証が失敗した場合、urllib2 は urllib2.URLError を生成しますが、Requests は期待どおり通常の応答オブジェクトを返します。リクエストが成功したかどうかをブール値で確認するだけで済みます 応答。OK
urllib2.urlopenは、要求クラスのインスタンスまたはURLを受け付ける。
と同様の議論がここで行われました: http://www.velocityreviews.com/forums /t326690-urllib-urllib2-what-is-the-difference.htmlする
私はurllib.urlencode
機能が好きで、urllib2
に存在すると表示されません。
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
一つのかなりの違いがのpython3にPython2を移植についてです。 urllib2のはのpython3とurllibはに移植され、その方法は存在しません。 だから、重く、将来のpython3に移行したい、urllibはの使用を検討することを使用しています。 しかし、2to3はツールが自動的にあなたのための作業のほとんどを行います。
ただ、既存の回答に追加するには、私は誰もがPythonの要求はネイティブライブラリではないことを言及して表示されません。あなたは依存関係を追加して[OK]をしている場合、その要求は罰金です。あなたは依存関係を追加しないようにしようとしている場合は、urllibは、すでに使用可能であるネイティブのPythonライブラリです。
あなたは、一般的に、urllib2のを使用する必要があります。しかしGoogle App Engineを使用すると、いずれかを使用することはできません。あなたは、GoogleがそのサンドボックスPythonで提供するAPIをを取得 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
私は上記の回答に欠落見つけるキーポイントは<class http.client.HTTPResponse>
戻るrequests
一方urllibは、タイプ<class 'requests.models.Response'>
のオブジェクトを返すことである。
これにより、read()メソッドはurllib
でなくrequests
で使用することができます。
P.S。 :requests
はすでに、それはほとんどread()
として1以上を必要としないので、多くの方法が豊富である;>