Python模擬登入的N種方式(建議收藏)

這段時間在研究如何破解官網驗證碼,而後進行下一步的爬蟲操做,然而一個多星期過去了,編寫的代碼去識別驗證碼的效率仍是很低,嘗試用了tesserorc庫和百度的API接口,都無濟於事,本覺得追不上五月的小尾巴,忽然想到我嘗試了這麼多方法何不爲一篇破坑博客呢。css

如今不少官網都會給出相應的反扒措施,就拿這個登入來講,若是你不登入帳號那麼你就只能獲取微量的信息,甚至獲取不了信息,這對咱們爬蟲來講是很是不友好的,可是咱們總不可能每次都須要手動登入吧,一次二次你能接受,大工程呢?既然學了python,而不爲用腳本代碼幫你作這點事情呢?html

圖爲簡書登入模塊:python

 

v2-6eb8c9cae7d72eb1c7fb06f997bb4a10_720w.jpeg

 

不一樣方式優缺點對比:git

忽然想到一種可能更簡單的方式,因此整理得三,不一樣狀況參考不一樣用法!github

以下:web

 

方式優勢缺點requests的auth參數極簡出現的次數不多requests的session會話維持cookies一致須要構造必定參數selenium自動化最強的模擬登入安裝複雜,庫名太多瀏覽器

 

以上就是三大登入的優缺點,我的推薦使用session去嘗試模擬登入!服務器

方式一: requests的auth參數:cookie

這個是我無心在書上看到的。關於requests的高級用法中,提到了這點,這裏就記錄一下,我的以爲這種方式只可能出如今某網站中,學了也挺好的,省的限制觀看次數,後續我也會更新如何破解vip視頻的思路,有須要的關注我。session

使用相似場所:

 

v2-20f0f8fa31c322a3d8c5c428ee164e05_720w.jpeg

 

用法很簡單,代碼以下:

# parasm: url : 網站 # parasm: username: 用戶名 # parasm: password : 密碼 import requests url = '********' r = requests.get(url, anth=('username', 'password')) print(r.text)

仍是一句話,這種方式極大可能出如今某網站中,其餘狀況基本不可能出現,那麼就得使用下面二種方式了。

方式一: requests高級用法擴展:

相信不少人看書都不看全的,不少細節都在書中呢,下面擴展幾種requests庫的高級用法,很好用的東西。

超時處理: 某網站服務器搭建在國外,加載巨慢。代碼可能拋出timeout : xxxx等狀況,這個時候用它:

r = requests.get(url , timeout=30)

文件上傳: 假如某網站須要上傳文件,那麼就使用它:

files = {'file': open('img.jpg', 'rb')} r = requests.get(url, files=files) print(r.text)

cookies設置: headers這個不少人都使用過吧,基本都是加一個代理頭就完事了,其實也能夠設置其餘的參數,而後使用post請求,就能夠簡單的模擬登入一次了,用法以下:

這些字段通常都須要加上,經常使用的就是代理頭user-agent,這個必須設置:

headers = { 'cookies': '瀏覽器複製', 'Host': '瀏覽器複製', 'Referer' '瀏覽器複製' 'User-Agent': '瀏覽器複製' }

方式二: requests的session會話使用:

會話是什麼: 就比如你和朋友對接電話,你這頭是客戶端,朋友那頭是服務端,大家接通電話,這個通話記錄就表明一個會話,電話中,你能夠經過聲音知道是你朋友,在服務器中,你請求成功一次,客戶端和服務端就維持了一個會話,這個會話能表明你的身份,那麼這段時間在一個瀏覽器中,你進入網站就不須要在輸入帳號密碼了,直到你退出瀏覽器,那麼會話截至,下次登入就須要再次輸入密碼了。

很好的是,Session能很好的幫助咱們維持會話,從而達到cookies的一致性。區別於一半的請求requests,就能夠達到get 和 post 共同的做用;

基本用法以下:

s = requests.Session() r = s.get(url)

那麼咱們使用會話從GitHub的模擬登入嘗試下:

首先咱們須要登入一次,看看須要構建什麼參數: 登入網站

在這個界面就開啓f12 , 否則看不了會話維持:

登入成功以後,以下圖,查看構造參數:

 

v2-fee7020bac318ea61445f01afeb7ebbe_720w.jpeg

 

打開這個From Data 會發現,authenticity_token 這個字段,咱們可能構造不了,這個時候,就得回到 登入界面了, 打開源代碼。F這個字段:

 

v2-a7232d87fc10c60203d2e6101a652cae_720w.jpeg

 

如圖: 只須要爬取這個頁面,得到這個參數 那麼就能夠構造登入的全部參數了, 爬蟲代碼以下:

def token(self): # 得到 authenticity_token 字段 方便下次模擬登入 # login_url : 登入網址 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 就已經搞定了這個問題,根據上圖的Name字段中的session , 咱們能夠找到會話網址: ‘https://github.com/session'

因此咱們如今只須要構造一個函數去請求這個會話網址,就能夠達到咱們的要求了:

代碼以下, 這裏我構造了一個class類,帳號密碼用本身,或者前面傳值過去,圖中的函數是二個爬蟲代碼,能夠根據需求設計:

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)

會話登入到這裏就結束了,主要是構造參數挺麻煩的,須要頁面裏尋找,看到這裏給個關注和贊啦。

方式三: selenium模擬登入:

如何下載selenium相關的插件,我就不作介紹了,篇幅有限

使用selenium 就是須要考慮到表單的切換,和定位元素等,其餘都很簡單,這裏用4399遊戲網頁作一個實例: 網址

點擊登入:

 

v2-2c242207c108a6e325393744a46d2078_720w.jpeg

 

彈出登入表單:

 

v2-284609ddadfb0fe8382f47d7d75c6865_720w.jpeg

 

這裏咱們須要切換表單,否則輸入不了,怎麼找到這個表單的,很簡單,整塊的高亮就行:

代碼以下:

from selenium import webdriver # 導入庫 from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC browser = webdriver.Chrome() # 聲明瀏覽器 browser.implicitly_wait(30) # 隱性等待 在規定的時間內,最長等待S秒 browser.get('http://www.4399.com') # 打開設置的網址 # ID定位 或者其餘的都行 browser.find_element_by_id('login_tologin').click() # 點擊登入界面 browser.switch_to.frame("popup_login_frame") # 進入表單中 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)

我給的例子沒有涉及到驗證碼,若是涉及到驗證碼,要不人工輸入,要麼破解驗證碼,或者交給打碼平臺,最好的方式就是繞過驗證碼,這個我也在思考如何去實現。以上就是這周的知識總結,有幫助的話,就點個贊和關注吧!

到此這篇關於Python模擬登入的N種方式的文章就介紹到這了,更多相關Python 模擬登入內容請搜索之前的文章或繼續瀏覽下面的相關文章但願你們之後多多支持!

相關文章
相關標籤/搜索