python模擬登陸知乎

一、查看登陸

先在瀏覽器中 按住 ctrl + shift + N 打開隱身模式,避免我們已經(jīng)登陸的cookie信息。
然后進(jìn)入知乎登陸頁 https://www.zhihu.com/#signin
按F12,點(diǎn)擊 Network 。嘗試隨便輸個(gè)手機(jī)號(hào)登陸下,可以看到所要登陸頁的請求了

從headers中可以看到請求頁和所需傳送的data

查看請求

即用手機(jī)號(hào)登陸請求頁面的url為 https://www.zhihu.com/login/phone_num
phone_num 為手機(jī)號(hào)
password 為密碼
那么 _xsrf是什么呢? 點(diǎn)擊 element,按ctrl + F 查找xsrf,可以在網(wǎng)頁源代碼中搜索到,不難猜出這其實(shí)是一個(gè)動(dòng)態(tài)驗(yàn)證碼,既然在網(wǎng)頁中,那么我們同樣可以輕松獲得它。
那么可以寫出一個(gè)登陸代碼了

二、登陸代碼

import requests
import re

headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
}
# 知乎有反爬,用個(gè)瀏覽器頭

def get_xsrf():                    #獲取網(wǎng)頁_xsrf驗(yàn)證碼
    #'''_xsrf 是一個(gè)動(dòng)態(tài)變化的參數(shù)'''
    index_url = 'https://www.zhihu.com/#signin'
    #獲取登錄時(shí)要用到的_xsrf
    index_page = requests.get(index_url, headers=headers)
    html = index_page.text
    pattern = r'name="_xsrf" value="(.*?)"'
    #這里的_xsrf返回的是一個(gè)list
    _xsrf = re.findall(pattern, html)
    return _xsrf[0]

def login(account, secret):
    xsrf = get_xsrf()
    #通過輸入的用戶名判斷是否是手機(jī)號(hào)
    if re.match(r"^1\d{10}$", account):                                   #正則檢驗(yàn)是否為手機(jī)號(hào)
        print('login by phone_num\n')
        login_url = 'https://www.zhihu.com/login/phone_num' #手機(jī)登陸請求url
        formdata = {
        'phone_num':account,
        'password':secret,
        '_xsrf':xsrf
    }
    else:
        if "@" in account:
            print('login by Email\n')
        else:
            print('你的帳號(hào)有問題,請重新輸入')
            return 0
        login_url = 'https://www.zhihu.com/login/email' #郵箱登陸請求url
        formdata = {
        'email':account,
        'password':secret,
        '_xsrf':_xsrf
    }
    login_page = requests.post(url=login_url, data=formdata, headers=headers)
    print(login_page.status_code) #檢驗(yàn)網(wǎng)頁響應(yīng)狀態(tài)碼
    print(login_page.content)
    print(login_page.json()['msg']) #檢驗(yàn)登陸是否成功

if __name__ == "__main__":
    username = input('請輸入你的用戶名\n>  ')
    password = input("請輸入你的密碼\n>  ")
    login(username, password)
    

三、使用cookie

接著我們?nèi)绻胗梦覀兊顷懙腎D號(hào)做點(diǎn)什么別的事情時(shí),就得保存下cookie,存進(jìn)headers里就行了。
由于我上面代碼的登陸封裝在函數(shù)里,下面用交互操作演示一下后續(xù)步驟:

>>> import re
>>> import requests
>>> headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
}

>>> def get_xsrf():
    #'''_xsrf 是一個(gè)動(dòng)態(tài)變化的參數(shù)'''
    index_url = 'https://www.zhihu.com/#signin'
    #獲取登錄時(shí)要用到的_xsrf
    index_page = requests.get(index_url, headers=headers)
    html = index_page.text
    pattern = r'name="_xsrf" value="(.*?)"'
    #這里的_xsrf返回的是一個(gè)list
    _xsrf = re.findall(pattern, html)
    return _xsrf[0]

>>> xsrf = get_xsrf()
>>> formdata = {
    'phone_num':'手機(jī)號(hào)',          #輸入手機(jī)號(hào)
    'password':'密碼',             #輸入密碼
    '_xsrf':xsrf
}
>>> url = 'https://www.zhihu.com/login/phone_num'
>>> r = requests.post(url=url, data=formdata)
>>> r.json()['msg']
'登錄成功'
>>> r.headers['Set-Cookie']
'aliyungf_tc=AQAAANuoyleZZwEADpFq2sqbL1fysy78; Path=/; HttpOnly, q_c1=41d9412dc9d6431cb6849a754f41f7a0|1489474734000|1489474734000; Domain=zhihu.com; expires=Fri, 13 Mar 2020 06:58:54 GMT; Path=/, z_c0="QUJCS0pUaFBYZ2dYQUFBQVlRSlZUYTRoNzFpUE5ScjNaNk5oTXJ3Q29ZVW9lT1JlM245Yk93PT0=|1489474734|79a8a1792039b9f1bb14f7562b6cba8068d95721"; Domain=zhihu.com; expires=Thu, 13 Apr 2017 06:58:54 GMT; httponly; Path=/, _xsrf=; Domain=zhihu.com; expires=Mon, 14 Mar 2016 06:58:54 GMT; Path=/, r_cap_id="ZWEwNTVlMjAxYjliNDcyNTgwZjA4MjQ4Y2ZlNGRjMmU=|1489474734|f422359103c09d0b366fa17960ef06bdb214dbe4"; Domain=zhihu.com; expires=Thu, 13 Apr 2017 06:58:54 GMT; Path=/, cap_id="NTBjZWJjNGI1MjkwNDRhNGI5YmU3N2Q4ZWY0YTJiOTc=|1489474734|451abe100589202b9e67ed860b77dfc4d076e051"; Domain=zhihu.com; expires=Thu, 13 Apr 2017 06:58:54 GMT; Path=/, l_cap_id=; Domain=zhihu.com; expires=Mon, 14 Mar 2016 06:58:54 GMT; Path=/'
>>> headers["Cookie"] = r2.headers['Set-Cookie']
>>> headers
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36', 'Cookie': 'aliyungf_tc=AQAAANuoyleZZwEADpFq2sqbL1fysy78; Path=/; HttpOnly, q_c1=41d9412dc9d6431cb6849a754f41f7a0|1489474734000|1489474734000; Domain=zhihu.com; expires=Fri, 13 Mar 2020 06:58:54 GMT; Path=/, z_c0="QUJCS0pUaFBYZ2dYQUFBQVlRSlZUYTRoNzFpUE5ScjNaNk5oTXJ3Q29ZVW9lT1JlM245Yk93PT0=|1489474734|79a8a1792039b9f1bb14f7562b6cba8068d95721"; Domain=zhihu.com; expires=Thu, 13 Apr 2017 06:58:54 GMT; httponly; Path=/, _xsrf=; Domain=zhihu.com; expires=Mon, 14 Mar 2016 06:58:54 GMT; Path=/, r_cap_id="ZWEwNTVlMjAxYjliNDcyNTgwZjA4MjQ4Y2ZlNGRjMmU=|1489474734|f422359103c09d0b366fa17960ef06bdb214dbe4"; Domain=zhihu.com; expires=Thu, 13 Apr 2017 06:58:54 GMT; Path=/, cap_id="NTBjZWJjNGI1MjkwNDRhNGI5YmU3N2Q4ZWY0YTJiOTc=|1489474734|451abe100589202b9e67ed860b77dfc4d076e051"; Domain=zhihu.com; expires=Thu, 13 Apr 2017 06:58:54 GMT; Path=/, l_cap_id=; Domain=zhihu.com; expires=Mon, 14 Mar 2016 06:58:54 GMT; Path=/'}

可以看到登陸后的 cookie 已經(jīng)存入 headers 了
接著傳入這個(gè) headers 就可以保持登陸狀態(tài)。
用requests庫的session會(huì)是更方便的方法

四、使用session

import requests
import re

s = requests.Session()
#session可以自動(dòng)跟蹤cookie

s.headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
}


def get_xsrf():
    #'''_xsrf 是一個(gè)動(dòng)態(tài)變化的參數(shù)'''
    index_url = 'https://www.zhihu.com/#signin'
    #獲取登錄時(shí)要用到的_xsrf
    index_page = s.get(index_url)
    html = index_page.text
    pattern = r'name="_xsrf" value="(.*?)"'
    #這里的_xsrf返回的是一個(gè)list
    _xsrf = re.findall(pattern, html)
    return _xsrf[0]

xsrf = get_xsrf()
login_url = 'https://www.zhihu.com/login/phone_num'  #用手機(jī)登陸
formdata ={
    'phone_num':'手機(jī)號(hào)',              #輸入手機(jī)號(hào)
    'password':'密碼',                 #輸入密碼
    '_xsrf':xsrf
    }
r = s.post(url=login_url, data=formdata)
print(r.json()['msg'])
print(r.headers)

以后通過 s 對(duì)象的請求 headers 都會(huì)自動(dòng)加上 cookie

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 譯者說 Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await...
    TaoBeier閱讀 3,169評(píng)論 0 10
  • 模擬登錄知乎 這幾天在研究模擬登錄, 以知乎 - 與世界分享你的知識(shí)、經(jīng)驗(yàn)和見解為例。實(shí)現(xiàn)過程遇到不少疑問,借鑒了...
    sunhaiyu閱讀 27,355評(píng)論 51 115
  • 折騰了將近兩天,中間數(shù)次想要放棄,還好硬著頭皮搞下去了,在此分享出來,希望有同等需求的各位能少走一些彎路。源碼放在...
    brantou閱讀 531評(píng)論 2 7
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 前言:最近看到公眾號(hào)python之禪里面的歷史文章,模擬登錄知乎,又看到很多人在網(wǎng)上嘗試寫代碼,自己也想試試,最新...
    j4fan閱讀 722評(píng)論 0 2

友情鏈接更多精彩內(nèi)容