Отправка данных формы с помощью python, HTTP/1.1 и пользовательского агента

У меня есть форма, в которую мне нужно опубликовать данные, однако она должна иметь определенную строку пользовательского агента и заголовки HTTP/1.1 (не просто хост, он явно ищет HTTP/1.1 в строке POST).

Я пытался это сделать следующим образом:

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? Или есть другое решение, которое мне не хватает, чтобы иметь правильные заголовки, которые мне нужны?


person Doug-W    schedule 06.10.2010    source источник


Ответы (1)


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).

person lfk    schedule 04.10.2012