簡單的學習http.cookiejar的使用,由於瀏覽器與服務器直接鏈接是非連續的,咱們沒鏈接一次,服務器認證一次返回數據。那問題來了,每次鏈接都須要認證一番!這個時候cookie就是解決這個問題,一用戶屢次登陸同網站頁面認證問題的,每次鏈接都把cookie的小文本傳去就能夠登陸。html
這個過程當中,cookie是存放在用戶瀏覽器裏面的,瀏覽器與服務器端直接傳輸cookie的用戶名,密碼等是很是不安全的,那session就能很好解決。session是存放到服務器端,cookie中存放一個session_key,在經過session_key到服務器端查找存放的用戶、密碼、cookie過時時間等。這樣就要安全很是多了。瀏覽器
在寫爬蟲過程當中,咱們須要屢次鏈接的就用session來鏈接,把cookie存起來,每次鏈接都用他。安全
import re,requests from lxml import etree import http.cookiejar as cookielib user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36' header ={ 'Host':'www.zhihu.com', 'Origin':'https://www.zhihu.com', 'Referer':'https://www.zhihu.com/', 'User-Agent':user_agent } session = requests.Session() session.cookies = cookielib.LWPCookieJar(filename = "zhihu_cookie.txt") #得到xsrf def get_xsrf(): response = session.get('https://www.zhihu.com/#signin',headers = header) xsrf_html = etree.HTML(response.content.decode('utf-8')) xsrf_code = xsrf_html.xpath('//form/input[contains(@name,"_xsrf")]/@value')[0] return xsrf_code #判斷是否登陸 def is_login(): try: session.cookies.load(filename="zhihu_cookie.txt",ignore_discard=True) except: print("cookie 加載錯誤!") inbox_url = "https://www.zhihu.com/inbox" response = session.get(inbox_url,headers = header) if response.status_code != 200: return False else: return True def zhihu_login(account,password): #判斷是手機登陸仍是郵件登陸 if re.match("^1\d{10}",account): print("手機登陸") post_url = 'https://www.zhihu.com/login/phone_num' post_data ={ '_xsrf':get_xsrf(), 'password':password, 'captcha_type':'cn', 'phone_num':account } else: if "@" in account: post_url = 'https://www.zhihu.com/login/email' post_data ={ '_xsrf':get_xsrf(), 'password':password, 'captcha_type':'cn', 'email':account } response = session.post(post_url,data = post_data,headers =header) session.cookies.save() if is_login(): print("cookie 登陸") else: #輸入用戶名和密碼,下面是錯誤的 zhihu_login("15211111111","111111111")
http.cookiejar模塊定義瞭如下類: class http.cookiejar.FileCookieJar(filename,delayload=None,policy=None) FileCookieJar對象實現如下額外方法 把cookie保存到文件 FileCookieJar.save(filename=None,ignore_discard=False,ignore_expires=False)服務器
從文件中讀取cookie FileCookieJar.load(filename=None,ignore_discard=False,ignore_expires=False)cookie
FileCookieJar的子類 class http.cookiejar.MozillaCookieJar(filename,delayload=None,policy=None) class http.cookiejar.LWPCookieJar(filename,de layload=None,policy=None)session
這種FileCookieJar能以the libwww-perl library’s Set-Cookie3 文件形式把cookie存取到磁盤上。 個人博客地址: https://www.nigaea.com/dataanalysis/173.htmlpost