web-dev-qa-db-ja.com

Urllib、urllib2、およびrequestsモジュールの違いは何ですか?

Pythonでは、urlliburllib2、および requests moduleの違いは何ですか?なぜ3つありますか?彼らは同じことをしているようです...

624
Paul Biggar

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

あなたがpython以外の言語を使ったことがあるなら、おそらくurlliburllib2は使いやすくて、あまりコードがなく、そして非常に有能だと思っているのでしょう。しかし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検証
  • 基本/ダイジェスト認証
  • エレガントなキー/バリュークッキー
  • 自動解凍
  • Unicodeレスポンスボディ
  • マルチパートファイルのアップロード
  • 接続タイムアウト
  • .netrcのサポート
  • リスト項目
  • Python 2.6 - 3.4
  • スレッドセーフ.
607
Hutch

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の取得に予想されるとおりにライブラリのコアを使用できます。

190
Crast

urllib および urllib2 はどちらもURL要求に関連するものを実行しますが、異なる機能を提供するPythonモジュールです。

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

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

Requests - Requestsは、Pythonで書かれたシンプルで使いやすいHTTPライブラリです。

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

2)レスポンスを自動的にUnicodeにデコードしました。

3)リクエストにもはるかに便利なエラー処理があります。あなたの認証が失敗した場合、urllib2はurllib2.URLErrorを送出しますが、リクエストは通常​​通りのレスポンスオブジェクトを返します。リクエストが成功したかどうかはブール値 response.ok で確認できます。

参考例 - https://dancallahan.info/journal/python-requests/

36
SrmHitter9062

urllib2.urlopenはRequestクラスまたはurlのインスタンスを受け入れますが、urllib.urlopenはurlしか受け入れません。

ここで同様の議論が行われました: http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html

12
Danny Roberts

私はurllib.urlencode関数が好きです、そしてそれはurllib2に存在しているようには見えません。

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

大きな違いの1つは、Python 2からPython 3への移植についてです。 urllib2はpython3とurllibに移植されたそのメソッドには存在しません。それで、あなたはそれを頻繁に使っていて、将来Python3に移行したいと思うなら、urllibの使用を検討してください。しかし2to3ツールは自動的にあなたのためにほとんどの仕事をするでしょう。

8
Arash

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

6
Zeitgeist

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

5
Chinmay Kanchi

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.

urlopen()関数とrequests.get()関数は異なる型を返すので、応答用にPython 2とPython 3およびrequest依存関係コードを書くのは難しいです。

  • Python2 urllib.request.urlopen()http.client.HTTPResponseを返します
  • Python3 urllib.urlopen(url)instanceを返します
  • request.get(url)をリクエストするとrequests.models.Responseが返されます
5
alvas

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

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

P.S :requestsはすでにたくさんのメソッドを持っているので、read();のようなメソッドはもうほとんど必要ありません。

1
paradoxlover