1

データを投稿する必要があるフォームがありますが、特定のユーザー エージェント文字列と HTTP/1.1 ヘッダーが必要です (ホストするだけでなく、POST 文字列で HTTP/1.1 を明示的に検索します)。

私はこれまで次のように試みました:

class AppURLopener(urllib.FancyURLopener):
    version = "The User Agent String"

urllib._urlopener = AppURLopener()

def send_data(url, kv)
    params = urllib.urlencode(kv)
    f = urllib.urlopen(url, params)
    data = f.read()
    f.close()

ただし、これは Host: ヘッダーを使用して HTTP/1.0 経由で送信されます。urllib (および urllib2) のソースを見ると、すべてのコードパスが 1.5 から互換クラスとしてマークされている HTTPLib HTTP クラス オブジェクトをインスタンス化しているように見えます... urllib/URLOpener に HTTP の代わりに HTTPConnection を使用させる簡単な方法はありますか? または、必要な適切なヘッダーを取得するために欠落している別の解決策はありますか?

4

1 に答える 1

2

cURL では、より多くのカスタマイズが可能です。pycurl パッケージを介して Python で利用できます。おそらく、次のようなものがあなたのニーズに役立つでしょう:

import pycurl
import StringIO

response = StringIO.StringIO()
curl = pycurl.Curl()
curl.setopt(pycurl.HTTP_VERSION, pycurl.CURL_HTTP_VERSION_1_1)
curl.setopt(pycurl.USERAGENT, 'Mozilla/5.0 [...]')

curl.setopt(pycurl.WRITEFUNCTION, response.write)
curl.setopt(pycurl.URL, 'http://path.to/form')
curl.setopt(pycurl.POST, 1) 
curl.setopt(pycurl.POSTFIELDS, 'form input') 

curl.perform()
print response.getvalue()

cURL Web サイトには構成可能なオプションのリストがあり、そのほとんどは上記の方法で pycurl にアクセスできます (pycurl.OPTION_NAME)。

于 2012-10-04T17:22:01.500 に答える