Python 模擬登錄幾種常見方法


方法一:直接使用已知的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 加密 具體還需要自行實踐


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM