python - urrlib2请求https站点 - 获得400错误
使用以下代码片段访问带有帖子的网址。python - urrlib2请求https站点 - 获得400错误
我可以使用wget得到它,以下内容: wget的--post数据 'p_calling_proc = bwckschd.p_disp_dyn_sched & p_term = 201010' https://spectrumssb2.memphis.edu/pls/PROD/bwckgens.p_proc_term_date
出于某种原因,我有一个问题与我的蟒蛇文中,我得到的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()
。
任何想法/意见,将不胜感激..
感谢
尝试不编码查询字符串。 POST数据中的&和='s不需要是urlencoded。如果远程端的Web应用程序不希望查询字符串中存在%xx编码,则它将无法解析它。
这里是卷曲的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
我觉得您的查询字符串是不完全正确。尝试使用urllib.urlencode()方法生成查询,一个la
urllib.urlencode([ ('param1', value1), ('param2',value2) ])
,我提供了 “是” urlencoded的查询查询.. 初始查询是: query === p_calling_proc = bwckschd.p_disp_dyn_sched&p_term = 201010 >>> p_calling_proc%3Dbwckschd.p_disp_dyn_sched%26p_term%3D201010 – 2009-12-19 22:48:57
hi jon ... 感谢您的评论!!! 思考后..我试图使用未编码的查询..它似乎工作! 谢谢 – 2009-12-19 22:55:11
这只是错误的,“POST数据不需要被urlencoded,因为它被放置在HTTP请求的主体。”发布的表单数据的内容类型是“application/x-www-form-urlencoded”。 – 2009-12-20 01:03:57
@Jonathan - 读起来很清楚,呃?谢谢,我编辑了这个帖子来澄清urlencoding,我当然想歪了。 – 2009-12-20 01:59:21
这就是bettah! Downvote取消。 :) – 2009-12-20 03:10:32