python requests模擬登陸github的實(shí)現(xiàn)方法
1. Cookie 介紹
HTTP 協(xié)議是無狀態(tài)的。因此,若不借助其他手段,遠(yuǎn)程的服務(wù)器就無法知道以前和客戶端做了哪些通信。Cookie 就是「其他手段」之一。 Cookie 一個(gè)典型的應(yīng)用場(chǎng)景,就是用于記錄用戶在網(wǎng)站上的登錄狀態(tài)。
- 用戶登錄成功后,服務(wù)器下發(fā)一個(gè)(通常是加密了的)Cookie 文件。
- 客戶端(通常是網(wǎng)頁瀏覽器)將收到的 Cookie 文件保存起來。
- 下次客戶端與服務(wù)器連接時(shí),將 Cookie 文件發(fā)送給服務(wù)器,由服務(wù)器校驗(yàn)其含義,恢復(fù)登錄狀態(tài)(從而避免再次登錄)。
2.requests使用cookie
當(dāng)瀏覽器作為客戶端與遠(yuǎn)端服務(wù)器連接時(shí),遠(yuǎn)端服務(wù)器會(huì)根據(jù)需要,產(chǎn)生一個(gè) SessionID,并附在 Cookie 中發(fā)給瀏覽器。接下來的時(shí)間里,只要 Cookie 不過期,瀏覽器與遠(yuǎn)端服務(wù)器的連接,都會(huì)使用這個(gè) SessionID;而瀏覽器會(huì)自動(dòng)與服務(wù)器協(xié)作,維護(hù)相應(yīng)的 Cookie。
在requests
中,也是這樣。我們可以創(chuàng)建一個(gè)requests.Session
,爾后在該 Session 中與遠(yuǎn)端服務(wù)器通信,其中產(chǎn)生的 Cookie,requests
會(huì)自動(dòng)為我們維護(hù)好。
3. POST 表單
post 方法可以將一組用戶數(shù)據(jù),以表單的形式發(fā)送到遠(yuǎn)端服務(wù)器。遠(yuǎn)端服務(wù)器接受后,依照表單內(nèi)容做相應(yīng)的動(dòng)作。
調(diào)用requests
的 POST 方法時(shí),可以用data
參數(shù)接收一個(gè) Python 字典結(jié)構(gòu)。requests
會(huì)自動(dòng)將 Python 字典序列化為實(shí)際的表單內(nèi)容。例如:
import requests cs_url = 'http://httpbin.org/post' my_data = { 'key1' : 'value1', 'key2' : 'value2' } r = requests.post (cs_url, data = my_data) print r.content
4. 實(shí)際模擬登錄 GitHub 試試看
模擬登錄的第一步,首先是要搞清楚我們用瀏覽器登錄時(shí)都發(fā)生了什么。
GitHub 登錄頁面是https://github.com/login。我們首先清空瀏覽器 Cookie 記錄,然后用 Chrome 打開登錄頁面。填入 Username 和 Password 之后,我們打開 Tamper Chrome 和 Chrome 的元素審查工具(找到 Network 標(biāo)簽頁),之后點(diǎn)登錄按鈕。
在 Tamper Chrome 中,我們發(fā)現(xiàn):雖然登錄頁面是https://github.com/login,但實(shí)際接收表單的是https://github.com/session。若登錄成功,則跳轉(zhuǎn)到https://github.com/首頁,返回狀態(tài)碼200
。
而在 Chrome 的審查元素窗口中,我們可以看到提交給session
接口的表單信息。內(nèi)里包含
- commit
- utf8
- authenticity_token
- login
- password
其中,commit
和utf8
兩項(xiàng)是定值;login
和password
分別是用戶名和密碼,這很好理解。唯獨(dú)authenticity_token
是一長(zhǎng)串無規(guī)律的字符,我們不清楚它是什么。
POST 動(dòng)作發(fā)生在與session
接口交互之前,因此可能的信息來源只有login
接口。我們打開 login 頁面的源碼,試著搜索authenticity_token
就不難發(fā)現(xiàn)有如下內(nèi)容:
<input name="authenticity_token" type="hidden" value="......" />
原來,所謂的authenticity_token
是明白寫在 HTML 頁面里的,只不過用hidden
模式隱藏起來了。為此,我們只需要使用 Python 的正則庫解析一下,就好了。
import requests import re login_url = 'https://github.com/login' user = 'user' //具體賬號(hào) password = 'password' //具體密碼 user_headers = { 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36', 'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding' : 'gzip', 'Accept-Language' : 'zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4' } session = requests.Session() response = session.get(login_url, headers = user_headers) pattern = re.compile(r'<input name="authenticity_token" type="hidden" value="(.*)" />') authenticity_token = pattern.findall(response.content)[0] login_data = { 'commit' : 'Sign in', 'utf8' : '%E2%9C%93', 'authenticity_token' : authenticity_token,'login' : user, 'password' : password } session_url = 'https://github.com/session' response = session.post(session_url, headers = user_headers, data = login_data)
1. 首先,我們準(zhǔn)備好了和 Chrome 一致的 HTTP 請(qǐng)求頭部信息。具體來說,其中的User-Agent
是比較重要的。
2. 仿照瀏覽器與服務(wù)器的通信,我們創(chuàng)建了一個(gè)requests.Session
。
3. 我們用 GET 方法打開登錄頁面,并用正則庫解析到authenticity_token
。
4. 將所需的數(shù)據(jù),整備成一個(gè) Python 字典login_data
5. 最后,用 POST 方法,將表單提交到session
接口。
6. 最終的結(jié)果經(jīng)由302
跳轉(zhuǎn),打開了(200
)GitHub 首頁.
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python讀取指定字節(jié)長(zhǎng)度的文本方法
今天小編就為大家分享一篇python讀取指定字節(jié)長(zhǎng)度的文本方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python+selenium點(diǎn)擊網(wǎng)頁上指定坐標(biāo)的實(shí)例
今天小編就為大家分享一篇Python+selenium點(diǎn)擊網(wǎng)頁上指定坐標(biāo)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07python mongo 向數(shù)據(jù)中的數(shù)組類型新增數(shù)據(jù)操作
這篇文章主要介紹了python mongo 向數(shù)據(jù)中的數(shù)組類型新增數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12python實(shí)現(xiàn)讀取學(xué)術(shù)論文PDF文件內(nèi)容
這篇文章主要為大家詳細(xì)介紹了如何通過python實(shí)現(xiàn)讀取學(xué)術(shù)論文PDF文件內(nèi)容的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-10-10Python實(shí)現(xiàn)去除Excel重復(fù)數(shù)據(jù)并統(tǒng)計(jì)重復(fù)次數(shù)
這篇文章主要為大家詳細(xì)介紹了如何利用Python語言實(shí)現(xiàn)文本數(shù)據(jù)去重,創(chuàng)建包含唯一值的新列,并統(tǒng)計(jì)文本數(shù)據(jù)出現(xiàn)的次數(shù),需要的可以參考下2023-08-08