14

接続プールがあり、スレッドセーフであるため(特にクロールのパフォーマンスが優れているため)、 urllib3を調べていますが、ドキュメントは...控えめに言っても最小限です。urllib2 には build_opener があるので、次のようになります。

#!/usr/bin/python
import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

しかし、urllib3 には build_opener メソッドがないため、これまでに見つけた唯一の方法は、ヘッダーに手動で配置することです。

#!/usr/bin/python
import urllib3
http_pool = urllib3.connection_from_url("http://example.com")
myheaders = {'Cookie':'some cookie data'}
r = http_pool.get_url("http://example.org/", headers=myheaders)

しかし、もっと良い方法があることを願っています。それが何であるかを教えてください。また、誰かがこれに「urllib3」のタグを付けてください。

4

5 に答える 5

13

おっしゃる通り、今すぐこれを行うより良い方法はありません。一致する改善があれば、喜んでパッチを受け入れます。

覚えておくべきことの 1 つは、urllib3 の HTTPConnectionPool は、ステートフル クライアントとは対照的に、特定のホストへの「接続のプール」になることを目的としています。そのコンテキストでは、実際のプールの外で Cookie の追跡を維持することは理にかなっています。

  • shazow (urllib3 の作者)
于 2010-03-11T07:07:21.617 に答える
4

複数のクッキーで問題はありませんか?

一部のサーバーは複数の Set-Cookie ヘッダーを返しますが、urllib3 はヘッダーを dict に格納し、dict は同じキーを持つ複数のエントリを許可しません。

httplib2 にも同様の問題があります。

あるいは、そうではないかもしれません: httplib パッケージの HTTPMessage クラスの readheaders メソッド (urllib3 と httplib2 の両方が使用する) には、次のコメントがあることがわかりました。

同じ名前のヘッダー フィールドが複数ある場合、それらは RFC 2616 秒 4.2 の規則に従って結合されます。

    Appending each subsequent field-value to the first, each separated
    by a comma. The order in which header fields with the same field-name
    are received is significant to the interpretation of the combined
    field value.

したがって、ヘッダーが失われることはありません。

ただし、ヘッダー値内にコンマがある場合は問題があります。ここで何が起こっているのかはまだわかりませんが、RFC 2616 (「Hypertext Transfer Protocol -- HTTP/1.1」) と RFC 2965 (「HTTP State Management Mechanism」) をざっと読んでみると、ヘッダー内にコンマがあるような印象を受けます。値を引用することになっています。

于 2010-05-18T02:04:48.733 に答える
1

リクエストライブラリを使用する必要があります。urllib3を使用しますが、Cookieの追加などは簡単です。

https://github.com/kennethreitz/requests

import requests
r1 = requests.get(url, cookies={'somename':'somevalue'})
print(r1.content)
于 2012-03-18T22:00:48.393 に答える
1

'Cookie'not'Set-Cookie'を設定する必要があり'Set-Cookie'ます。Web サーバーによって設定されます。

Cookie はヘッダーの 1 つなので、そのようにしても問題ありません。

于 2010-03-11T06:07:54.950 に答える