2012-11-13 25 views
1

我想寫使用雙絞線一個簡單的Web客戶端,即登錄到網站的用戶名和密碼,並從給定的頁面抓取一些數據。做這個的最好方式是什麼?登錄到網頁使用雙絞線網絡

編輯:要添加一些更多的細節:這是一個簡單的用戶名/密碼的HTML表單提交。有一個PHPSESSID cookie涉及這是一個PHP網站。沒有驗證碼。沒有HTTP認證。

+1

有很多方法可以登錄到網站。你需要提交一個帶有用戶名和密碼字段的HTML表單嗎?你需要填寫CAPTCHA嗎?你需要提供HTTP認證憑證嗎?或提交身份驗證Cookie,或執行OAuth登錄? –

+0

我已經爲我的問題添加了更多參數,但是我覺得給出一個通用的解決方案會更好,可以擴展到包含這些選項。 – Lars

+0

沒有一個通用的解決方案。有十幾種不同的解決方案。 –

回答

2

HTML表單身份驗證通過提交身份驗證表單完成。這意味着知道表單動作和方法。對於初學者,您可以手動讀取頁面源並找出這些信息。更通用的解決方案可能涉及解析頁面(可能使用lxml或html5lib)並自動提取此信息。

您還需要了解在表單中的用戶名和密碼字段,以及姓名和正確的價值觀爲任何其他強制性表單字段的名稱。

例如,看起來像這樣一種形式:

<form action="https://example.com/auth" method="post"> 
    <input type="text" name="Email" id="Email" value=""> 
    <input type="password" name="Password" id="Password" value=""> 
</form> 

具有https://example.com/auth一個表單動作和post的方法。因此,您需要向https://example.com/auth發出POST請求。

按照慣例,用於以這樣的請求中的數據的編碼使用application/x-www-form-urlencoded作爲其內容類型。

可以編碼體內使用Python這樣的請求STDLIB urllib.urlencode

最後,如果認證成功表示爲必須與將來的請求表示一個cookie,你需要確保你捕捉到cookie的值,然後重新發送。

因此,把所有這些組合起來:

from twisted.web.client import getPage 

cookies = {} 
d = getPage(
    "https://example.com/auth", 
    method="POST", 
    headers={"content-type": "application/x-www-form-urlencoded"}, 
    postdata=urllib.urlencode(dict(Email="[email protected]", Password="secret")), 
    cookies=cookies) 

cookie字典將與由服務器設置的任何cookie的值來填充。將它與未來的任何getPage調用一起傳遞給您要使用此身份驗證的結果。

所有這一切說,我喜歡使用scrapy的建議。它會爲你做很多低級別的事情,讓你專注於你的問題中更有趣的部分。

+0

這很好。我只是添加了另一個回調來請求另一個頁面,並從該頁面獲取我想要的HTML。 Scrapy很好,但我想在一個更大的腳本中使用它,並且想要提取這個功能。謝謝! – Lars