[英]How to "log in" to a website using Python's Requests module?
我正在嘗試使用 Python 中的 Requests 模塊發布登錄網站的請求,但它並沒有真正起作用。 我是新手……所以我不知道我是否應該制作我的用戶名和密碼 cookie 或我發現的某種類型的 HTTP 授權(??)。
from pyquery import PyQuery
import requests
url = 'http://www.locationary.com/home/index2.jsp'
所以現在,我想我應該使用“post”和cookies....
ck = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
r = requests.post(url, cookies=ck)
content = r.text
q = PyQuery(content)
title = q("title").text()
print title
我有一種感覺,我在做餅干的事情是錯誤的......我不知道。
如果它沒有正確登錄,主頁的標題應該是“Locationary.com”,如果是,它應該是“主頁”。
如果您能向我解釋一些有關請求和 cookie 的事情並幫助我解決這個問題,我將不勝感激。 :D
謝謝。
......它仍然沒有真正起作用。 好的...所以這是您登錄前主頁 HTML 所說的內容:
</td><td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_email.gif"> </td>
<td><input class="Data_Entry_Field_Login" type="text" name="inUserName" id="inUserName" size="25"></td>
<td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_password.gif"> </td>
<td><input class="Data_Entry_Field_Login" type="password" name="inUserPass" id="inUserPass"></td>
所以我認為我做得對,但輸出仍然是“Locationary.com”
第二次編輯:
我希望能夠長時間保持登錄狀態,每當我請求該域下的頁面時,我都希望內容顯示為我已登錄。
我知道您已經找到了另一種解決方案,但是對於像我這樣發現這個問題的人來說,尋找同樣的事情,可以通過如下請求來實現:
首先,像 Marcus 一樣,檢查登錄表單的來源以獲取三個信息 - 表單發布到的 url,以及用戶名和密碼字段的名稱屬性。 在他的示例中,它們是 inUserName 和 inUserPass。
獲得該信息后,您可以使用requests.Session()
實例向登錄 url 發出 post 請求,並將您的登錄詳細信息作為有效負載。 從會話實例發出請求與正常使用請求基本相同,它只是增加了持久性,允許您存儲和使用 cookie 等。
假設您的登錄嘗試成功,您可以簡單地使用會話實例向站點發出進一步請求。 識別您身份的 cookie 將用於授權請求。
例子
import requests
# Fill in your details here to be posted to the login form.
payload = {
'inUserName': 'username',
'inUserPass': 'password'
}
# Use 'with' to ensure the session context is closed after use.
with requests.Session() as s:
p = s.post('LOGIN_URL', data=payload)
# print the html returned or something more intelligent to see if it's a successful login page.
print p.text
# An authorised request.
r = s.get('A protected web page url')
print r.text
# etc...
讓我們調用您的ck
變量payload
,就像在python-requests文檔中一樣:
payload = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
url = 'http://www.locationary.com/home/index2.jsp'
requests.post(url, data=payload)
讓我試着簡單點,假設站點的 URL 是http://example.com/並且假設您需要通過填寫用戶名和密碼來注冊,所以我們去登錄頁面說http://example。 com/login.php現在查看它的源代碼並搜索操作 URL 它將在表單標簽中
<form name="loginform" method="post" action="userinfo.php">
現在使用 userinfo.php 生成絕對 URL,即“ http://example.com/userinfo.php ”,現在運行一個簡單的 python 腳本
import requests
url = 'http://example.com/userinfo.php'
values = {'username': 'user',
'password': 'pass'}
r = requests.post(url, data=values)
print r.content
我希望這能在某天幫助某人。
requests.Session()
解決方案有助於登錄具有 CSRF 保護的表單(如在 Flask-WTF 表單中使用)。 檢查是否需要csrf_token
作為隱藏字段,並使用用戶名和密碼將其添加到有效負載中:
import requests
from bs4 import BeautifulSoup
payload = {
'email': 'email@example.com',
'password': 'passw0rd'
}
with requests.Session() as sess:
res = sess.get(server_name + '/signin')
signin = BeautifulSoup(res._content, 'html.parser')
payload['csrf_token'] = signin.find('input', id='csrf_token')['value']
res = sess.post(server_name + '/auth/login', data=payload)
找出網站表單中用於用戶名<...name=username.../>
和密碼<...name=password../>
<...name=username.../>
<...name=password../>
,並在下面的腳本中替換它們。 還要替換 URL 以指向要登錄的所需站點。
登錄.py
#!/usr/bin/env python
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
payload = { 'username': 'user@email.com', 'password': 'blahblahsecretpassw0rd' }
url = 'https://website.com/login.html'
requests.post(url, data=payload, verify=False)
當嘗試使用未經驗證的 SSL 證書登錄站點時,使用disable_warnings(InsecureRequestWarning)
將使腳本的任何輸出靜音。
額外的:
要在基於 UNIX 的系統上從命令行運行此腳本,請將它放在一個目錄中,即home/scripts
並將此目錄添加到~/.bash_profile
或終端使用的類似文件中的路徑中。
# Custom scripts
export CUSTOM_SCRIPTS=home/scripts
export PATH=$CUSTOM_SCRIPTS:$PATH
然后在home/scripts/login.py
創建指向此 python 腳本的鏈接
ln -s ~/home/scripts/login.py ~/home/scripts/login
關閉你的終端,開始一個新的,運行login
某些頁面可能需要的不僅僅是登錄/通行證。 甚至可能存在隱藏字段。 最可靠的方法是使用檢查工具並在登錄時查看網絡選項卡,以查看正在傳遞哪些數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.