python模擬登陸知乎

一、查看登陸

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

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

查看請求

即用手機(jī)號登陸請求頁面的url為 https://www.zhihu.com/login/phone_num
phone_num 為手機(jī)號
password 為密碼
那么 _xsrf是什么呢? 點(diǎn)擊 element趴荸,按ctrl + F 查找xsrf儒溉,可以在網(wǎng)頁源代碼中搜索到,不難猜出這其實(shí)是一個(gè)動態(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è)動態(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ī)號
    if re.match(r"^1\d{10}$", account):                                   #正則檢驗(yàn)是否為手機(jī)號
        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('你的帳號有問題,請重新輸入')
            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號做點(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è)動態(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ī)號',          #輸入手機(jī)號
    '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會是更方便的方法

四背捌、使用session

import requests
import re

s = requests.Session()
#session可以自動跟蹤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è)動態(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ī)號',              #輸入手機(jī)號
    'password':'密碼',                 #輸入密碼
    '_xsrf':xsrf
    }
r = s.post(url=login_url, data=formdata)
print(r.json()['msg'])
print(r.headers)

以后通過 s 對象的請求 headers 都會自動加上 cookie

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毙籽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子毡庆,更是在濱河造成了極大的恐慌坑赡,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件么抗,死亡現(xiàn)場離奇詭異毅否,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蝇刀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門螟加,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事仰迁〉榛瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵徐许,是天一觀的道長。 經(jīng)常有香客問我卒蘸,道長雌隅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任缸沃,我火速辦了婚禮恰起,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趾牧。我一直安慰自己检盼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布翘单。 她就那樣靜靜地躺著吨枉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哄芜。 梳的紋絲不亂的頭發(fā)上貌亭,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音认臊,去河邊找鬼圃庭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛失晴,可吹牛的內(nèi)容都是我干的剧腻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涂屁,長吁一口氣:“原來是場噩夢啊……” “哼书在!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胯陋,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蕊温,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后遏乔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體义矛,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年盟萨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凉翻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捻激,死狀恐怖制轰,靈堂內(nèi)的尸體忽然破棺而出前计,到底是詐尸還是另有隱情,我是刑警寧澤垃杖,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布男杈,位于F島的核電站,受9級特大地震影響调俘,放射性物質(zhì)發(fā)生泄漏伶棒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一彩库、第九天 我趴在偏房一處隱蔽的房頂上張望肤无。 院中可真熱鬧,春花似錦骇钦、人聲如沸宛渐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窥翩。三九已至,卻和暖如春坦仍,著一層夾襖步出監(jiān)牢的瞬間鳍烁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工繁扎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幔荒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓梳玫,卻偏偏與公主長得像爹梁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子提澎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

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