python - 使用urllib2请求https站点 - 获取400错误
我用下面这段代码来通过POST请求访问一个网址。
我可以使用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的错误代码。(当然,用浏览器访问是没问题的)
有没有什么想法或者建议呢……
这是我用的Python代码:
//==========================================
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 个回答
0
我觉得你的查询字符串写得不太对。试试用urllib.urlencode()这个方法来生成查询字符串,像这样:
urllib.urlencode([ ('param1', value1), ('param2',value2) ])
1
尽量不要对查询字符串进行编码。POST数据中的&和=符号不需要进行URL编码。如果远程的网页应用不期待查询字符串中的%xx编码,它就无法正确解析这些数据。
下面是curl的HTTP请求头:
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
而这是你用Python发送的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