使用python,HTTP / 1.1和自定义用户代理发布表单数据

时间:2010-10-06 14:11:27

标签: python urllib2 urllib httplib

我有一个我需要发布数据的表单,但它必须有一个特定的用户代理字符串和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()

但是,这会通过HTTP / 1.0提交一个Host:标头。查看urllib(和urllib2)的源代码看起来代码路径都实例化了一个HTTPLib HTTP Class对象,该对象被标记为1.5的兼容类...是否有一种简单的方法让urllib / URLOpener使用HTTPConnection而不是HTTP?或者是否有其他解决方案我缺少具有我需要的正确标题?

1 个答案:

答案 0 :(得分: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网站上有一个list of configurable options,其中大多数都可以通过上面显示的方式在pycurl中访问(pycurl.OPTION_NAME)。