Python模擬登陸——以登陸某研究生官網為例
大家經常會用Python進行網路爬蟲,但是有些網站是需要登陸才能看到內容的,那怎麼用Python實現模擬登陸呢?主要有三種方式。
方法一、直接使用已知的cookie訪問,特點:簡單,但是需要事先登陸網站,而且這個cookie具有時效性。(注意!!!)
原理:cookie儲存在發起請求的客戶端中,伺服器利用cookie來區分不同的客戶端,因為http是一種無狀態的連線,當伺服器一下子收到多個請求是無法判斷哪些請求是同一個客戶端發起的,而訪問登陸後才看到的頁面這一行為,恰恰需要向伺服器證明是剛才登陸過的那個客戶端。於是就需要cookie來標識客戶端的身份以儲存登陸資訊,這意味著只要得到別的登陸客戶端的cookie,我們能夠冒充他來和伺服器對話,我們用瀏覽器登陸,使用開發者工具看cookie,接著在程式中攜帶該cookie向網站傳送請求就能讓程式假扮成登陸的那個瀏覽器,得到只有登陸才能看到的狀態。
具體步驟:開啟瀏覽器登陸,再開啟開發者工具,轉到network選項卡。在左邊的name一欄找到當前網址(一般的在DOC可以快速找到)選擇右邊的header卡里面查詢request headers,這裡包含了該網站頒發給瀏覽器的cookie,複製下來
實現該方法的python程式碼有兩種,第一種是直接在headers請求頭加入cookie鍵值對,第二個是將cookie分割,放入自身的cookie中
對於第一種實現程式碼:
# -*- coding: utf-8 -*- """ Created on Fri Jul 27 18:31:43 2018 @author: NJUer """ import requests url='http://pyb.nju.edu.cn/student/studentinfo.action' header={'Cookie': 'JSESSIONID=F8B2FADEB3AE6B6329ABF0D4ACAC6A84; amlbcookie=01; iPlanetDirectoryPro=AQIC5wM2LY4SfczWdqG87YjBJlqOfYGTxZtApasRc6%2FnZLQ%3D%40AAJTSQACMDE%3D%23', 'User-Agent': 'Mozilla/5.0' } infor=requests.get(url,headers=header) print(infor.text) ####執行結果顯示出我們登陸後的網站的原始碼
對於第二種實現程式碼:
# -*- coding: utf-8 -*- """ Created on Fri Jul 27 18:31:43 2018 @author: NJUer """ import requests url='http://pyb.nju.edu.cn/student/studentinfo.action' header={'Cookie': 'JSESSIONID=F8B2FADEB3AE6B6329ABF0D4ACAC6A84; amlbcookie=01; iPlanetDirectoryPro=AQIC5wM2LY4SfczWdqG87YjBJlqOfYGTxZtApasRc6%2FnZLQ%3D%40AAJTSQACMDE%3D%23', 'User-Agent': 'Mozilla/5.0' } infor=requests.get(url,headers=header) print(infor.text) ####執行結果顯示出我們登陸後的網站的原始碼
方法二:模擬登陸後利用session保持登陸狀態
原理:session是會話的意思,簡單理解就是,將每一個客戶端和伺服器的互動當做每個會話,既然在同一會話,既然在同一會話中,伺服器自然知道這個客戶端是否登陸過
具體步驟:1、找出表單提交到頁面:利用瀏覽器開發者工具,轉到network選項,並勾選preserve log(重要),在瀏覽器登陸網站,然後在左邊的name一欄找到表單提交頁面,首先,在general那一段,request method 應當是POST,其次最下方應該有一段叫做FormData 裡面可以找到剛才我們輸入的使用者名稱和密碼等,注意:提交表單的頁面一般不是提交表單的頁面。
2、找出要提交的資料,包括使用者名稱和密碼
程式碼實現:
# -*- coding: utf-8 -*-
"""
Created on Sat Jul 14 20:23:45 2018
@author: FangWei
"""
import tesserocr
import requests
from PIL import Image
url='http://cer.nju.edu.cn/amserver/verify/image.jsp'
session=requests.session()
def verification_url(url) :
data=session.get(url)
file=r'C:\Users\FangWei\Desktop\CheckCode.jpg'
with open(file,'wb') as f :
f.write(data.content)
return file
def identification(file) : ####識別驗證碼,該程式識別效果不好,有條件可以利用打碼平臺識別
image=Image.open(file)
image=image.convert('L')
threshold=127
table=[]
for i in range (256) :
if i< threshold:
table.append(0)
else :
table.append(1)
image=image.point(table,'1')
image.show()
result=tesserocr.image_to_text(image).split('\n')[0]
print(result)
return result
def logon(result):
form={'encoded': 'true' ,
'goto':' aHR0cDovL3B5Yi5uanUuZWR1LmNuL2xvZ2lucmVkaXJlY3QuYWN0aW9u',
'gotoOnFail':' aHR0cDovL3B5Yi5uanUuZWR1LmNuL2xvZ2luLmFjdGlvbg==',
'IDToken0': '',
'IDButton':'Submit',
'IDToken1':'您的賬號(為保護個人隱私,不貼出來)',
'IDToken2':'您的密碼(為保護個人隱私,不貼出來)',
'inputCode':result,
'gx_charset': 'UTF-8'
}
session.post('http://cer.nju.edu.cn/amserver/UI/Login',data=form)
infor=session.get('http://pyb.nju.edu.cn/student/studentinfo.action')
print(infor.text)
photo_file=verification_url(url)
result=identification(photo_file)
logon(result)
###結果與第一種方法相同
第三種:使用selenium登陸,該方法相對來說簡單,只需要定位到賬號,密碼,驗證碼的輸入框,然後在裡面對應填上相關資訊即可。還是那句老話,效率不高,特別一開始利用selenium開啟網頁,但是能夠應對很多網站。詳細程式碼就不放進來了,網上也有很多利用selenium登陸的教程。
有人可能想試試這些程式碼的可能說了,這人是不是傻啊,前面設定cookie已經過期了,我們也登陸不上,利用session維持會話的不給賬號密碼,我們怎麼實踐,首先,我想說的是我們在爬蟲的時候學的是思路,主要是思路,其次為了個人隱私,這是私人究生官網賬號,有些東西不便於放出來,這裡可能有人會問為什麼不用普通的網站,我們都可以申請的賬號和密碼的網站,比如豆瓣,微博等等,因為豆瓣需要驗證碼,而上面的驗證碼識別程式不能夠正確的識別,所以我在本節中沒有使用。最後預告一下,下一節部落格,我將會利用打碼平臺破解驗證碼,然後利用session實現登陸豆瓣。