Python模擬登錄的多種方法(四種)
正文
方法一:直接使用已知的cookie訪問
特點(diǎn):
簡(jiǎn)單,但需要先在瀏覽器登錄
原理:
簡(jiǎn)單地說,cookie保存在發(fā)起請(qǐng)求的客戶端中,服務(wù)器利用cookie來區(qū)分不同的客戶端。因?yàn)閔ttp是一種無狀態(tài)的連接,當(dāng)服務(wù)器一下子收到好幾個(gè)請(qǐng)求時(shí),是無法判斷出哪些請(qǐng)求是同一個(gè)客戶端發(fā)起的。而“訪問登錄后才能看到的頁面”這一行為,恰恰需要客戶端向服務(wù)器證明:“我是剛才登錄過的那個(gè)客戶端”。于是就需要cookie來標(biāo)識(shí)客戶端的身份,以存儲(chǔ)它的信息(如登錄狀態(tài))。
當(dāng)然,這也意味著,只要得到了別的客戶端的cookie,我們就可以假冒成它來和服務(wù)器對(duì)話。這給我們的程序帶來了可乘之機(jī)。
我們先用瀏覽器登錄,然后使用開發(fā)者工具查看cookie。接著在程序中攜帶該cookie向網(wǎng)站發(fā)送請(qǐng)求,就能讓你的程序假扮成剛才登錄的那個(gè)瀏覽器,得到只有登錄后才能看到的頁面。
具體步驟:
1.用瀏覽器登錄,獲取瀏覽器里的cookie字符串
先使用瀏覽器登錄。再打開開發(fā)者工具,轉(zhuǎn)到network選項(xiàng)卡。在左邊的Name一欄找到當(dāng)前的網(wǎng)址,選擇右邊的Headers選項(xiàng)卡,查看Request Headers,這里包含了該網(wǎng)站頒發(fā)給瀏覽器的cookie。對(duì),就是后面的字符串。把它復(fù)制下來,一會(huì)兒代碼里要用到。
注意,最好是在運(yùn)行你的程序前再登錄。如果太早登錄,或是把瀏覽器關(guān)了,很可能復(fù)制的那個(gè)cookie就過期無效了。
2.寫代碼
urllib庫的版本:
import sys import io from urllib import request sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改變標(biāo)準(zhǔn)輸出的默認(rèn)編碼 #登錄后才能訪問的網(wǎng)站 url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal' #瀏覽器登錄后得到的cookie,也就是剛才復(fù)制的字符串 cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx' #登錄后才能訪問的網(wǎng)頁 url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal' req = request.Request(url) #設(shè)置cookie req.add_header('cookie', raw_cookies) #設(shè)置請(qǐng)求頭 req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36') resp = request.urlopen(req) print(resp.read().decode('utf-8'))
requests庫的版本:
import requests import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改變標(biāo)準(zhǔn)輸出的默認(rèn)編碼 #登錄后才能訪問的網(wǎng)頁 url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal' #瀏覽器登錄后得到的cookie,也就是剛才復(fù)制的字符串 cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx' #把cookie字符串處理成字典,以便接下來使用 cookies = {} for line in cookie_str.split(';'): key, value = line.split('=', 1) cookies[key] = value
方法二:模擬登錄后再攜帶得到的cookie訪問
原理:
我們先在程序中向網(wǎng)站發(fā)出登錄請(qǐng)求,也就是提交包含登錄信息的表單(用戶名、密碼等)。從響應(yīng)中得到cookie,今后在訪問其他頁面時(shí)也帶上這個(gè)cookie,就能得到只有登錄后才能看到的頁面。
具體步驟:
1.找出表單提交到的頁面
還是要利用瀏覽器的開發(fā)者工具。轉(zhuǎn)到network選項(xiàng)卡,并勾選Preserve Log(重要!)。在瀏覽器里登錄網(wǎng)站。然后在左邊的Name一欄找到表單提交到的頁面。怎么找呢?看看右側(cè),轉(zhuǎn)到Headers選項(xiàng)卡。首先,在General那段,Request Method應(yīng)當(dāng)是POST。其次最下方應(yīng)該要有一段叫做Form Data的,里面可以看到你剛才輸入的用戶名和密碼等。也可以看看左邊的Name,如果含有l(wèi)ogin這個(gè)詞,有可能就是提交表單的頁面(不一定?。?/p>
這里要強(qiáng)調(diào)一點(diǎn),“表單提交到的頁面”通常并不是你填寫用戶名和密碼的頁面!所以要利用工具來找到它。
2.找出要提交的數(shù)據(jù)
雖然你在瀏覽器里登陸時(shí)只填了用戶名和密碼,但表單里包含的數(shù)據(jù)可不只這些。從Form Data里就可以看到需要提交的所有數(shù)據(jù)。
3.寫代碼
urllib庫的版本:
import sys import io import urllib.request import http.cookiejar sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改變標(biāo)準(zhǔn)輸出的默認(rèn)編碼 #登錄時(shí)需要POST的數(shù)據(jù) data = {'Login.Token1':'學(xué)號(hào)', 'Login.Token2':'密碼', 'goto:http':'//ssfw.xmu.edu.cn/cmstar/loginSuccess.portal', 'gotoOnFail:http':'//ssfw.xmu.edu.cn/cmstar/loginFailure.portal'} post_data = urllib.parse.urlencode(data).encode('utf-8') #設(shè)置請(qǐng)求頭 headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'} #登錄時(shí)表單提交到的地址(用開發(fā)者工具可以看到) login_url = ' http://ssfw.xmu.edu.cn/cmstar/userPasswordValidate.portal #構(gòu)造登錄請(qǐng)求 req = urllib.request.Request(login_url, headers = headers, data = post_data) #構(gòu)造cookie cookie = http.cookiejar.CookieJar() #由cookie構(gòu)造opener opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie)) #發(fā)送登錄請(qǐng)求,此后這個(gè)opener就攜帶了cookie,以證明自己登錄過 resp = opener.open(req) #登錄后才能訪問的網(wǎng)頁 url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal' #構(gòu)造訪問請(qǐng)求 req = urllib.request.Request(url, headers = headers) resp = opener.open(req) print(resp.read().decode('utf-8'))
requests庫的版本:
import requests import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改變標(biāo)準(zhǔn)輸出的默認(rèn)編碼 #登錄后才能訪問的網(wǎng)頁 url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal' #瀏覽器登錄后得到的cookie,也就是剛才復(fù)制的字符串 cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx' #把cookie字符串處理成字典,以便接下來使用 cookies = {} for line in cookie_str.split(';'): key, value = line.split('=', 1) cookies[key] = value #設(shè)置請(qǐng)求頭 headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'} #在發(fā)送get請(qǐng)求時(shí)帶上請(qǐng)求頭和cookies resp = requests.get(url, headers = headers, cookies = cookies) print(resp.content.decode('utf-8'))
明顯感覺requests庫用著更方便啊~~~
方法三:模擬登錄后用session保持登錄狀態(tài)
原理:
session是會(huì)話的意思。和cookie的相似之處在于,它也可以讓服務(wù)器“認(rèn)得”客戶端。簡(jiǎn)單理解就是,把每一個(gè)客戶端和服務(wù)器的互動(dòng)當(dāng)作一個(gè)“會(huì)話”。既然在同一個(gè)“會(huì)話”里,服務(wù)器自然就能知道這個(gè)客戶端是否登錄過。
具體步驟:
1.找出表單提交到的頁面
2.找出要提交的數(shù)據(jù)
這兩步和方法二的前兩步是一樣的
3.寫代碼
requests庫的版本
import requests import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改變標(biāo)準(zhǔn)輸出的默認(rèn)編碼 #登錄時(shí)需要POST的數(shù)據(jù) data = {'Login.Token1':'學(xué)號(hào)', 'Login.Token2':'密碼', 'goto:http':'//ssfw.xmu.edu.cn/cmstar/loginSuccess.portal', 'gotoOnFail:http':'//ssfw.xmu.edu.cn/cmstar/loginFailure.portal'} #設(shè)置請(qǐng)求頭 headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'} #登錄時(shí)表單提交到的地址(用開發(fā)者工具可以看到) login_url = 'http://ssfw.xmu.edu.cn/cmstar/userPasswordValidate.portal' #構(gòu)造Session session = requests.Session() #在session中發(fā)送登錄請(qǐng)求,此后這個(gè)session里就存儲(chǔ)了cookie #可以用print(session.cookies.get_dict())查看 resp = session.post(login_url, data) #登錄后才能訪問的網(wǎng)頁 url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal' #發(fā)送訪問請(qǐng)求 resp = session.get(url) print(resp.content.decode('utf-8'))
方法四:使用無頭瀏覽器訪問
特點(diǎn):
功能強(qiáng)大,幾乎可以對(duì)付任何網(wǎng)頁,但會(huì)導(dǎo)致代碼效率低
原理:
如果能在程序里調(diào)用一個(gè)瀏覽器來訪問網(wǎng)站,那么像登錄這樣的操作就輕而易舉了。在Python中可以使用Selenium庫來調(diào)用瀏覽器,寫在代碼里的操作(打開網(wǎng)頁、點(diǎn)擊……)會(huì)變成瀏覽器忠實(shí)地執(zhí)行。這個(gè)被控制的瀏覽器可以是Firefox,Chrome等,但最常用的還是PhantomJS這個(gè)無頭(沒有界面)瀏覽器。也就是說,只要把填寫用戶名密碼、點(diǎn)擊“登錄”按鈕、打開另一個(gè)網(wǎng)頁等操作寫到程序中,PhamtomJS就能確確實(shí)實(shí)地讓你登錄上去,并把響應(yīng)返回給你。
具體步驟:
1.安裝selenium庫、PhantomJS瀏覽器
2.在源代碼中找到登錄時(shí)的輸入文本框、按鈕這些元素
因?yàn)橐跓o頭瀏覽器中進(jìn)行操作,所以就要先找到輸入框,才能輸入信息。找到登錄按鈕,才能點(diǎn)擊它。
在瀏覽器中打開填寫用戶名密碼的頁面,將光標(biāo)移動(dòng)到輸入用戶名的文本框,右鍵,選擇“審查元素”,就可以在右邊的網(wǎng)頁源代碼中看到文本框是哪個(gè)元素。同理,可以在源代碼中找到輸入密碼的文本框、登錄按鈕。
3.考慮如何在程序中找到上述元素
Selenium庫提供了find_element(s)_by_xxx的方法來找到網(wǎng)頁中的輸入框、按鈕等元素。其中xxx可以是id、name、tag_name(標(biāo)簽名)、class_name(class),也可以是xpath(xpath表達(dá)式)等等。當(dāng)然還是要具體分析網(wǎng)頁源代碼。
4.寫代碼
import requests import sys import io from selenium import webdriver sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8') #改變標(biāo)準(zhǔn)輸出的默認(rèn)編碼 #建立Phantomjs瀏覽器對(duì)象,括號(hào)里是phantomjs.exe在你的電腦上的路徑 browser = webdriver.PhantomJS('d:/tool/07-net/phantomjs-windows/phantomjs-2.1.1-windows/bin/phantomjs.exe') #登錄頁面 url = r'http://ssfw.xmu.edu.cn/cmstar/index.portal' # 訪問登錄頁面 browser.get(url) # 等待一定時(shí)間,讓js腳本加載完畢 browser.implicitly_wait(3) #輸入用戶名 username = browser.find_element_by_name('user') username.send_keys('學(xué)號(hào)') #輸入密碼 password = browser.find_element_by_name('pwd') password.send_keys('密碼') #選擇“學(xué)生”單選按鈕 student = browser.find_element_by_xpath('//input[@value="student"]') student.click() #點(diǎn)擊“登錄”按鈕 login_button = browser.find_element_by_name('btn') login_button.submit() #網(wǎng)頁截圖 browser.save_screenshot('picture1.png') #打印網(wǎng)頁源代碼 print(browser.page_source.encode('utf-8').decode()) browser.quit()
總結(jié)
以上所述是小編給大家介紹的Python模擬登錄的多種方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Python實(shí)現(xiàn)柵欄密碼的加密解密方法詳解
這篇文章主要介紹了Python實(shí)現(xiàn)柵欄密碼的加密解密方法,所謂柵欄密碼,就是把要加密的明文分成N個(gè)一組,然后把每組的第1個(gè)字連起來,形成一段無規(guī)律的話。不過柵欄密碼本身有一個(gè)潛規(guī)則,就是組成柵欄的字母一般不會(huì)太多2023-01-01你喜歡籃球嗎?Python實(shí)現(xiàn)籃球游戲
今天帶大家學(xué)習(xí)的是關(guān)于Python的相關(guān)知識(shí),文章圍繞著Python如何實(shí)現(xiàn)籃球游戲展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06基于tensorflow __init__、build 和call的使用小結(jié)
這篇文章主要介紹了基于tensorflow __init__、build 和call的使用小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02Python?OpenCV的基本使用及相關(guān)函數(shù)
這篇文章主要介紹了Python-OpenCV的基本使用和相關(guān)函數(shù)介紹,主要包括圖像的讀取保存圖像展示問題,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05