瞭解http常見狀態碼html
能夠經過輸入錯誤的密碼來找到登錄知乎的post:urlchrome
把Headers拉到底部,能夠看到form data 瀏覽器
_xsrf是須要發送的,須要發送給服務端,不然會返回403錯誤,提示用戶沒權限訪問服務器
獲取xsrf的方法:cookie
# -*- coding: utf-8 -*- import requests,re #py2裏叫cookielib,py3裏叫cookiejar try: import cookielib except: import http.cookiejar as cookielib #拿到瀏覽器設置的用戶代理 User_Agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36" #定義header,注意:header裏的key是固定的 header = { "HOST":"www.zhihu.com", "Referer":"https://www.zhihu.com", "User-Agent":User_Agent } def get_xsrf(): #能夠經過自定義請求頭來傳入User-Agent response = requests.get("http://www.zhihu.com",headers=header) print(response.text) return '' get_xsrf()
接着使用re模塊來獲取到這一行數值session
#若是匹配不到,那多是中間有換行符的緣由,能夠加上re.dotall match_obj = re.match('.*name="_xsrf" value="(.*?)"', response.text, re.DOTALL)
每次查看知乎頁面要用get和post建立新鏈接效率不高,可使用session,後面使用requests的方法就在session上調用 post
session = requests.session()
session = requests.session() #給session的cookies方法從新指定,cookielib類實例出來的LWPCookieJar方法能夠很方便的保存文件 #能夠指定一個文件名,若是文件不存在會自動建立。 session.cookies = cookielib.LWPCookieJar(filename="cookies.txt") try: #加載cookies session.cookies.load(ignore_discard=True) except: print("cookie未能加載") def get_index(): """ 前面用session保存了cookie到本地,這裏我再用session調用get方法時,會自動把cookie帶過去。 :return: """ response = session.get("https://www.zhihu.com", headers=header) with open("index_page.html","wb") as f: f.write(response.text.encode('utf-8')) print("OK")
要判斷是否已登錄,能夠訪問一些須要登錄纔有權限訪問的頁面,好比知乎頁面的登錄後的個人私信頁面,用FireFox能夠先看到返回狀態:302臨時重定向測試
接着301重定向,不過我用chrome檢測,直接從第三行數據開始展現url
因此能夠獲取狀態碼來判斷是否登錄:spa
PS:get方法有個參數allow_redirects是否容許重定向,默認是True,若是訪問的url狀態是301/302,則會去訪問重定向的url
def is_login(): #經過我的的私信頁面判斷是否已登錄 inbox_url = "https://www.zhihu.com/inbox" #allow_redirects參數是否跳轉到重定向的url response = session.get(inbox_url,headers=header,allow_redirects=False) if response.status_code != 200: status_code = False else: status_code = True return status_code
測試獲取xsrf時服務器返回500錯誤,這個是由於使用requests模塊時,沒有設置瀏覽器的用戶代理,不一樣的瀏覽器這個值是不同的,有的服務器會驗證這個是否合法的,這是服務器的一種防護策略。
處理方法:
在知乎登錄界面F12,刷新頁面,找到Header請求頭: