Python爬蟲之模擬知乎登錄的方法教程

@本文來源於公衆號:csdn2299,喜歡可以關注公衆號 程序員學府


在爬蟲過程中,有些頁面在登錄之前是被禁止抓取的,這個時候就需要模擬登陸了,下面這篇文章主要給大家介紹了利用Python爬蟲模擬知乎登錄的方法教程,文中介紹的非常詳細,需要的朋友可以參考借鑑,下面來一起看看吧。

前言

對於經常寫爬蟲的大家都知道,有些頁面在登錄之前是被禁止抓取的,比如知乎的話題頁面就要求用戶登錄才能訪問,而 “登錄” 離不開 HTTP 中的 Cookie 技術。

登錄原理

Cookie 的原理非常簡單,因爲 HTTP 是一種無狀態的協議,因此爲了在無狀態的 HTTP 協議之上維護會話(session)狀態,讓服務器知道當前是和哪個客戶在打交道,Cookie 技術出現了 ,Cookie 相當於是服務端分配給客戶端的一個標識。在這裏插入圖片描述
瀏覽器第一次發起 HTTP 請求時,沒有攜帶任何 Cookie 信息
服務器把 HTTP 響應,同時還有一個 Cookie 信息,一起返回給瀏覽器
瀏覽器第二次請求就把服務器返回的 Cookie 信息一起發送給服務器
服務器收到HTTP請求,發現請求頭中有Cookie字段, 便知道之前就和這個用戶打過交道了。

實戰應用

用過知乎的都知道,只要提供用戶名和密碼以及驗證碼之後即可登錄。當然,這只是我們眼中看到的現象。而背後隱藏的技術細節就需要藉助瀏覽器來挖掘了。現在我們就用 Chrome 來查看當我們填完表單後,究竟發生了什麼?在這裏插入圖片描述
(如果已經登錄的,先退出)首先進入知乎的登錄頁面 https://www.zhihu.com/#signin ,打開 Chrome 的開發者工具條(按 F12)先嚐試輸入一個錯誤的驗證碼觀察瀏覽器是如何發送請求的。在這裏插入圖片描述
從瀏覽器的請求可以發現幾個關鍵的信息

登錄的 URL 地址是 https://www.zhihu.com/login/email
登錄需要提供的表單數據有4個:用戶名(email)、密碼(password)、驗證碼(captcha)、_xsrf。
獲取驗證碼的URL地址是 https://www.zhihu.com/captcha.gif?r=1490690391695&type=login
_xsrf 是什麼?如果你對CSRF(跨站請求僞造)攻擊非常熟悉的話,那麼你一定知道它的作用,xsrf是一串僞隨機數,它是用於防止跨站請求僞造的。它一般存在網頁的 form 表單標籤中,爲了證實這一點,可以在頁面上搜索 “xsrf”,果然,_xsrf在一個隱藏的 input 標籤中在這裏插入圖片描述
摸清了瀏覽器登錄時所需要的數據是如何獲取之後,那麼現在就可以開始寫代碼用 Python 模擬瀏覽器來登錄了。登錄時所依賴的兩個第三方庫是 requests 和 BeautifulSoup,先安裝

pip install beautifulsoup4==4.5.3
pip install requests==2.13.0

http.cookiejar 模塊可用於自動處理HTTP Cookie,LWPCookieJar 對象就是對 cookies 的封裝,它支持把 cookies 保存到文件以及從文件中加載。

而 session 對象 提供了 Cookie 的持久化,連接池功能,可以通過 session 對象發送請求

首先從cookies.txt 文件中加載 cookie信息,因爲首次運行還沒有cookie,所有會出現 LoadError 異常。

from http import cookiejar
session = requests.session()
session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')
try:
 session.cookies.load(ignore_discard=True)
except LoadError:
 print("load cookies failed")

獲取 xsrf

前面已經找到了 xsrf 所在的標籤,,利用 BeatifulSoup 的 find 方法可以非常便捷的獲取該值

def get_xsrf():
 response = session.get("https://www.zhihu.com", headers=headers)
 soup = BeautifulSoup(response.content, "html.parser")
 xsrf = soup.find('input', attrs={"name": "_xsrf"}).get("value")
 return xsrf

獲取驗證碼

驗證碼是通過 /captcha.gif 接口返回的,這裏我們把驗證碼圖片下載保存到當前目錄,由人工識別,當然你可以用第三方支持庫來自動識別,比如 pytesser

def get_captcha():
 """
 把驗證碼圖片保存到當前目錄,手動識別驗證碼
 :return:
 """
 t = str(int(time.time() * 1000))
 captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"
 r = session.get(captcha_url, headers=headers)
 with open('captcha.jpg', 'wb') as f:
  f.write(r.content)
 captcha = input("驗證碼:")
 return captcha

登錄

一切參數準備就緒之後,就可以請求登錄接口了。

def login(email, password):
 login_url = 'https://www.zhihu.com/login/email'
 data = {
  'email': email,
  'password': password,
  '_xsrf': get_xsrf(),
  "captcha": get_captcha(),
  'remember_me': 'true'}
 response = session.post(login_url, data=data, headers=headers)
 login_code = response.json()
 print(login_code['msg'])
 for i in session.cookies:
  print(i)
 session.cookies.save()

請求成功後,session 會自動把 服務端的返回的cookie 信息填充到 session.cookies 對象中,下次請求時,客戶端就可以自動攜帶這些cookie去訪問那些需要登錄的頁面了。

auto_login.py 示例代碼

# encoding: utf-8
# !/usr/bin/env python
"""
作者:liuzhijun
"""
import time
from http import cookiejar
 
import requests
from bs4 import BeautifulSoup
 
headers = {
  "Host": "www.zhihu.com",
  "Referer": "https://www.zhihu.com/",
  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87'
}
 
# 使用登錄cookie信息
session = requests.session()
session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')
try:
  print(session.cookies)
  session.cookies.load(ignore_discard=True)
 
except:
  print("還沒有cookie信息")
 
 
def get_xsrf():
  response = session.get("https://www.zhihu.com", headers=headers)
  soup = BeautifulSoup(response.content, "html.parser")
  xsrf = soup.find('input', attrs={"name": "_xsrf"}).get("value")
  return xsrf
 
 
def get_captcha():
  """
  把驗證碼圖片保存到當前目錄,手動識別驗證碼
  :return:
  """
  t = str(int(time.time() * 1000))
  captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"
  r = session.get(captcha_url, headers=headers)
  with open('captcha.jpg', 'wb') as f:
    f.write(r.content)
  captcha = input("驗證碼:")
  return captcha
 
 
def login(email, password):
  login_url = 'https://www.zhihu.com/login/email'
  data = {
    'email': email,
    'password': password,
    '_xsrf': get_xsrf(),
    "captcha": get_captcha(),
    'remember_me': 'true'}
  response = session.post(login_url, data=data, headers=headers)
  login_code = response.json()
  print(login_code['msg'])
  for i in session.cookies:
    print(i)
  session.cookies.save()
 
 
if __name__ == '__main__':
  email = "xxxx"
  password = "xxxxx"
  login(email, password)

非常感謝你的閱讀
大學的時候選擇了自學python,工作了發現吃了計算機基礎不好的虧,學歷不行這是

沒辦法的事,只能後天彌補,於是在編碼之外開啓了自己的逆襲之路,不斷的學習python核心知識,深

入的研習計算機基礎知識,整理好了,我放在我們的微信公衆號《程序員學府》,如果你也不甘平庸,之外的東西,比如,如何做一個精緻的程序員,而不是“屌絲”,程序員本身就是高貴的一種存在啊,難道不是嗎?[點擊加入]想做你自己想成爲高尚人,加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章