我想寫使用雙絞線一個簡單的Web客戶端,即登錄到網站的用戶名和密碼,並從給定的頁面抓取一些數據。做這個的最好方式是什麼?登錄到網頁使用雙絞線網絡
編輯:要添加一些更多的細節:這是一個簡單的用戶名/密碼的HTML表單提交。有一個PHPSESSID cookie涉及這是一個PHP網站。沒有驗證碼。沒有HTTP認證。
我想寫使用雙絞線一個簡單的Web客戶端,即登錄到網站的用戶名和密碼,並從給定的頁面抓取一些數據。做這個的最好方式是什麼?登錄到網頁使用雙絞線網絡
編輯:要添加一些更多的細節:這是一個簡單的用戶名/密碼的HTML表單提交。有一個PHPSESSID cookie涉及這是一個PHP網站。沒有驗證碼。沒有HTTP認證。
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的建議。它會爲你做很多低級別的事情,讓你專注於你的問題中更有趣的部分。
這很好。我只是添加了另一個回調來請求另一個頁面,並從該頁面獲取我想要的HTML。 Scrapy很好,但我想在一個更大的腳本中使用它,並且想要提取這個功能。謝謝! – Lars
有很多方法可以登錄到網站。你需要提交一個帶有用戶名和密碼字段的HTML表單嗎?你需要填寫CAPTCHA嗎?你需要提供HTTP認證憑證嗎?或提交身份驗證Cookie,或執行OAuth登錄? –
我已經爲我的問題添加了更多參數,但是我覺得給出一個通用的解決方案會更好,可以擴展到包含這些選項。 – Lars
沒有一個通用的解決方案。有十幾種不同的解決方案。 –