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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...