本文章屬於爬蟲入門到精通系統教程第七講html
直接開始案例吧。python
本次咱們實現如何模擬登錄知乎。git
首先打開知乎登陸頁 知乎 - 與世界分享你的知識、經驗和看法github
注意打開開發者工具後點擊「preserve log」,密碼記得故意輸入錯誤,而後點擊登陸json
咱們很簡單的就找到了 咱們須要的請求瀏覽器
_xsrf:81aa4a69cd410c3454ce515187f2d4c9 password:*** email:admin@wuaics.cn
能夠看到請求一共有三個參數cookie
email 和password就是咱們須要登陸的帳號及密碼session
那麼_xsrf是什麼?咱們在哪能找到?工具
像「_xsrf」這種參數,通常叫作頁面校檢碼,是來檢查你是不是從正常的登陸頁面過來的。post
那咱們複製這個值,在登陸頁面找找看。
//input[@name="_xsrf"]/@value
因此,本次登陸咱們須要獲得的數據已經都獲得了
步驟以下:
打開知乎登陸頁面,獲取_xsrf
把_xsrf和本身的帳號及密碼一塊兒發送(模擬登陸)
import requests url = 'https://www.zhihu.com/#signin' z = requests.get(url) print z.status_code
咱們會看到 http狀態碼爲500...
至於爲何會返回500狀態碼呢?是由於咱們用程序來訪問知乎被發現了...
咱們假裝成瀏覽器,添加一行
能夠看到返回正常了,http狀態碼爲200(這就是headers的做用)
那咱們如今獲取_xsrf
from lxml import etree sel = etree.HTML(z1.content) # 這個xsrf怎麼獲取 咱們上面有講到 _xsrf = sel.xpath('//input[@name="_xsrf"]/@value')[0]
而後模擬登陸
loginurl = 'https://www.zhihu.com/login/email' # 這裏的_xsrf就是咱們剛剛上面獲得的 formdata = { 'email':'admin@wuaics.cn', 'password':'你的密碼', '_xsrf':_xsrf } z2 = requests.post(url=loginurl,data=formdata,headers=headers) print z2.status_code #200 print z2.content # '{"r":0,\n "msg": "\\u767b\\u5f55\\u6210\\u529f"\n}' print z2.json()['msg'] # 登錄成功
能夠看到已經模擬登陸併成功了。
那咱們來打開知乎 - 與世界分享你的知識、經驗和看法來檢查下 是否有登陸成功
# 爲何用這個頁面呢? # 由於這個頁面只有登陸後才能看獲得,若是沒有登陸的話 會自動跳轉讓你登陸的 mylog = 'https://www.zhihu.com/people/pa-chong-21/logs' z3 = requests.get(url=mylog,headers=headers) print z3.status_code #200 print z3.url # u'https://www.zhihu.com/?next=%2Fpeople%2Fpa-chong-21%2Flogs'
發現頁面url是 (https://www.zhihu.com/?next=%...
並非 我前面輸入的 (https://www.zhihu.com/people/...
說明知乎判斷咱們沒有登陸,而後把咱們跳轉到登陸頁面了.
若是感興趣的話,能夠把z3.text 的返回值存爲123.html,而後打開看看,是否是跳轉到登陸頁面了..
那麼爲何會跳到登陸頁面呢?剛剛不是已經登陸成功了麼?
這是由於,咱們這幾個模擬請求,相互間都是獨立的,因此z2登陸成功了,和z3並無什麼關係。
那若是我如今想要z3不用再模擬登陸一次,也能登陸的話,怎麼辦呢?
咱們能夠把z2登陸成功後獲得的cookie給z3,這樣,z3也就能登陸成功了.
用程序實現
再次判斷下是否登陸成功。
z3 = requests.get(url=mylog,headers=headers) print z3.url # u'https://www.zhihu.com/people/pa-chong-21/logs'
咱們能夠看到已經正常訪問了。說明咱們登陸成功了
因此,之後只要你帶着這個cookie,就能夠訪問登陸後的頁面了.(這就是cookie的做用..)
最後附上一個小技巧.
當你須要登陸,或者說你須要在一段會話中操做(也就是咱們上面的操做)
會話對象高級用法 - Requests 2.10.0 文檔
會話對象讓你可以跨請求保持某些參數。它也會在同一個 Session 實例發出的全部請求之間保持 cookie, 期間使用 urllib3 的 connection pooling 功能。因此若是你向同一主機發送多個請求,底層的 TCP 鏈接將會被重用,從而帶來顯著的性能提高。 (參見 HTTP persistent connection).
使用會話後,咱們上面的代碼能夠改爲這樣
能夠看到咱們沒有把cookie傳過去,可是仍是登陸成功了,這是由於session會自動幫你處理這些,會自動幫你管理cookie
咱們能夠打印看下咱們請求的headers
能夠看到headers裏面自動加上了cookie
最後全部的代碼都在kimg1234/pachong
看完本篇文章後,你應該要
能理解User-Agent,cookie的做用
瞭解requests中的session用法
瞭解如何模擬登陸一個網頁
若是你對requests這個庫不太熟悉的話,你能夠在快速上手 - Requests 2.10.0 文檔瀏覽。