第十二篇 requests模擬登錄知乎

瞭解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請求頭:

相關文章
相關標籤/搜索