2014-12-03 39 views
1

我有我想從我的python腳本調用的這個簡單URL: http://test.my-site.com/bla-blah/createAccount (由於隱私,我更改了一些字母,所有特殊字符等完全一樣)Python urllib2.urlopen:即使存在HTTP標頭錯誤,也請閱讀站點主體

import urllib2 

def myfunc(self, url): 
    result = urllib2.urlopen(url).read() 
    # HTTP Error 400: Bad Request 

當我調用上面的網址,我得到的錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/usr/lib/python2.7/urllib2.py", line 406, in open 
    response = meth(req, response) 
    File "/usr/lib/python2.7/urllib2.py", line 519, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/usr/lib/python2.7/urllib2.py", line 444, in error 
    return self._call_chain(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 527, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 400: Bad Request 

我不認爲它是與報價(和/或空格明顯) 。 當我改用URL http://test.my-site.com/bla-blah/listAccounts時,它可以正常工作,結果與我在瀏覽器中調用URL時得到的文本完全相同。當然,我通過瀏覽器檢查了第一個URL,它工作正常。

不知道這可能是什麼?


編輯澄清:

這兩個網址應可贖回沒有任何進一步的參數或查詢字符串,權當他們站在那裏以上。該網站應顯示「錯誤:參數丟失」。當我在瀏覽器中調用URL或通過在bash中捲曲時,會發生這種情況。只是python模塊出問題了。


EDIT2(也改爲發佈標題以更好地匹配情況)

謝謝你,你是對的:如果我做curl -v 'http://test.my-site.com/bla-blah/createAccount',我得到如下:

* About to connect() to <blackened> port 80 (#0) 
* Trying 193.46.215.110... connected 
> GET <blackened> HTTP/1.1 
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 
> Host: <blackened> 
> Accept: */* 
> 
< HTTP/1.1 400 Bad Request 
< content-language: en-US 
< server: <blackened> 
< date: Thu, 04 Dec 2014 07:20:15 GMT 
< set-cookie: beng_proxy_session=e2e037e7e79c1b03; HttpOnly; Path=/; Version=1; Discard 
< p3p: CP="CAO PSA OUR" 
< content-length: 234 
< 
error: parameter x missing 
error: parameter y missing 
* Connection #0 to host <blackened> left intact 
* Closing connection #0 

由於你可以看到,有一個HTTP頭錯誤。但curl(和瀏覽器)繼續打印site-body(「parameter missing ...」),但是python urllib在看到標題錯誤後停止並且不打印正文。 (這個頭文件錯誤是由服務器應用程序發送的,我想這與python urllib無關) 所以我們離得更近了一步,但即使出現錯誤,我仍然需要看到body ,因爲我必須知道(並顯示)究竟發生了什麼錯誤。 但是剛纔我能夠找到一個解決方案到:

try: 
    response = urllib2.urlopen("http://test.my-site.com/bla-blah/createAccount") 
    contents = response.read() 
    print("success: %s" % contents) 
except urllib2.HTTPError as e: 
    contents = e.read() 
    print("error: %s" % contents) 

這樣,我得到了網站的主體,不管錯誤或成功。

(順便說一句,這是我從得到了解決後:Overriding urllib2.HTTPError or urllib.error.HTTPError and reading response HTML anyway

非常感謝您!

+0

你打電話給你的'myfunc()'? – 2014-12-03 11:58:57

+0

這並不重要,當我直接在Python中調用這些東西時會發生同樣的情況 – Droids 2014-12-03 12:04:56

回答

1

編輯2

Python會引發對收到的狀態代碼:400 HTTP響應的一個例外,因爲有一個異常,有可能是在您沒有看到響應的身體一些文本數據不被讀取。該文本可能是「錯誤:參數丟失」。

可能curl做同樣的事情,但是,而不是有一個合適的,它顯示響應的主體,所以你看到「錯誤:參數丟失」。與您的瀏覽器類似的行爲。

嘗試運行curl -v http://test.my-site.com/bla-blah/createAccount。這將以詳細模式運行curl,您將能夠看到響應並檢查是否返回了狀態碼400。如果它是狀態碼400,那麼urllib2.urlopen()沒有什麼問題,只需要在查詢字符串中發送參數。

編輯1

以下是捲曲請求和urllib2.urlopen請求之間的區別......

[[email protected] ~]$ python 
GET /bla-blah/createAccount HTTP/1.1 
Accept-Encoding: identity 
Host: localhost:12345 
Connection: close 
User-Agent: Python-urllib/2.7 

[[email protected] ~]$ nc -l localhost 12345 
GET /bla-blah/createAccount HTTP/1.1 
User-Agent: curl/7.32.0 
Host: localhost:12345 
Accept: */* 

或許你可以嘗試在Python添加/刪除頁眉實現捲曲產生的相同請求。

原來的答覆

URL http://test.my-site.com/bla-blah/listAccounts看起來這將是一個HTTP GET請求,而http://test.my-site.com/bla-blah/createAccount可能需要包括對「創建帳戶」所需的數據字段一個HTTP POST請求。

我不知道是你的服務器應用程序需要什麼樣的數據,但(如果我的猜測是正確的),這通常是你需要考慮做什麼:

import urllib2 
from urllib import urlencode 

data = {'username': 'droids', 'password': '123droids321', 'phone': ''} 
result = urllib2.urlopen(url, urlencode(data)).read() 

的urlencoded的數據的存在產生一個POST請求,而不是您當前的代碼將發佈的GET請求。

請注意,HTTP有更多可用的模塊:requests。一探究竟。

+0

不,這些請求都是用GET調用的,並且可以在沒有任何參數的情況下調用。你會看到一些基本的HTML輸出,然後就像「缺少參數」。此外,我只是在bash中用捲曲來檢查它,並且它確實有效,只有python模塊有問題...很遺憾,我無法使用請求,因爲我必須手動將它安裝在每臺服務器上,是根本不可維護... – Droids 2014-12-03 12:11:18

+0

那麼,另一種可能性是'createAccount'需要在URL中傳遞所需參數的查詢字符串?你不會在你的問題中表現出來,而URL的混淆並沒有幫助。 – mhawke 2014-12-03 12:14:28

+0

不,如我所說我可以調用'http:// test.my-site.com/bla-blah/createAccount'沒有任何進一步的參數或查詢字符串在瀏覽器中,或通過捲曲,它的工作原理 – Droids 2014-12-03 12:24:52

相關問題