urllib2 - отправить запрос - PullRequest
       5

urllib2 - отправить запрос

13 голосов
/ 03 марта 2012

Я пытаюсь выполнить простой POST-запрос с помощью urllib2. Однако ответ сервера указывает, что он получает простой GET. Я проверил тип исходящего запроса, но он установлен на POST.
Чтобы проверить, ведет ли сервер себя так, как я ожидал, я попытался выполнить запрос GET с (прежними POST-) данными, соединенными с URL. Это дало мне ответ, который я ожидал.
Кто-нибудь знает, что я неправильно понял?

def connect(self):
    url = 'http://www.mitfahrgelegenheit.de/mitfahrzentrale/Dresden/Potsdam.html/'
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    header = { 'User-Agent' : user_agent }

    values = {
      'city_from' : 69,
      'radius_from' : 0,
      'city_to' : 263,
      'radius_to' : 0,
      'date' : 'date',
      'day' : 5,
      'month' : 03,
      'year' : 2012,
      'tolerance' : 0
    }

    data = urllib.urlencode(values)
    # req = urllib2.Request(url+data, None, header) # GET works fine
    req = urllib2.Request(url, data, header)  # POST request doesn't not work

    self.response = urllib2.urlopen(req)

Кажется, это проблема, подобная той, которая обсуждалась здесь: Python URLLib / URLLib2 POST но я вполне уверен, что в моем случае косая черта не пропущена. ;)

Боюсь, это может быть глупым заблуждением, но я уже часами удивляюсь!



РЕДАКТИРОВАТЬ: удобная функция для печати:

def response_to_str(response):
    return response.read()

def dump_response_to_file(response):
    f = open('dump.html','w')
    f.write(response_to_str(response))



РЕДАКТИРОВАТЬ 2: Разрешение:

Я нашел инструмент для захвата реального взаимодействия с сайтом, http://fiddler2.com/fiddler2/. Видимо, сервер берет данные из формы ввода, перенаправляет несколько раз, а затем делает запрос GET с этими данными, просто добавляемыми в URL.
С urllib2 все в порядке, и я прошу прощения за неправильное использование вашего времени!

Ответы [ 4 ]

15 голосов
/ 04 марта 2012

Вещи, которые вам нужно проверить:

  • Вы уверены, что публикуете правильный URL?
  • Вы уверены, что можете получить результаты без входа в систему?
  • Покажите нам пример выходных данных для различных значений записей.

Вы можете найти правильный URL-адрес публикации, используяFirefox Firebug или Google Chromes DevTools .

Я предоставил вам некоторый код, который поддерживает файлы cookie, чтобы вы могли сначала войти в систему и использовать файл cookie для создания последующихзапрос с вашими параметрами записи.

Наконец, если бы вы могли показать нам пример вывода HTML, это облегчит жизнь.

Вот мой код, который до сих пор работал для меня достаточно надежно дляРазмещение на большинстве веб-страниц, включая страницы, защищенные CSRF / XSRF (при условии, что вы можете правильно определить что опубликовать и где (какой URL-адрес)) к публикации).

import cookielib
import socket
import urllib
import urllib2

url = 'http://www.mitfahrgelegenheit.de/mitfahrzentrale/Dresden/Potsdam.html/'
http_header = {
                "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11",
                "Accept" : "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,text/png,*/*;q=0.5",
                "Accept-Language" : "en-us,en;q=0.5",
                "Accept-Charset" : "ISO-8859-1",
                "Content-type": "application/x-www-form-urlencoded",
                "Host" : "www.mitfahrgelegenheit.de",
                "Referer" : "http://www.mitfahrgelegenheit.de/mitfahrzentrale/Dresden/Potsdam.html/"
                }

params = {
  'city_from' : 169,
  'radius_from' : 0,
  'city_to' : 263,
  'radius_to' : 0,
  'date' : 'date',
  'day' : 5,
  'month' : 03,
  'year' : 2012,
  'tolerance' : 0
}

# setup socket connection timeout
timeout = 15
socket.setdefaulttimeout(timeout)

# setup cookie handler
cookie_jar = cookielib.LWPCookieJar()
cookie = urllib2.HTTPCookieProcessor(cookie_jar)

# setup proxy handler, in case some-day you need to use a proxy server
proxy = {} # example: {"http" : "www.blah.com:8080"}

# create an urllib2 opener()
#opener = urllib2.build_opener(proxy, cookie) # with proxy
opener = urllib2.build_opener(cookie) # we are not going to use proxy now

# create your HTTP request
req = urllib2.Request(url, urllib.urlencode(params), http_header)

# submit your request
res = opener.open(req)
html = res.read()

# save retrieved HTML to file
open("tmp.html", "w").write(html)
print html
1 голос
/ 09 апреля 2012

Просто, чтобы закрыть вопрос:
Проблема действительно заключалась в том, что сервер не ожидал POST-запросов (хотя это и должно было учитываться в случае использования).Так что (еще раз) рамки не были нарушены.;)

0 голосов
/ 03 марта 2012

Попробуйте удалить косую черту из вашего URL следующим образом:

url = 'http://www.mitfahrgelegenheit.de/mitfahrzentrale/Dresden/Potsdam.html'

Возможно, серверный скрипт, на который вы POST отправляете запрос, на самом деле не поддерживает POST запросы.

0 голосов
/ 03 марта 2012

Попробуйте добавить к своим заголовкам пару:

   'Content-type': 'application/x-www-form-urlencoded'
...