Python模擬登入的N種方式(建議收藏)
這段時間在研究如何破解官網(wǎng)驗(yàn)證碼,然后進(jìn)行下一步的爬蟲操作,然而一個多星期過去了,編寫的代碼去識別驗(yàn)證碼的效率還是很低,嘗試用了tesserorc庫和百度的API接口,都無濟(jì)于事,本以為追不上五月的小尾巴,突然想到我嘗試了這么多方法何不為一篇破坑博客呢。
現(xiàn)在很多官網(wǎng)都會給出相應(yīng)的反扒措施,就拿這個登入來說,如果你不登入賬號那么你就只能獲取微量的信息,甚至獲取不了信息,這對我們爬蟲來說是非常不友好的,但是我們總不可能每次都需要手動登入吧,一次二次你能接受,大工程呢?既然學(xué)了python,而不為用腳本代碼幫你做這點(diǎn)事情呢?
圖為簡書登入模塊:
不同方式優(yōu)缺點(diǎn)對比:
突然想到一種可能更簡單的方式,所以整理得三,不同情況參考不同用法!
如下:
方式 | 優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|---|
requests的auth參數(shù) | 極簡 | 出現(xiàn)的次數(shù)很少 |
requests的session會話 | 維持cookies一致 | 需要構(gòu)造一定參數(shù) |
selenium自動化 | 最強(qiáng)的模擬登入 | 安裝復(fù)雜,庫名太多 |
以上就是三大登入的優(yōu)缺點(diǎn),個人推薦使用session去嘗試模擬登入!
方式一: requests的auth參數(shù):
這個是我無意在書上看到的。關(guān)于requests的高級用法中,提到了這點(diǎn),這里就記錄一下,個人覺得這種方式只可能出現(xiàn)在某網(wǎng)站
中,學(xué)了也挺好的,省的限制觀看次數(shù),后續(xù)我也會更新如何破解vip視頻的思路,有需要的關(guān)注我
。
使用類似場所:
用法很簡單,代碼如下:
# parasm: url : 網(wǎng)站 # parasm: username: 用戶名 # parasm: password : 密碼 import requests url = '********' r = requests.get(url, anth=('username', 'password')) print(r.text)
還是一句話,這種方式極大可能出現(xiàn)在某網(wǎng)站
中,其他情況基本不可能出現(xiàn),那么就得使用下面二種方式了。
方式一: requests高級用法擴(kuò)展:
相信很多人看書都不看全的,很多細(xì)節(jié)都在書中呢,下面擴(kuò)展幾種requests庫的高級用法,很好用的東西。
超時處理: 某網(wǎng)站
服務(wù)器搭建在國外,加載巨慢。代碼可能拋出timeout : xxxx
等情況,這個時候用它:
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這個很多人都使用過吧,基本都是加一個代理頭就完事了,其實(shí)也可以設(shè)置其他的參數(shù),然后使用post請求,就可以簡單的模擬登入一次了,用法如下:
這些字段一般都需要加上,常用的就是代理頭user-agent,這個必須設(shè)置:
headers = { 'cookies': '瀏覽器復(fù)制', 'Host': '瀏覽器復(fù)制', 'Referer' '瀏覽器復(fù)制' 'User-Agent': '瀏覽器復(fù)制' }
方式二: requests的session會話使用:
會話是什么: 就好比你和朋友對接電話,你這頭是客戶端,朋友那頭是服務(wù)端,你們接通電話,這個通話記錄就代表一個會話,電話中,你可以通過聲音知道是你朋友,在服務(wù)器中,你請求成功一次,客戶端和服務(wù)端就維持了一個會話,這個會話能代表你的身份,那么這段時間在一個瀏覽器中,你進(jìn)入網(wǎng)站就不需要在輸入賬號密碼了,直到你退出瀏覽器,那么會話截至,下次登入就需要再次輸入密碼了。
很好的是,Session
能很好的幫助我們維持會話,從而達(dá)到cookies的一致性。區(qū)別于一半的請求requests,就可以達(dá)到get 和 post 共同的作用;
基本用法如下:
s = requests.Session() r = s.get(url)
那么我們使用會話從GitHub的模擬登入嘗試下:
首先我們需要登入一次,看看需要構(gòu)建什么參數(shù):
登入網(wǎng)站
在這個界面就開啟f12 , 不然看不了會話維持:
登入成功之后,如下圖,查看構(gòu)造參數(shù):
打開這個From Data 會發(fā)現(xiàn),authenticity_token 這個字段,我們可能構(gòu)造不了,這個時候,就得回到 登入界面了, 打開源代碼。F這個字段:
如圖: 只需要爬取這個頁面,獲得這個參數(shù) 那么就可以構(gòu)造登入的所有參數(shù)了, 爬蟲代碼如下:
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
對于cookies的一致性,使用session 就已經(jīng)搞定了這個問題,根據(jù)上圖的Name字段中的session ,
我們可以找到會話網(wǎng)址: ‘https://github.com/session'
所以我們現(xiàn)在只需要構(gòu)造一個函數(shù)去請求這個會話網(wǎng)址,就可以達(dá)到我們的要求了:
代碼如下, 這里我構(gòu)造了一個class類,賬號密碼用自己,或者前面?zhèn)髦颠^去,圖中的函數(shù)是二個爬蟲代碼,可以根據(jù)需求設(shè)計:
def login(self): # 模擬登入 post_date = { 'commit': 'Sign in', 'authenticity_token': self.token(), 'ga_id': '1453216517.1584352055', 'login': self.email, 'password': self.password } # 打印倉庫信息 r = self.session.post(self.post_url, data=post_date, headers=self.headers) if r.status_code == 200: self.get_info_1(r.text) # 打印個人信息和郵箱 r = self.session.get(self.logined_url, headers=self.headers) if r.status_code == 200: self.get_info_2(r.text)
會話登入到這里就結(jié)束了,主要是構(gòu)造參數(shù)挺麻煩的,需要頁面里尋找,看到這里給個關(guān)注和贊啦。
方式三: selenium模擬登入:
如何下載selenium相關(guān)的插件,我就不做介紹了,篇幅有限
使用selenium 就是需要考慮到表單的切換,和定位元素等,其他都很簡單,這里用4399游戲網(wǎng)頁做一個實(shí)例: 網(wǎng)址
點(diǎn)擊登入:
彈出登入表單:
這里我們需要切換表單,不然輸入不了,怎么找到這個表單的,很簡單,整塊的高亮就行:
代碼如下:
from selenium import webdriver # 導(dǎo)入庫 from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC browser = webdriver.Chrome() # 聲明瀏覽器 browser.implicitly_wait(30) # 隱性等待 在規(guī)定的時間內(nèi),最長等待S秒 browser.get('http://www.4399.com') # 打開設(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('賬號') 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)
我給的例子沒有涉及到驗(yàn)證碼,如果涉及到驗(yàn)證碼,要不人工輸入,要么破解驗(yàn)證碼,或者交給打碼平臺,最好的方式就是繞過驗(yàn)證碼,這個我也在思考如何去實(shí)現(xiàn)。以上就是這周的知識總結(jié),有幫助的話,就點(diǎn)個贊和關(guān)注吧!
到此這篇關(guān)于Python模擬登入的N種方式的文章就介紹到這了,更多相關(guān)Python 模擬登入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用PM2+nginx部署python項(xiàng)目的方法示例
這篇文章主要介紹了使用PM2+nginx部署python項(xiàng)目的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11Python+OpenCV繪制多instance的Mask圖像
Mask圖像中,不同值表示不同的實(shí)例(instance)。本文將詳細(xì)為大家講講如何利用OpenCV繪制多instance的Mask圖像,感興趣的可以學(xué)習(xí)一下2022-06-06在Python函數(shù)中輸入任意數(shù)量參數(shù)的實(shí)例
今天小編就為大家分享一篇在Python函數(shù)中輸入任意數(shù)量參數(shù)的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python數(shù)據(jù)結(jié)構(gòu)與算法的雙端隊(duì)列詳解
這篇文章主要為大家詳細(xì)介紹了Python的雙端隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03Python正規(guī)則表達(dá)式學(xué)習(xí)指南
本文介紹了Python對于正則表達(dá)式的支持,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫的完整介紹及使用示例,非常不錯,具有參考借鑒價值,需要的朋友一起學(xué)習(xí)吧2016-08-08基于python的docx模塊處理word和WPS的docx格式文件方式
今天小編就為大家分享一篇基于python的docx模塊處理word和WPS的docx格式文件方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python中的map()、apply()、applymap()的區(qū)別小結(jié)
map()、apply()和applymap()方法是Python中常用的轉(zhuǎn)換方法,,輸出的結(jié)果及類型完全取決于作為給定方法的參數(shù)的函數(shù),本文就來介紹一下這三種方法的區(qū)別,具有一定的參考價值,感興趣的可以了解一下2023-10-10