正文
特點:
簡單,但需要先在瀏覽器登錄
原理:
簡單地說,cookie保存在發(fā)起請求的客戶端中,服務(wù)器利用cookie來區(qū)分不同的客戶端。因為http是一種無狀態(tài)的連接,當服務(wù)器一下子收到好幾個請求時,是無法判斷出哪些請求是同一個客戶端發(fā)起的。而“訪問登錄后才能看到的頁面”這一行為,恰恰需要客戶端向服務(wù)器證明:“我是剛才登錄過的那個客戶端”。于是就需要cookie來標識客戶端的身份,以存儲它的信息(如登錄狀態(tài))。
當然,這也意味著,只要得到了別的客戶端的cookie,我們就可以假冒成它來和服務(wù)器對話。這給我們的程序帶來了可乘之機。
我們先用瀏覽器登錄,然后使用開發(fā)者工具查看cookie。接著在程序中攜帶該cookie向網(wǎng)站發(fā)送請求,就能讓你的程序假扮成剛才登錄的那個瀏覽器,得到只有登錄后才能看到的頁面。
具體步驟:
1.用瀏覽器登錄,獲取瀏覽器里的cookie字符串
先使用瀏覽器登錄。再打開開發(fā)者工具,轉(zhuǎn)到network選項卡。在左邊的Name一欄找到當前的網(wǎng)址,選擇右邊的Headers選項卡,查看Request Headers,這里包含了該網(wǎng)站頒發(fā)給瀏覽器的cookie。對,就是后面的字符串。把它復(fù)制下來,一會兒代碼里要用到。
注意,最好是在運行你的程序前再登錄。如果太早登錄,或是把瀏覽器關(guān)了,很可能復(fù)制的那個cookie就過期無效了。
2.寫代碼
urllib庫的版本:
import sysimport iofrom urllib import requestsys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改變標準輸出的默認編碼#登錄后才能訪問的網(wǎng)站url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'#瀏覽器登錄后得到的cookie,也就是剛才復(fù)制的字符串cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx'#登錄后才能訪問的網(wǎng)頁url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'req = request.Request(url)#設(shè)置cookiereq.add_header('cookie', raw_cookies)#設(shè)置請求頭req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36')resp = request.urlopen(req)print(resp.read().decode('utf-8'))
requests庫的版本:
import requestsimport sysimport iosys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改變標準輸出的默認編碼#登錄后才能訪問的網(wǎng)頁url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'#瀏覽器登錄后得到的cookie,也就是剛才復(fù)制的字符串cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx'#把cookie字符串處理成字典,以便接下來使用cookies = {}for line in cookie_str.split(';'): key, value = line.split('=', 1) cookies[key] = value
新聞熱點
疑難解答