Python模擬登入的N種方式(建議收藏)
這段時(shí)間在研究如何破解官網(wǎng)驗(yàn)證碼,然后進(jìn)行下一步的爬蟲(chóng)操作,然而一個(gè)多星期過(guò)去了,編寫(xiě)的代碼去識(shí)別驗(yàn)證碼的效率還是很低,嘗試用了tesserorc庫(kù)和百度的API接口,都無(wú)濟(jì)于事,本以為追不上五月的小尾巴,突然想到我嘗試了這么多方法何不為一篇破坑博客呢。
現(xiàn)在很多官網(wǎng)都會(huì)給出相應(yīng)的反扒措施,就拿這個(gè)登入來(lái)說(shuō),如果你不登入賬號(hào)那么你就只能獲取微量的信息,甚至獲取不了信息,這對(duì)我們爬蟲(chóng)來(lái)說(shuō)是非常不友好的,但是我們總不可能每次都需要手動(dòng)登入吧,一次二次你能接受,大工程呢?既然學(xué)了python,而不為用腳本代碼幫你做這點(diǎn)事情呢?
圖為簡(jiǎn)書(shū)登入模塊:

不同方式優(yōu)缺點(diǎn)對(duì)比:
突然想到一種可能更簡(jiǎn)單的方式,所以整理得三,不同情況參考不同用法!
如下:
| 方式 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|
| requests的auth參數(shù) | 極簡(jiǎn) | 出現(xiàn)的次數(shù)很少 |
| requests的session會(huì)話(huà) | 維持cookies一致 | 需要構(gòu)造一定參數(shù) |
| selenium自動(dòng)化 | 最強(qiáng)的模擬登入 | 安裝復(fù)雜,庫(kù)名太多 |
以上就是三大登入的優(yōu)缺點(diǎn),個(gè)人推薦使用session去嘗試模擬登入!
方式一: requests的auth參數(shù):
這個(gè)是我無(wú)意在書(shū)上看到的。關(guān)于requests的高級(jí)用法中,提到了這點(diǎn),這里就記錄一下,個(gè)人覺(jué)得這種方式只可能出現(xiàn)在某網(wǎng)站中,學(xué)了也挺好的,省的限制觀看次數(shù),后續(xù)我也會(huì)更新如何破解vip視頻的思路,有需要的關(guān)注我。
使用類(lèi)似場(chǎng)所:

用法很簡(jiǎn)單,代碼如下:
# parasm: url : 網(wǎng)站
# parasm: username: 用戶(hù)名
# parasm: password : 密碼
import requests
url = '********'
r = requests.get(url, anth=('username', 'password'))
print(r.text)
還是一句話(huà),這種方式極大可能出現(xiàn)在某網(wǎng)站中,其他情況基本不可能出現(xiàn),那么就得使用下面二種方式了。
方式一: requests高級(jí)用法擴(kuò)展:
相信很多人看書(shū)都不看全的,很多細(xì)節(jié)都在書(shū)中呢,下面擴(kuò)展幾種requests庫(kù)的高級(jí)用法,很好用的東西。
超時(shí)處理: 某網(wǎng)站服務(wù)器搭建在國(guó)外,加載巨慢。代碼可能拋出timeout : xxxx等情況,這個(gè)時(shí)候用它:
r = requests.get(url , timeout=30)
文件上傳: 假如某網(wǎng)站需要上傳文件,那么就使用它:
files = {'file': open('img.jpg', 'rb')}
r = requests.get(url, files=files)
print(r.text)
cookies設(shè)置: headers這個(gè)很多人都使用過(guò)吧,基本都是加一個(gè)代理頭就完事了,其實(shí)也可以設(shè)置其他的參數(shù),然后使用post請(qǐng)求,就可以簡(jiǎn)單的模擬登入一次了,用法如下:
這些字段一般都需要加上,常用的就是代理頭user-agent,這個(gè)必須設(shè)置:
headers = {
'cookies': '瀏覽器復(fù)制',
'Host': '瀏覽器復(fù)制',
'Referer' '瀏覽器復(fù)制'
'User-Agent': '瀏覽器復(fù)制'
}
方式二: requests的session會(huì)話(huà)使用:
會(huì)話(huà)是什么: 就好比你和朋友對(duì)接電話(huà),你這頭是客戶(hù)端,朋友那頭是服務(wù)端,你們接通電話(huà),這個(gè)通話(huà)記錄就代表一個(gè)會(huì)話(huà),電話(huà)中,你可以通過(guò)聲音知道是你朋友,在服務(wù)器中,你請(qǐng)求成功一次,客戶(hù)端和服務(wù)端就維持了一個(gè)會(huì)話(huà),這個(gè)會(huì)話(huà)能代表你的身份,那么這段時(shí)間在一個(gè)瀏覽器中,你進(jìn)入網(wǎng)站就不需要在輸入賬號(hào)密碼了,直到你退出瀏覽器,那么會(huì)話(huà)截至,下次登入就需要再次輸入密碼了。
很好的是,Session能很好的幫助我們維持會(huì)話(huà),從而達(dá)到cookies的一致性。區(qū)別于一半的請(qǐng)求requests,就可以達(dá)到get 和 post 共同的作用;
基本用法如下:
s = requests.Session() r = s.get(url)
那么我們使用會(huì)話(huà)從GitHub的模擬登入嘗試下:
首先我們需要登入一次,看看需要構(gòu)建什么參數(shù):
登入網(wǎng)站
在這個(gè)界面就開(kāi)啟f12 , 不然看不了會(huì)話(huà)維持:
登入成功之后,如下圖,查看構(gòu)造參數(shù):

打開(kāi)這個(gè)From Data 會(huì)發(fā)現(xiàn),authenticity_token 這個(gè)字段,我們可能構(gòu)造不了,這個(gè)時(shí)候,就得回到 登入界面了, 打開(kāi)源代碼。F這個(gè)字段:

如圖: 只需要爬取這個(gè)頁(yè)面,獲得這個(gè)參數(shù) 那么就可以構(gòu)造登入的所有參數(shù)了, 爬蟲(chóng)代碼如下:
def token(self):
# 獲得 authenticity_token 字段 方便下次模擬登入
# login_url : 登入網(wǎng)址
r = self.session.get(self.login_url, headers=self.headers)
if r.status_code == 200:
r.encoding = r.apparent_encoding
html = etree.HTML(r.text)
html = etree.tostring(html)
html = etree.fromstring(html)
tk = html.xpath('//*[@id="login"]/form/input[1]/@value')
return tk
對(duì)于cookies的一致性,使用session 就已經(jīng)搞定了這個(gè)問(wèn)題,根據(jù)上圖的Name字段中的session ,
我們可以找到會(huì)話(huà)網(wǎng)址: ‘https://github.com/session'
所以我們現(xiàn)在只需要構(gòu)造一個(gè)函數(shù)去請(qǐng)求這個(gè)會(huì)話(huà)網(wǎng)址,就可以達(dá)到我們的要求了:
代碼如下, 這里我構(gòu)造了一個(gè)class類(lèi),賬號(hào)密碼用自己,或者前面?zhèn)髦颠^(guò)去,圖中的函數(shù)是二個(gè)爬蟲(chóng)代碼,可以根據(jù)需求設(shè)計(jì):
def login(self):
# 模擬登入
post_date = {
'commit': 'Sign in',
'authenticity_token': self.token(),
'ga_id': '1453216517.1584352055',
'login': self.email,
'password': self.password
}
# 打印倉(cāng)庫(kù)信息
r = self.session.post(self.post_url, data=post_date, headers=self.headers)
if r.status_code == 200:
self.get_info_1(r.text)
# 打印個(gè)人信息和郵箱
r = self.session.get(self.logined_url, headers=self.headers)
if r.status_code == 200:
self.get_info_2(r.text)
會(huì)話(huà)登入到這里就結(jié)束了,主要是構(gòu)造參數(shù)挺麻煩的,需要頁(yè)面里尋找,看到這里給個(gè)關(guān)注和贊啦。
方式三: selenium模擬登入:
如何下載selenium相關(guān)的插件,我就不做介紹了,篇幅有限
使用selenium 就是需要考慮到表單的切換,和定位元素等,其他都很簡(jiǎn)單,這里用4399游戲網(wǎng)頁(yè)做一個(gè)實(shí)例: 網(wǎng)址
點(diǎn)擊登入:

彈出登入表單:

這里我們需要切換表單,不然輸入不了,怎么找到這個(gè)表單的,很簡(jiǎn)單,整塊的高亮就行:
代碼如下:
from selenium import webdriver # 導(dǎo)入庫(kù)
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome() # 聲明瀏覽器
browser.implicitly_wait(30) # 隱性等待 在規(guī)定的時(shí)間內(nèi),最長(zhǎng)等待S秒
browser.get('http://www.4399.com') # 打開(kāi)設(shè)置的網(wǎng)址
# ID定位 或者其他的都行
browser.find_element_by_id('login_tologin').click() # 點(diǎn)擊登入界面
browser.switch_to.frame("popup_login_frame") # 進(jìn)入表單中
browser.find_element_by_css_selector('#username').clear()
browser.find_element_by_id('username').send_keys('賬號(hào)')
browser.find_element_by_id('username').send_keys(Keys.TAB)
browser.find_element_by_id('j-password').send_keys('密碼')
browser.find_element_by_id('j-password').send_keys(Keys.ENTER)
我給的例子沒(méi)有涉及到驗(yàn)證碼,如果涉及到驗(yàn)證碼,要不人工輸入,要么破解驗(yàn)證碼,或者交給打碼平臺(tái),最好的方式就是繞過(guò)驗(yàn)證碼,這個(gè)我也在思考如何去實(shí)現(xiàn)。以上就是這周的知識(shí)總結(jié),有幫助的話(huà),就點(diǎn)個(gè)贊和關(guān)注吧!
到此這篇關(guān)于Python模擬登入的N種方式的文章就介紹到這了,更多相關(guān)Python 模擬登入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python cv2在驗(yàn)證碼識(shí)別中應(yīng)用實(shí)例解析
這篇文章主要介紹了python cv2在驗(yàn)證碼識(shí)別中應(yīng)用實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
解決pyinstaller打包exe文件出現(xiàn)命令窗口一閃而過(guò)的問(wèn)題
今天小編就為大家分享一篇解決pyinstaller打包exe文件出現(xiàn)命令窗口一閃而過(guò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
Python實(shí)現(xiàn)監(jiān)控內(nèi)存使用情況和代碼執(zhí)行時(shí)間
我的代碼的哪些部分運(yùn)行時(shí)間最長(zhǎng)、內(nèi)存最多?我怎樣才能找到需要改進(jìn)的地方?在開(kāi)發(fā)過(guò)程中,我很確定我們大多數(shù)人都會(huì)想知道這一點(diǎn)。本文總結(jié)了一些方法來(lái)監(jiān)控?Python?代碼的時(shí)間和內(nèi)存使用情況,希望對(duì)大家有所幫助2023-01-01
Python數(shù)學(xué)建模學(xué)習(xí)模擬退火算法整數(shù)規(guī)劃問(wèn)題示例解析
整數(shù)規(guī)劃問(wèn)題在工業(yè)、經(jīng)濟(jì)、國(guó)防、醫(yī)療等各行各業(yè)應(yīng)用十分廣泛,是指規(guī)劃中的變量(全部或部分)限制為整數(shù),屬于離散優(yōu)化問(wèn)題Discrete Optimization2021-10-10
跟老齊學(xué)Python之正規(guī)地說(shuō)一句話(huà)
雖然在第一部分中,已經(jīng)零星涉及到語(yǔ)句問(wèn)題,并且在不同場(chǎng)合也進(jìn)行了一些應(yīng)用。畢竟不那么系統(tǒng)。本部分,就比較系統(tǒng)地介紹python中的語(yǔ)句。2014-09-09
python+selenium定時(shí)爬取丁香園的新型冠狀病毒數(shù)據(jù)并制作出類(lèi)似的地圖(部署到云服務(wù)器)
這篇文章主要介紹了python+selenium定時(shí)爬取丁香園的新冠病毒每天的數(shù)據(jù)并制作出類(lèi)似的地圖(部署到云服務(wù)器),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
Python2和Python3之間的str處理方式導(dǎo)致亂碼的講解
今天小編就為大家分享一篇關(guān)于Python2和Python3之間的str處理方式導(dǎo)致亂碼的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
20個(gè)Python中正則表達(dá)式的應(yīng)用與技巧小結(jié)
正則表達(dá)式是一種用來(lái)匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,本文我們將探討?Python?中?re?模塊的應(yīng)用和一些技巧,希望可以幫助您更好地理解和利用正則表達(dá)式2024-04-04
Python生成個(gè)性簽名圖片獲取GUI過(guò)程解析
這篇文章主要介紹了Python生成個(gè)性簽名圖片獲取GUI過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

