有些**需要使用者登入,利用python實現知乎**的模擬登入。用cookies記錄登入資訊, 然後就可以抓取登入之後才能看到的資訊。
開啟工具fiddler,在瀏覽器中訪問 中就能看到捕捉到的所有連線資訊。在左側選擇登入的那一條:
觀察右側,開啟 inspactors 透檢視, 上方是該條連線的請求報文資訊, 下方是響應報文資訊:
簡單的寫乙個 get 程式, 把知乎首頁 get 下來, 然後 decode() 一下解碼, 結果報錯. 仔細一看, 發現知乎網傳給我們的是經過 gzip 壓縮之後的資料. 這樣我們就需要先對資料解壓. python 進行 gzip 解壓很方便, 因為內建有庫可以用. **片段如下:
import gzip
defungzip
(data):
try: # 嘗試解壓
print('正在解壓.....')
data = gzip.decompress(data)
print('解壓完畢!')
except:
print('未經壓縮, 無需解壓')
return data
通過 opener.read() 讀取回來的資料, 經過 ungzip 自動處理後, 再來一遍 decode() 就可以得到解碼後的 str 了。
_xsrf 這個鍵的值在茫茫無際的網際網路沙漠之中指引我們用正確的姿勢來登入知乎, 所以 _xsrf 可謂沙漠之舟. 如果沒有 _xsrf, 我們或許有使用者名稱和密碼也無法登入知乎(我沒試過, 不過我們學校的教務系統確實如此) 如上文所說, 我們在第一遍 get 的時候可以從響應報文中的 html **裡面得到這個沙漠之舟. 如下函式實現了這個功能, 返回的 str 就是 _xsrf 的值.
import re
defgetxsrf
(data):
cer = re.compile('name=\"_xsrf\" value=\"(.*)\"', flags = 0)
strlist = cer.findall(data)
return strlist[0]
集齊 _xsrf, id, password 三**寶, 我們可以發射 post 了. 這個 post 一旦發射過去, 我們就登陸上了伺服器, 伺服器就會發給我們 cookies. 本來處理 cookies 是個麻煩的事情, 不過 python 的 http.cookiejar 庫給了我們很方便的解決方案, 只要在建立 opener 的時候將乙個 httpcookieprocessor 放進去, cookies 的事情就不用我們管了. 下面的**體現了這一點.
getopener 函式接收乙個 head 引數, 這個引數是乙個字典. 函式把字典轉換成元組集合, 放進 opener. 這樣我們建立的這個 opener 就有兩大功能:
自動處理使用 opener 過程中遇到的 cookies;
自動在發出的 get 或者 post 請求中加上自定義的 header;
'''
登入對於需要使用者登入的**資訊的爬取
#解壓縮函式
defungzip
(data):
try:
print("正在解壓縮...")
data = gzip.decompress(data)
print("解壓完畢...")
except:
print("未經壓縮,無需解壓...")
return data
#構造檔案頭
#獲取_xsrf
defgetxsrf
(data):
cer = re.compile('name=\"_xsrf\" value=\"(.*)\"',flags=0)
strlist = cer.findall(data)
return strlist[0]
#根據**報頭資訊設定headers
headers =
url = ""
req=urllib.request.request(url,headers=headers)
res=urllib.request.urlopen(req)
#讀取知乎首頁內容,獲得_xsrf
data = res.read()
data = ungzip(data)
_xsrf = getxsrf(data.decode('utf-8'))
opener = getopener(headers)
#post資料接收和處理的頁面(我們要向這個頁面傳送我們構造的post資料)
url+='login/email'
name='**********'
passwd='*****'
#分析構造post資料
postdict=
#給post資料編碼
postdata=urllib.parse.urlencode(postdict).encode()
#構造請求
res=opener.open(url,postdata)
data = res.read()
#解壓縮
data = ungzip(data)
print(data.decode())
注:執行結果暫時有點問題,待小菜鳥我重新研究過後,將會立即修改。 python 爬蟲 登入知乎
pytho3.4 requests.get request.post requests.session 1 通過瀏覽器f12開發者工具,找到登入時提交的表單以及請求的url 注意請求的url不是瀏覽器網域名稱框的url 因為知乎改了,現在不需要驗證碼了,所以中少了驗證碼的引數,不過 裡是有的 2 設...
python 知乎登入 python3模擬知乎登入
首先分析知乎登入頁,一般模擬登入走的都是手機頁,比較方便 分析登入過程 為了得到驗證碼我特意都輸錯了幾次密碼,知乎的登入不一定有驗證碼,所以我們在 實現的過程中需要做判斷是否需要驗證碼 引入依賴 構建全域性請求頭 因為要模擬手機,所以這裡我們用的是手機的user agent 登入過程 def log...
python 爬蟲 知乎
人生苦短,唯有python 是不是 寫多了自己就熟練了呢?人人網爬蟲模板,具體操作以後有機會再新增吧!coding utf 8 import urllib2 import urllib import cookielib import re def zhihubrower url,user,passw...