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)的源代码看起来代码路径都实例化了一个 HTTPLib HTTP Class 对象,该对象从 1.5 开始被标记为兼容的类......有没有一种简单的方法让 urllib/URLOpener 使用 HTTPConnection 而不是 HTTP?还是我缺少另一种解决方案来获得我需要的正确标题?

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 网站上有一个可配置选项列表,其中大部分都可以在 pycurl 中以上述方式访问(pycurl.OPTION_NAME)。

于 2012-10-04T17:22:01.500 回答