爬蟲入門到精通-headers的詳細講解(模擬登陸知乎)

本文章屬於爬蟲入門到精通系統教程第七講html

直接開始案例吧。python

本次咱們實現如何模擬登錄知乎。git

1.抓包

首先打開知乎登陸頁 知乎 - 與世界分享你的知識、經驗和看法github

注意打開開發者工具後點擊「preserve log」,密碼記得故意輸入錯誤,而後點擊登陸json

咱們很簡單的就找到了 咱們須要的請求瀏覽器

_xsrf:81aa4a69cd410c3454ce515187f2d4c9
password:***
email:admin@wuaics.cn

能夠看到請求一共有三個參數cookie

email 和password就是咱們須要登陸的帳號及密碼session

那麼_xsrf是什麼?咱們在哪能找到?工具

像「_xsrf」這種參數,通常叫作頁面校檢碼,是來檢查你是不是從正常的登陸頁面過來的。post

那咱們複製這個值,在登陸頁面找找看。
v2-0bce2bff1d142de399904e2e223d14b7_r.png

//input[@name="_xsrf"]/@value

因此,本次登陸咱們須要獲得的數據已經都獲得了

步驟以下:

  1. 打開知乎登陸頁面,獲取_xsrf

  2. 把_xsrf和本身的帳號及密碼一塊兒發送(模擬登陸)

2.模擬登陸

import requests

url = 'https://www.zhihu.com/#signin'
z = requests.get(url)
print z.status_code

咱們會看到 http狀態碼爲500...

至於爲何會返回500狀態碼呢?是由於咱們用程序來訪問知乎被發現了...

咱們假裝成瀏覽器,添加一行

v2-dc73b36720acf3da562b52aedfd3fc3c_r.png

能夠看到返回正常了,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也就能登陸成功了.

用程序實現

v2-9f266324382632afb73e2d0016430924_r.png

再次判斷下是否登陸成功。

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).

使用會話後,咱們上面的代碼能夠改爲這樣

v2-b81c2c1d42a45053ab1e4a15b684002c_r.png

能夠看到咱們沒有把cookie傳過去,可是仍是登陸成功了,這是由於session會自動幫你處理這些,會自動幫你管理cookie

咱們能夠打印看下咱們請求的headers

v2-b354cdd82b22dc697c6a09c32317d630_r.png

能夠看到headers裏面自動加上了cookie

最後全部的代碼都在kimg1234/pachong

最後再次總結一下

看完本篇文章後,你應該要

  • 能理解User-Agent,cookie的做用

  • 瞭解requests中的session用法

  • 瞭解如何模擬登陸一個網頁

若是你對requests這個庫不太熟悉的話,你能夠在快速上手 - Requests 2.10.0 文檔瀏覽。

相關文章
相關標籤/搜索