2012-10-05 21 views
1

當我訪問IIS服務器上的一個頁面以檢索xml時,通過瀏覽器使用查詢參數(使用下例中的http),我得到一個用戶名和密碼的彈出式登錄對話框(看起來像一個系統標準對話框/表格)。並且一旦提交數據到達。作爲一個XML頁面。如何使用Python來檢索需要http登錄的xml頁面?

如何用urllib處理這個問題?當我做以下事情時,我從來沒有得到一個uid/psw的提示..我只是得到一個回溯,指示服務器(正確)id是我的未授權。在Ipython筆記本中使用python 2.7

f = urllib.urlopen("http://www.nalmls.com/SERetsHuntsville/Search.aspx?SearchType=Property&Class=RES&StandardNames=0&Format=COMPACT&Query=(DATE_MODIFIED=2012-09-28T00:00:00%2B)&Limit=10") 
s = f.read() 
f.close() 

指向doc也很感謝!沒有找到這個確切的用例。

我打算解析xml到csv,如果這有所作爲。

+1

[這個答案](http://stackoverflow.com/a/4188709/416467)對一個類似的問題看起來非常簡單。 – kindall

+0

這是行不通的......不知道爲什麼,得到一個401沒有授權... – dartdog

+0

這個答案是使用Http基本認證,你使用的網址需要Digest認證。 –

回答

7

您正在處理http authentication。我一直覺得很難與urllib庫快速合作。 requests python包使得它非常簡單。

url = "http://www.nalmls.com/SERetsHuntsville/Search.aspx?SearchType=Property&Class=RES&StandardNames=0&Format=COMPACT&Query=(DATE_MODIFIED=2012-09-28T00:00:00%2B)&Limit=10" 
r = requests.get(url, auth=('user', 'pass')) 
page = r.text 

如果你看一下標題爲網址,你可以看到它使用的摘要式身份驗證:

{ '內容長度': '1893年',「X-powered- ''''ASP.NET', 'x-aspnet-version':'4.0.30319','server':'Microsoft-IIS/7.5', 'cache-control':'private','date' :'Fri,05 Oct 2012 18:20:54 GMT', 'content-type':'text/html;字符集= UTF-8' , 'WWW驗證': 文摘境界= 「固體地球」,隨機數= 「MTAvNS8yMDEyIDE6MjE6MjUgUE0」, 不透明= 「0000000000000000」,陳舊=假,算法= MD5,QOP =「AUTH 「'}

所以,你需要:

from requests.auth import HTTPDigestAuth 
r = requests.get(url, auth=HTTPDigestAuth('user', 'pass')) 
+0

看起來不錯,但沒有工作,仍然沒有得到授權... MMMM肯定看起來像它應該工作,雖然! – dartdog

+0

默認情況下,您可能需要requests.get(url,auth = HTTPDigestAuth('user','pass'))請求HTTPBasicAuth –

+0

這是關鍵! – dartdog

1

有很多方法可以做到這一點,但我建議你先urllib2和它的內含電池。

import urllib2, base64 

req = urllib2.Request("http://webpage.com//user") 
b64str = base64.encodestring('%s:%s' % (username, password)).replace('\n', '') 
request.add_header("Authorization", "Basic %s" % b64str) 
result = urllib2.urlopen(req) 

您可以使用requestsbeautifulsoupmechanizeselenium如果你的任務變得更難。谷歌搜索會給你足夠的例子對這些每一個,

+0

你可以使用'base64.b64encode()'來避免不必要的'.replace('\ n','')'。 – jfs

+0

這是從kindall第一條評論中提到的答案,不知道爲什麼,但我仍然有一個401未經授權...... – dartdog

0

這可以通過兩種方式來完成:

  1. 使用urllib/urllib2requests如其他人所說
  2. 使用Mechanize模擬手動表單填寫和回覆
相關問題