使用Python、HTTP/1.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()
但是,这样提交的数据是通过HTTP/1.0,并且带有一个Host头信息。查看urllib(和urllib2)的源代码,发现所有的代码路径都实例化了一个HTTPLib的HTTP类对象,而这个对象被标记为与1.5版本兼容……有没有简单的方法让urllib/URLOpener使用HTTPConnection而不是HTTP?或者我有没有遗漏其他解决方案,以便能使用我需要的正确头信息?
1 个回答
2
cURL 让你可以进行更多的自定义设置——在 Python 中可以通过 pycurl 这个包来使用。你可以试试下面这样的代码:
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)。