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