python:模擬瀏覽器輸入驗證碼,登陸網頁(抓包分析和網頁爬取,以及http協議的一點理解)
來自專欄 數據結構與演算法:生物信息學必備知識
平時爬取網頁,以及模擬12306搶票中,最重要的一點就是模擬瀏覽器輸入驗證碼,登陸網頁。
只有打開驗證碼這一關,才能進行下一步操作。 下面,我們先來講一講簡單地模擬登陸,這次模擬登錄的網站是英語課本隨行課堂《視聽說教程3》上的聽力訓練網址:外教社課程中心
工具如下:
IDE:pycharm python3.6
OS:window10
抓包分析
首先我們看一下 url get到的網頁:
看見上面的登錄按鈕了嗎? 這也就是登錄的窗口,我們點擊一下:
F12加F5刷新可以得到,我們點擊之後,訪問的真正的url,請求方式是get請求。
當我隨便輸入一個賬號和密碼,以及驗證碼時,瀏覽器會提交給伺服器一個post請求,而我們輸入的數據存儲在表單之中,利用F12可以容易分析到:
我進行一個post請求,訪問的真正的url是我畫紅線的部分,而我提交的數據呢? 我們繼續往下面找:
看我所標誌的區域,分別是我剛剛輸入的賬號,密碼,以及一些驗證信息。 這裡的賬號和密碼均為明文,並未加密,所以很容易分析:我剛剛輸入的賬號和密碼分別是:sghen/123456(這裡的抓包分析之後,如果大家仔細想想,通過wifi是不是就可以很容易獲取別人的賬號和密碼了呢。)
bs4爬取網頁分析
而其中的「lt」是一個隨機的網頁驗證碼,後面的內容,通過之前的爬蟲學習,我們應該很容易的得到:
如圖,我所指的標籤中,「value」屬性所對應的值便是這個網頁驗證碼,所以,代碼如下:
url="https://sso.sflep.com/cas/login?service=https%3A%2F%2Fsso.sflep.com%2F"header={"Referer":"https://sso.sflep.com/cas/login?service=https%3A%2F%2Fsso.sflep.com%2F", "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36" }my_session=requests.session()res1=my_session.get(url,headers=header)print(res1.status_code)soup=BeautifulSoup(res1.text,lxml)Tag=soup.find(input,attrs={"name":"lt"})["value"]#到這裡,我們就能得到,需要從網頁中獲得的信息了,下面就要模擬登錄操作
http協議的一點理解:
在這裡說一下session模塊。session()的作用是建立一個會話,它能夠自動的保存cookie值,在這裡補充一點http協議的知識:http(或者https)請求網頁是無狀態的,也就是不會建立聯繫。比如,我用電腦訪問了這個網頁,然後第二次又同樣的進行訪問,伺服器那邊是不知道兩次訪問的人是不是都是我這台客戶機的。 如果要建立聯繫,那麼就需要cookie。 當客戶機發出一個http請求的時候,伺服器如果接收到了請求,那麼它會返回一個set-cookie給客戶機。同時,客戶機將會把這個數據保存到自己請求頭中,對應的鍵叫做:」cookie「。兒之和鍵對應的值就是cookie值,如果你進行下一次訪問的時候,在請求頭裡面加上了這個cooike值,那麼伺服器一段將能夠判斷出你是上一次訪問的客戶機,所以就能夠進行下一步的訪問。
說到這裡,我們就可以編寫代碼了:
datas={"username":"你的賬號", "password":"你的密碼", "lt":Tag, "_eventId":"submit", "submit":"登錄"}#構建一個data字典,也就是待會兒將要發送的post請求中發送的數據res2=my_session.post(url,data=datas,headers=header)res2.encoding=res2.apparent_encodingtext=res2.contentprint(res2.headers)print(res2.status_code)with open(r"C:Users13016Desktop1.html",w,encoding=utf-8) as f: f.write(res2.text)#將獲取的信息,保存為html文件,查看是否登錄成功
值得注意的是:res2.encoding=res2.apparent_encoding這句十分的重要,因為大量網頁為了使用戶訪問時的速度更快,一般都會對網頁進行壓縮傳輸,通常使用的壓縮方式是:gzip
如果不對response進行轉碼的話,輸出的內容很可能是亂碼,所以這一句是很有必要的。
完整代碼:
import requestsfrom bs4 import BeautifulSoupurl="https://sso.sflep.com/cas/login?service=https%3A%2F%2Fsso.sflep.com%2F"header={"Referer":"https://sso.sflep.com/cas/login?service=https%3A%2F%2Fsso.sflep.com%2F", "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36" }my_session=requests.session()res1=my_session.get(url,headers=header)print(res1.status_code)soup=BeautifulSoup(res1.text,lxml)Tag=soup.find(input,attrs={"name":"lt"})["value"]datas={"username":"17607100663", "password":"zz1301646236", "lt":Tag, "_eventId":"submit", "submit":"登錄"}res2=my_session.post(url,data=datas,headers=header)res2.encoding=res2.apparent_encodingtext=res2.contentprint(res2.headers)print(res2.status_code)with open(r"C:Users13016Desktop1.html",w,encoding=utf-8) as f: f.write(res2.text)
我們來查看一下剛剛保存的html文件,是否模擬登錄成功:
顯然,已經登錄成功! 下面就可以進一步抓包,完成更多操作了,不用多說,大家應該懂的,嘿嘿!
更多優質內容,請關注公眾號:生物信息與python
推薦閱讀:
※【Python3網路爬蟲開發實戰】5.1.1-TXT文本存儲
※jupyter notebook常見問題解決辦法
※Python有哪些常見的、好用的爬蟲框架?
※Python-科學計算NumPy模塊(1)
※flowpy添加switch語句支持