2009-12-19 47 views
2

使用以下代碼片段訪問帶有帖子的網址。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() 


任何想法/意見,將不勝感激..

感謝

回答

1

嘗試不編碼查詢字符串。 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 
+0

這只是錯誤的,「POST數據不需要被urlencoded,因爲它被放置在HTTP請求的主體。」發佈的表單數據的內容類型是「application/x-www-form-urlencoded」。 – 2009-12-20 01:03:57

+0

@Jonathan - 讀起來很清楚,呃?謝謝,我編輯了這個帖子來澄清urlencoding,我當然想歪了。 – 2009-12-20 01:59:21

+0

這就是bettah! Downvote取消。 :) – 2009-12-20 03:10:32

0

我覺得您的查詢字符串是不完全正確。嘗試使用urllib.urlencode()方法生成查詢,一個la

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

,我提供了 「是」 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

+0

hi jon ... 感謝您的評論!!! 思考後..我試圖使用未編碼的查詢..它似乎工作! 謝謝 – 2009-12-19 22:55:11