Публикация данных формы с помощью Python, HTTP / 1.1 и пользовательского агента - PullRequest
1 голос
/ 06 октября 2010

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

1 Ответ

2 голосов
/ 04 октября 2012

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 описанным выше способом.OPTION_NAME).

...