2012-10-01 42 views
1

我使用URLlib2(和python 2.7)從網站抓取一些內容。到目前爲止,我一直使用URLlib2 OK來獲取內容,但這是我第一次訪問內容級密碼的網站。我有一個合法的u:p(我顯然不能在這裏分享),看起來我沒有按照我的要求給出正確的憑證。python urllib2,密碼內容和空響應

我使用的方法在這裏:Python urllib2, basic HTTP authentication, and tr.im更換(username, password)我的憑據作爲字符串(「名爲myUsername」,「MYPASSWORD」)

當我print result.read()我得到一個空行,當我嘗試print result.headers()我得到:

<addinfourl at 40895752L whose fp = <socket._fileobject object at 0x00000000026757C8>>

爲例,爲號召,我以爲是指的每一個實例預期有一個文件對象有各種各樣的......

我試圖print result.info(),看看是否有一個頭回來了,我看到一組頭:

REDACTED 
Date: Mon, 01 Oct 2012 10:06:24 GMT 
Server: Apache/2.2.3 (Red Hat) 
X-Powered-By: PHP/5.1.6 
Set-Cookie: OJSSID=mc7u47e674jmpjgk3kspfgc9l3; path=/ 
Refresh: 0; url=http:REDACTED loginMessage=reader.subscriptionRequiredLoginText 
Content-Length: 0 
Connection: close 
Content-Type: text/html; charset=UTF-8 

所以我可以從「loginMessage = reader.subscriptionRequiredLoginText」我已經無法正常發送的憑據。

任何指針?

調用代碼:

def getArticle(newLink): 
request = urllib2.Request(newLink) 
base64string = base64.encodestring('%s:%s' % ("myUsername", "myPassword")).replace('\n', '') 
request.add_header("Authorization", "Basic %s" % base64string) 
result = urllib2.urlopen(request) 
print result.read() 

和示例URL爲:絕密 - 它不是我的網站!

回答

2

你會發現處理requests庫比urllib2好得多。

看看你提供的鏈接,它不需要基本身份驗證,而是一個表單...所以你需要獲取表單的'action'屬性的URL,並提交數據。一個例子使用的要求:

import requests 
url = 'http://www.content.alternative.ac.nz/index.php/alternative/login/signIn' 
r = requests.post(url, data={'username': 'username', 'password': 'password', 'remember': '1'}) 

這個我不能完全檢查(因爲我沒有一個有效的ü& P),而是通過發送有效勾選「記住我」按鈕,你應該再得到一個通過r.cookies訪問的cookie,希望是指可以用於進一步的要求,如:

cookies = r.cookies 
r = requests.get('http://www.content.alternative.ac.nz/index.php/alternative/article/view/176/202', cookies=cookies) 
+0

謝謝,這真的很有用,我打算(1)編輯URL信息和(2)將此標記爲已回答,等待我的解決方案,我相信解決方案在於正確處理表單u:p :)謝謝你的時間。 –

1

我建議使用Requests for Humans而不是urllib2。它使用起來更簡單,更明顯。

有時站點不支持基本的HTTP授權,假設在每個請求的標頭中發送證書。相反,他們需要在登錄頁面上使用憑證進行POST。此POST在服務器上驗證,並且如果憑證正確,服務器將返回帶有「Set-Cookie:name = value」的響應,要求瀏覽器保存cookie。然後這個cookie被用來識別已認證的客戶端。

好像是你的情況。在您的示例中,您需要向http://www.content.alternative.ac.nz/index.php/alternative/login/signIn發出POST請求,使用您擁有的憑據設置參數「login」和「password」。然後從響應中檢索cookie並將其添加到下一個請求,如this

+0

哦,冷靜,這就是大量的探索,謝謝!我想只要你將cookie傳遞給每個後續的調用,你都可以維護一個持久會話。欣賞你的時間(我解決了關於獲取標題數據的錯誤..) –