簡單,但須要先在瀏覽器登陸html
簡單地說,cookie保存在發起請求的客戶端中,服務器利用cookie來區分不一樣的客戶端。由於http是一種無狀態的鏈接,當服務器一會兒收到好幾個請求時,是沒法判斷出哪些請求是同一個客戶端發起的。而「訪問登陸後才能看到的頁面」這一行爲,偏偏須要客戶端向服務器證實:「我是剛纔登陸過的那個客戶端」。因而就須要cookie來標識客戶端的身份,以存儲它的信息(如登陸狀態)。瀏覽器
固然,這也意味着,只要獲得了別的客戶端的cookie,咱們就能夠假冒成它來和服務器對話。這給咱們的程序帶來了可乘之機。服務器
咱們先用瀏覽器登陸,而後使用開發者工具查看cookie。接着在程序中攜帶該cookie向網站發送請求,就能讓你的程序假扮成剛纔登陸的那個瀏覽器,獲得只有登陸後才能看到的頁面。cookie
1.用瀏覽器登陸,獲取瀏覽器裏的cookie字符串session
先使用瀏覽器登陸。再打開開發者工具,轉到network選項卡。在左邊的Name一欄找到當前的網址,選擇右邊的Headers選項卡,查看Request Headers,這裏包含了該網站頒發給瀏覽器的cookie。對,就是後面的字符串。把它複製下來,一下子代碼裏要用到。工具
注意,最好是在運行你的程序前再登陸。若是太早登陸,或是把瀏覽器關了,極可能複製的那個cookie就過時無效了。post
2 貼代碼網站
這邊直接使用requests 庫來進行請求 urllib庫的版本 太繁瑣 代碼寫的也多加密
""" 直接獲取 我的中心的頁面 手動粘貼 輔助 pc 抓包的 cookies 放在 request對象的請求頭裏面 """ import requests #1 數據url url = "http://www.juming.com"
# 這裏是從 瀏覽器複製過來的 cookiestr = 'pgv_pvi=3062528000; _;=; =1579855336,1580038094,,1582021806; IESESSION=alive; pgv_si=s7468463104; ASPSESSIONIDQSTAQSCD=NKOGKGPBDCLNOOGIGFADHCNP; ASPSESSIONIDSQSATRCD=PHDHCNDCBHEFKINKPOFBDHEF; ASPSESSIONIDQQSARSDC=KOIIFBJCHHCLKPMKPNCEJHOI; ASPSESSIONIDSSRARSDD=HOFGFPJCFGBDDOJBOGNOGCPL; Hm_lvt_512ed551fae9428abd7d743009588c7a=1580038094,1581251646,1582021806; ASPSESSIONIDSSQCRSCD=JLDCMFOCJBJHNDIFJEEFBHDL; _qddab=3-qwql4k.k6u9ijsq; ASPSESSIONIDQSSATQDC=BKNFMPADENCCEEFACHFGEALB; ASPSESSIONIDQSSAQSCD=KIDLMNBDAHIGKPNLJIMMGGFG;' agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36' #2 添加請求頭 headers = { "User-Agent":agent, } #把cookie字符串處理成字典,以便接下來使用 cookies = {} for line in cookiestr.split(';'): key, value = line.split('=', 1) cookies[key] = value s=requests.session() rs=s.get(url,headers=headers,cookies =cookies, verify=False) #5 讀取數據 rs.encoding='gbk' # 把數據存到文本里 f=open("01cook.html","w",encoding='gbk') f.write(rs.text) f.close()
咱們先在程序中向網站發出登陸請求,也就是提交包含登陸信息的表單(用戶名、密碼等)。從響應中獲得cookie,從此在訪問其餘頁面時也帶上這個cookie,就能獲得只有登陸後才能看到的頁面。url
1.找出表單提交到的頁面
仍是要利用瀏覽器的開發者工具。轉到network選項卡,並勾選Preserve Log(重要!)。在瀏覽器裏登陸網站。而後在左邊的Name一欄找到表單提交到的頁面。怎麼找呢?看看右側,轉到Headers選項卡。首先,在General那段,Request Method應當是POST。其次最下方應該要有一段叫作Form Data的,裏面能夠看到你剛纔輸入的用戶名和密碼等。也能夠看看左邊的Name,若是含有login這個詞,有可能就是提交表單的頁面(不必定!)。
這裏要強調一點,「表單提交到的頁面」一般並非你填寫用戶名和密碼的頁面!因此要利用工具來找到它。
2.找出要提交的數據
雖然你在瀏覽器裏登錄時只填了用戶名和密碼,但表單裏包含的數據可不僅這些。從Form Data裏就能夠看到須要提交的全部數據。
3.寫代碼
from urllib import parse #轉譯 import requests # 1.1 登陸的網址 login_url = "https://www.jinmi.com/Login/index" #1.2 登陸的參數 login_form_data = { "userKey": "xxx", "password": "xxxx", } agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3650.400 QQBrowser/10.4.3341.400"; #帶着參數 發送post請求 #添加請求頭 headers = { "User-Agent": agent } #1 參數 未來 須要轉譯 轉碼; 2 post 請求的 data 要求是bytes login_str = parse.urlencode(login_form_data).encode('utf-8') ## 構建請求對象 response = requests.post(login_url,login_form_data,headers = headers) ## 得到訪問 cookie cookies = response.cookies setting_url = "https://www.jinmi.com/User/index" # 這邊直接訪問會員中心 rs = requests.get(setting_url, headers=headers, cookies=cookies) #5 讀取數據 rs.encoding='utf-8' # 把數據存到文本里 f=open("03cook.html","w",encoding='utf-8') f.write(rs.text) f.close()
session是會話的意思。和cookie的類似之處在於,它也可讓服務器「認得」客戶端。簡單理解就是,把每個客戶端和服務器的互動看成一個「會話」。既然在同一個「會話」裏,服務器天然就能知道這個客戶端是否登陸過。
1.找出表單提交到的頁面
2.找出要提交的數據
這兩步和方法二的前兩步是同樣的
3.寫代碼
# 1。定義請求參數 login_url = "https://www.jinmi.com/Login/index" headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36", } # 1.2 登陸的參數 data = { "userKey": "wwww", "password": "wwwww", } # 構造Session session = requests.session() # 在session中發送登陸請求,此後這個session裏就存儲了cookie session.post(login_url, data, headers=headers) ### 打印session 這邊能夠直接存貯起來 #print(session.cookies.get_dict()) # 登陸後才能訪問的網頁 setting_url = "https://www.jinmi.com/User/index" rs = session.get(setting_url, headers=headers) # 這樣的方式也能夠訪問 #rs = requests.get(setting_url, headers=headers, cookies=session.cookies) # 把數據存到文本里 f = open("04cook.html", "w", encoding='utf-8') f.write(rs.text) f.close()
還有不少方式 後續 我在更新 這些都是簡單的 直接登陸就行的 有複雜的 各類 js 加密 具體還須要自行實踐