Python爬蟲教程:requests模擬登陸github

来源:https://www.cnblogs.com/7758520lzy/archive/2019/12/26/12102734.html
-Advertisement-
Play Games

1. Cookie 介紹 HTTP 協議是無狀態的。因此,若不藉助其他手段,遠程的伺服器就無法知道以前和客戶端做了哪些通信。Cookie 就是「其他手段」之一。 Cookie 一個典型的應用場景,就是用於記錄用戶在網站上的登錄狀態。 用戶登錄成功後,伺服器下發一個(通常是加密了的)Cookie 文件 ...


1. Cookie 介紹

HTTP 協議是無狀態的。因此,若不藉助其他手段,遠程的伺服器就無法知道以前和客戶端做了哪些通信。Cookie 就是「其他手段」之一。 Cookie 一個典型的應用場景,就是用於記錄用戶在網站上的登錄狀態。

 

 

  1. 用戶登錄成功後,伺服器下發一個(通常是加密了的)Cookie 文件。
  2. 客戶端(通常是網頁瀏覽器)將收到的 Cookie 文件保存起來。
  3. 下次客戶端與伺服器連接時,將 Cookie 文件發送給伺服器,由伺服器校驗其含義,恢復登錄狀態(從而避免再次登錄)。

2. requests使用cookie

當瀏覽器作為客戶端與遠端伺服器連接時,遠端伺服器會根據需要,產生一個 SessionID,並附在 Cookie 中發給瀏覽器。接下來的時間里,只要 Cookie 不過期,瀏覽器與遠端伺服器的連接,都會使用這個 SessionID;而瀏覽器會自動與伺服器協作,維護相應的 Cookie。

在  requests 中,也是這樣。我們可以創建一個  requests.Session ,爾後在該 Session 中與遠端伺服器通信,其中產生的 Cookie, requests 會自動為我們維護好。

3. POST 表單

post 方法可以將一組用戶數據,以表單的形式發送到遠端伺服器。遠端伺服器接受後,依照表單內容做相應的動作。

調用 requests 的 POST 方法時,可以用  data 參數接收一個 Python 字典結構。 requests會自動將 Python 字典序列化為實際的表單內容。例如:

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. 實際模擬登錄 GitHub 試試看

模擬登錄的第一步,首先是要搞清楚我們用瀏覽器登錄時都發生了什麼。

GitHub 登錄頁面是 https://github.com/login 。我們首先清空瀏覽器 Cookie 記錄,然後用 Chrome 打開登錄頁面。填入 Username 和 Password 之後,我們打開 Tamper Chrome 和 Chrome 的元素審查工具(找到 Network 標簽頁),之後點登錄按鈕。

在 Tamper Chrome 中,我們發現:雖然登錄頁面是 https://github.com/login ,但實際接收表單的是  https://github.com/session 。若登錄成功,則跳轉到  https://github.com/ 首頁,返回狀態碼  200 。

而在 Chrome 的審查元素視窗中,我們可以看到提交給  session 介面的表單信息。內里包含

commit
utf8
authenticity_token
login
password

其中, commit 和  utf8 兩項是定值; login 和  password 分別是用戶名和密碼,這很好理解。唯獨  authenticity_token 是一長串無規律的字元,我們不清楚它是什麼。

POST 動作發生在與 session 介面交互之前,因此可能的信息來源只有  login 介面。我們打開 login 頁面的源碼,試著搜索  authenticity_token 就不難發現有如下內容:

<input name="authenticity_token" type="hidden" value="......" />

原來,所謂的 authenticity_token 是明白寫在 HTML 頁面里的,只不過用  hidden 模式隱藏起來了。為此,我們只需要使用 Python 的正則庫解析一下,就好了。

import requests
import re

login_url  = 'https://github.com/login'
user = 'user'  //具體賬號
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. 首先,我們準備好了和 Chrome 一致的 HTTP 請求頭部信息。具體來說,其中的 User-Agent 是比較重要的。

2. 仿照瀏覽器與伺服器的通信,我們創建了一個 requests.Session 。

3. 我們用 GET 方法打開登錄頁面,並用正則庫解析到 authenticity_token 。

4. 將所需的數據,整備成一個 Python 字典login_data

5. 最後,用 POST 方法,將表單提交到 session 介面。

6. 最終的結果經由 302 跳轉,打開了( 200 )GitHub 首頁.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Go語言的強項在於它適合用來開髮網絡併發方面的服務,比如消息推送、監控、容器等,所以在高併發的項目上大多數公司會優先選擇 Golang 作為開發語言。 1、Google 這個不用多做介紹,作為開發Go語言的公司,當仁不讓。Google基於Go有很多優秀的項目,比如:https://github.co ...
  • 訂單是我們在日常開發中經常會遇到的一個功能,最近在做一個訂單過期與超時的開發。訂單過期與超時就不用我解釋了吧,其實兩者都是同一個問題來著,就是訂單未支付的處理,我們要做的是對這些未支付的訂單到了一定時間就自動取消,好了,你第一反應那肯定就是做一個定時任務了!是的,就是定時任務,但是哪個才會是最佳方案 ...
  • 一、Go的起源 Go語言的所有設計者都說,設計Go語言是因為 C++ 給他們帶來了挫敗感。在 Google I/O 2012 的 Go 設計小組見面會上,Rob Pike 是這樣說的: 我們做了大量的 C++ 開發,厭煩了等待編譯完成,儘管這是玩笑,但在很大程度上來說也是事實。Go 語言起源 200 ...
  • 一:首先,得簡單說說 thinkphp+workerman 的安裝。 安裝 thinkphp5.1 composer create-project topthink/think=5.1.x-dev tp5andworkman 安裝 think-worker 我的官方群點擊此處。 composer r ...
  • 什麼是RPC框架? 如果用一句話概括RPC就是:遠程調用框架(Remote Procedure Call) 那什麼是遠程調用? 我的官方群點擊此處。 通常我們調用一個php中的方法,比如這樣一個函數方法: localAdd(10, 20),localAdd方法的具體實現要麼是用戶自己定義的,要麼是p ...
  • 一.安裝redis擴展 下載redis擴展包以及解壓 wget https://github.com/edtechd/phpredis/archive/php7.zip unzip php7.zip 進入解壓後目錄,編譯安裝 cd data/pkg/phpredis-php7 /usr/local/ ...
  • 什麼是Shiro shiro是一個強大易用的java的安全框架,執行身份校驗,授權,密碼和會話管理。 使用shiro的API。可以輕鬆的快速的獲得任何應用程式,從最小移動程式到最大的網路和企業應用程式。 shiro的首要目標就是易於理解和使用,安全有時候是很複雜的,甚至是痛苦的,但是沒有必要這樣。 ...
  • 四種常見的數據結構: 1.堆棧結構: 先進後出的特點。(就像彈夾一樣,先進去的在後進去的低下。) 2.隊列結構: 先進先出的特點。(就像安檢一樣,先進去的先出來) 3.數組結構: 查找元素快,但是增刪元素慢 4.鏈表結構: 增刪元素快,但是查找元素慢 LinkedList:(List介面下的一個子類 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...