簡體   English   中英

如何使用 Python 的 Requests 模塊“登錄”到網站?

[英]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)

除此以外...

請參閱下面的https://stackoverflow.com/a/17633072/111362

讓我試着簡單點,假設站點的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM