911

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

4

11 に答える 11

820

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

Python以外の言語を使用したことがある場合は、おそらく考えurlliburllib2いて、使いやすく、コードが少なく、非常に機能的であると私は考えていました。しかし、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
  • スレッドセーフ。
于 2013-02-11T00:32:09.150 に答える
225

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の取得に期待するように、ライブラリのコアを使用できます。

于 2010-01-07T03:43:08.630 に答える
132

これは、さまざまな「urllibs」間の関係が何であるかについての私の理解です。

Python 2標準ライブラリには、2つのHTTPライブラリが並んで存在します。同じような名前にもかかわらず、それらは無関係です:それらは異なるデザインと異なる実装を持っています。

  • urllibPython1.2の標準ライブラリに追加された元のPythonHTTPクライアントでした。の以前のドキュメントはPython1.4にurllibあります

  • urllib2Python 1.6で追加された、より高性能なHTTPクライアントであり、以下の代わりを目的としていurllibます。

    urllib2-urllibの新しく改良されたが互換性のないバージョン(まだ実験的)。

    の以前のドキュメントはPython2.1にurllib2あります

Python 3標準ライブラリには、古いモジュールのマージ/リファクタリング/書き換えられたバージョンである新しいものがあります。 urllib

urllib3はサードパーティのパッケージです(つまり、CPythonの標準ライブラリにはありません)。名前にもかかわらず、標準ライブラリパッケージとは無関係であり、将来的に標準ライブラリに含める予定はありません。

最後に、requests内部でを使用しますurllib3が、より使いやすいAPIを目指しています。

于 2020-08-03T16:34:22.573 に答える
63

urlliburllib2はどちらも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によってリクエストが成功したかどうかを確認する必要があるすべて

于 2016-09-10T04:14:30.583 に答える
29

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

于 2017-10-30T18:42:14.237 に答える
14

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

于 2016-04-27T01:07:59.563 に答える
11

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

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
于 2010-01-07T03:51:08.697 に答える
10

私はすべての答えがかなり良いと思います。ただし、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%のテストカバレッジ。

詳細については、ユーザーガイドに従ってください。

requests

リクエストは内部で使用され、データの作成と取得urllib3をさらに簡単にします。requests一つには、キープアライブはurllib3そうでない場所と比較して100%自動です。また、応答の受信など、イベントがトリガーされたときにコールバック関数を呼び出すイベントフックもあります。ではrequests、各要求タイプに独自の関数があります。したがって、接続またはプールを作成する代わりに、URLを直接取得します。


requestspipを使用してインストールするには、実行するだけです

pip install requests

または、ソースコードからインストールすることもできます。

$ git clone git://github.com/psf/requests.git
$ cd requests
$ python setup.py install

それで、import requests

ここで公式ドキュメントを参照できます。セッションオブジェクト、SSL検証、イベントフックなどの高度な使用法については、このURLを参照してください。

于 2020-06-20T19:30:19.523 に答える
9

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()関数は異なるタイプを返すためです。

  • Python2urllib.request.urlopen()http.client.HTTPResponse
  • Python3urllib.urlopen(url)instance
  • リクエストrequest.get(url)requests.models.Response
于 2017-12-20T02:29:06.593 に答える
5

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

于 2010-01-07T03:36:46.977 に答える
3

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

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

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

于 2018-12-14T00:04:11.217 に答える