Python - URL-адрес запроса urrlib2 - ошибка 400 - PullRequest
2 голосов
/ 20 декабря 2009

, используя следующий фрагмент кода для доступа к URL с сообщением.

я могу получить его, используя wget и следующее: wget --post-data 'p_calling_proc = bwckschd.p_disp_dyn_sched & p_term = 201010' https://spectrumssb2.memphis.edu/pls/PROD/bwckgens.p_proc_term_date

по какой-то причине у меня возникла проблема с моим текстом на Python, так как я получаю код ошибки 400. (и, конечно, браузер работает как положено)

любые мысли / комментарии / и т.д ...

тест на питона, который у меня есть:

// ==========================================

import urllib 
import urllib2
import sys, string
import time
import mechanize

Request = urllib2.Request
urlopen = urllib2.urlopen

headers ={'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
query = "p_calling_proc%3Dbwckschd.p_disp_dyn_sched%26p_term%3D201010"
url1="https://spectrumssb2.memphis.edu/pls/PROD/bwckgens.p_proc_term_date"

req = Request(url1, query, headers)

test1=0
test=0
while test==0:
  print "aaaaattttt \n"
  try: 
    res = urlopen(req)
    #req = Request(url1, query, headers)
    print "aaaappppp \n"
    #urllib2.URLError, (e)
    #print e
  except urllib2.HTTPError, e:
    print "ffff1111 "+str(e.code)+"\n"
    if e.code:
      test1=1
      print "error ..sleep \n"
      time.sleep(1)
    else:
      test1=0
  except urllib2.URLError, e:
    print e.reason
    #print "ffff3333 "+e.code+"\n"
    if e.reason:
      test1=1
      print "error ..sleep \n"
      time.sleep(1)
    else:
      test1=0
  #print "ddd "+e.code +"\n"
  #print e
  if test1==0:
    test=1

print "test1 = "+str(test1)+"\n"
#res = urlopen(req)
print "gggg 000000000000\n"
s = res.read()

.


любые мысли / комментарии будут оценены ..

спасибо

Ответы [ 2 ]

1 голос
/ 20 декабря 2009

Попробуйте не кодировать строку запроса. Символы & и = в данных POST не обязательно должны быть urlencoded . Если веб-приложение на удаленном конце не ожидает кодирования% xx в строке запроса, оно не сможет его проанализировать.

Вот заголовки HTTP-запроса curl:

POST / HTTP/1.1
User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.19.4 OpenSSL/0.9.8k zlib/1.2.3
Host: 127.0.0.1 
Accept: */*
Content-Length: 188
Expect: 100-continue

bwckschd.p_disp_dyn_sched&p_term=201010

А вот заголовки HTTP-запросов от вашего питона:

POST / HTTP/1.1
Accept-Encoding: identity
Content-Length: 60
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Connection: close
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)

p_calling_proc%3Dbwckschd.p_disp_dyn_sched%26p_term%3D201010
0 голосов
/ 20 декабря 2009

Я думаю, что ваша строка запроса не совсем верна. Попробуйте использовать метод urllib.urlencode () для генерации запроса, например

urllib.urlencode([ ('param1', value1), ('param2',value2) ])
...