urllib2-post запрос
Я пытаюсь выполнить простой 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 но я совершенно уверен, что в моем случае косая черта не хватает. ;)
Я боюсь, что это может быть глупым заблуждением, но мне уже интересно в течение нескольких часов!
EDIT: функция удобства для печати:
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))
EDIT 2: Разрешение:
Я нашел инструмент для захвата реального взаимодействия с сайт,http://fiddler2.com/fiddler2/. По-видимому, сервер берет данные из формы ввода, перенаправляет несколько раз, а затем делает запрос GET с этими данными, просто добавленными к url.
Все в порядке с urllib2, и я прошу прощения за неправильное использование вашего времени!
4 ответов
вещи, которые вам нужно проверить:
- вы уверены, что отправляете на правильный URL-адрес?
- вы уверены, что можете получить результаты без входа в систему?
- покажите нам пример вывода для разных значений post.
вы можете найти правильный URL-адрес, используя Firefox Палий или Google Chromes инструменты разработчика.
я предоставил вам код, который поддерживает cookies, чтобы вы могли войти в систему сначала и используйте cookie, чтобы сделать последующий запрос с вашими параметрами post.
наконец, если бы вы могли показать нам пример вывода 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
просто чтобы закрыть вопрос:
проблема действительно заключалась в том, что сервер не ожидал POST-запросов (хотя должен был, рассматривал вариант использования). Итак (еще раз) рамки не были нарушены. ;)
Попробуйте удалить косую черту из URL-адреса следующим образом:
url = 'http://www.mitfahrgelegenheit.de/mitfahrzentrale/Dresden/Potsdam.html'
может быть так, что сценарий сервера вы POST
запрос отправляется в фактически не поддерживает POST
запросы.