Python 模擬登錄幾種常見方法

来源:https://www.cnblogs.com/wlgaojin/archive/2020/02/20/12337577.html
-Advertisement-
Play Games

方法一:直接使用已知的cookie訪問 優點: 簡單,但需要先在瀏覽器登錄 原理: 簡單地說,cookie保存在發起請求的客戶端中,伺服器利用cookie來區分不同的客戶端。因為http是一種無狀態的連接,當伺服器一下子收到好幾個請求時,是無法判斷出哪些請求是同一個客戶端發起的。而“訪問登錄後才能看 ...


方法一:直接使用已知的cookie訪問

 

優點:

  簡單,但需要先在瀏覽器登錄

原理:

  簡單地說,cookie保存在發起請求的客戶端中,伺服器利用cookie來區分不同的客戶端。因為http是一種無狀態的連接,當伺服器一下子收到好幾個請求時,是無法判斷出哪些請求是同一個客戶端發起的。而“訪問登錄後才能看到的頁面”這一行為,恰恰需要客戶端向伺服器證明:“我是剛纔登錄過的那個客戶端”。於是就需要cookie來標識客戶端的身份,以存儲它的信息(如登錄狀態)。

  當然,這也意味著,只要得到了別的客戶端的cookie,我們就可以假冒成它來和伺服器對話。這給我們的程式帶來了可乘之機。

  我們先用瀏覽器登錄,然後使用開發者工具查看cookie。接著在程式中攜帶該cookie向網站發送請求,就能讓你的程式假扮成剛纔登錄的那個瀏覽器,得到只有登錄後才能看到的頁面。

具體步驟:

1.用瀏覽器登錄,獲取瀏覽器里的cookie字元串

  先使用瀏覽器登錄。再打開開發者工具,轉到network選項卡。在左邊的Name一欄找到當前的網址,選擇右邊的Headers選項卡,查看Request Headers,這裡包含了該網站頒發給瀏覽器的cookie。對,就是後面的字元串。把它複製下來,一會兒代碼里要用到。

  註意,最好是在運行你的程式前再登錄。如果太早登錄,或是把瀏覽器關了,很可能複製的那個cookie就過期無效了。

 

 

 

 

2 貼代碼

  這邊直接使用requests 庫來進行請求    urllib庫的版本 太繁瑣  代碼寫的也多

"""
直接獲取 個人中心的頁面
手動粘貼 輔助 pc 抓包的 cookies
放在 request對象的請求頭裡面
"""

import  requests

#1 數據url
url = "http://www.juming.com"

# 這裡是從 瀏覽器複製過來的 cookiestr = 'pgv_pvi=3062528000; _;=; =1579855336,1580038094,,1582021806; IESESSION=alive; pgv_si=s7468463104; ASPSESSIONIDQSTAQSCD=NKOGKGPBDCLNOOGIGFADHCNP; ASPSESSIONIDSQSATRCD=PHDHCNDCBHEFKINKPOFBDHEF; ASPSESSIONIDQQSARSDC=KOIIFBJCHHCLKPMKPNCEJHOI; ASPSESSIONIDSSRARSDD=HOFGFPJCFGBDDOJBOGNOGCPL; Hm_lvt_512ed551fae9428abd7d743009588c7a=1580038094,1581251646,1582021806; ASPSESSIONIDSSQCRSCD=JLDCMFOCJBJHNDIFJEEFBHDL; _qddab=3-qwql4k.k6u9ijsq; ASPSESSIONIDQSSATQDC=BKNFMPADENCCEEFACHFGEALB; ASPSESSIONIDQSSAQSCD=KIDLMNBDAHIGKPNLJIMMGGFG;' agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36' #2 添加請求頭 headers = { "User-Agent":agent, } #把cookie字元串處理成字典,以便接下來使用 cookies = {} for line in cookiestr.split(';'): key, value = line.split('=', 1) cookies[key] = value s=requests.session() rs=s.get(url,headers=headers,cookies =cookies, verify=False) #5 讀取數據 rs.encoding='gbk' # 把數據存到文本里 f=open("01cook.html","w",encoding='gbk') f.write(rs.text) f.close()

 

方法二:模擬登錄後再攜帶得到的cookie訪問

原理:

  我們先在程式中向網站發出登錄請求,也就是提交包含登錄信息的表單(用戶名、密碼等)。從響應中得到cookie,今後在訪問其他頁面時也帶上這個cookie,就能得到只有登錄後才能看到的頁面。

具體步驟:

1.找出表單提交到的頁面

  還是要利用瀏覽器的開發者工具。轉到network選項卡,並勾選Preserve Log(重要!)。在瀏覽器里登錄網站。然後在左邊的Name一欄找到表單提交到的頁面。怎麼找呢?看看右側,轉到Headers選項卡。首先,在General那段,Request Method應當是POST。其次最下方應該要有一段叫做Form Data的,裡面可以看到你剛纔輸入的用戶名和密碼等。也可以看看左邊的Name,如果含有login這個詞,有可能就是提交表單的頁面(不一定!)。

 

 

 

  這裡要強調一點,“表單提交到的頁面”通常並不是你填寫用戶名和密碼的頁面!所以要利用工具來找到它。

 

2.找出要提交的數據

  雖然你在瀏覽器里登陸時只填了用戶名和密碼,但表單里包含的數據可不只這些。從Form Data里就可以看到需要提交的所有數據。

 

 

3.寫代碼

 

from urllib import parse   #轉譯
import requests

 # 1.1 登錄的網址
login_url = "https://www.jinmi.com/Login/index"


#1.2 登錄的參數
login_form_data = {
    "userKey": "xxx",
    "password": "xxxx",
}

agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3650.400 QQBrowser/10.4.3341.400";

#帶著參數 發送post請求
#添加請求頭
headers = {
    "User-Agent": agent
}

#1 參數 將來 需要轉譯 轉碼; 2 post 請求的 data 要求是bytes
login_str = parse.urlencode(login_form_data).encode('utf-8')

## 構建請求對象
response = requests.post(login_url,login_form_data,headers = headers)

## 獲得訪問 cookie
cookies = response.cookies

setting_url = "https://www.jinmi.com/User/index"

# 這邊直接訪問會員中心
rs = requests.get(setting_url, headers=headers, cookies=cookies)


#5 讀取數據
rs.encoding='utf-8'

# 把數據存到文本里
f=open("03cook.html","w",encoding='utf-8')
f.write(rs.text)
f.close()

方法三:模擬登錄後用session保持登錄狀態

原理:

  session是會話的意思。和cookie的相似之處在於,它也可以讓伺服器“認得”客戶端。簡單理解就是,把每一個客戶端和伺服器的互動當作一個“會話”。既然在同一個“會話”里,伺服器自然就能知道這個客戶端是否登錄過。

具體步驟:

1.找出表單提交到的頁面

2.找出要提交的數據

  這兩步和方法二的前兩步是一樣的

3.寫代碼

 

# 1。定義請求參數
login_url = "https://www.jinmi.com/Login/index"

headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36",
}
# 1.2 登錄的參數
data = {
"userKey": "wwww",
"password": "wwwww",
}

# 構造Session
session = requests.session()

# 在session中發送登錄請求,此後這個session里就存儲了cookie
session.post(login_url, data, headers=headers)

### 列印session   這邊可以直接存貯起來
#print(session.cookies.get_dict())

# 登錄後才能訪問的網頁
setting_url = "https://www.jinmi.com/User/index"
rs = session.get(setting_url, headers=headers)

# 這樣的方式也可以訪問
#rs = requests.get(setting_url, headers=headers, cookies=session.cookies)

# 把數據存到文本里
f = open("04cook.html", "w", encoding='utf-8')
f.write(rs.text)
f.close()

 

 

 

 還有很多方式 後續 我在更新 這些都是簡單的 直接登錄就行的 有複雜的 各種 js 加密 具體還需要自行實踐


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

-Advertisement-
Play Games
更多相關文章
  • 一、List集合 1.List集合存儲元素的特點: (1)有序(List集合中存儲有下標)​:存進去是這樣的順序,取出來還是按照這個順序取出​。 (2)可重覆 2.深入ListJ集合 ArrayList集合底層是數組,數組​是有下標的;所以ArrayList集合有很多自己的特性​;ArrayList ...
  • 開發環境: Windows操作系統開發工具: MyEclipse+Jdk+Tomcat+MySQL資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=45 ...
  • 開發環境: Windows操作系統開發工具: Myeclipse+Jdk+Tomcat+MySQL資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=44 ...
  • 原創聲明 本文作者:黃小斜 轉載請務必在文章開頭註明出處和作者。 本文思維導圖 什麼是演算法 上回我們有一篇文章,講述了作為一個新人程式員,如何學習數據結構這門課程,其實呢,數據結構和演算法是息息相關的,為什麼這麼說呢,因為數據結構本身只是一個載體,而在數據結構之上產生作用和輸出價值的東西其實是演算法。 ...
  • 關註公眾號:CoderBuff,回覆“redis”獲取《Redis5.x入門教程》完整版PDF。 《Redis5.x入門教程》目錄 "第一章 · 準備工作" "第二章 · 數據類型" 第三章 · ​命令 第四章 ​· 配置 第五章 · Java客戶端(上) 第六章 · 事務 第七章 · 分散式鎖 第 ...
  • Java基礎 多線程 多個線程一起做同一件事情,縮短時間,提升效率 提高資源利用率 加快程式響應,提升用戶體驗 創建線程 1. 繼承Thread類 步驟 繼承Thread類,重寫run方法 調用的時候,直接new一個對象,然後調start()方法啟動線程 特點 由於是繼承方式,所以不建議使用,因為J ...
  • 1.Object類 equals方法 2.Date類 構造方法 成員方法 DateFormat類 Calendar類 3.System類 StringBuilder原理 構造方法 toString方法 4.包裝類 裝箱&拆箱 自動裝箱&自動拆箱 基本類型和字元串類型的 轉換 5.Collection ...
  • 11、Filter (重點) Filter:過濾器 ,用來過濾網站的數據; 處理中文亂碼 登錄驗證…. Filter開發步驟: 1. 導包 2. 編寫過濾器 1. 導包不要錯 實現Filter介面,重寫對應的方法即可 3. 在web.xml中配置 Filter 12、監聽器 實現一個監聽器的介面;( ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...