今天我實現了模擬登錄知乎,代碼的注釋講解的很清楚,大家直接看代碼就能看懂,不懂的歡迎提問,整理如下,希望對大家有幫助,有幫助的請點個贊。代碼地址
Paste_Image.png
# -*- coding: utf-8 -*-
""" 知乎登錄分為兩種登錄
一是手機登錄 API : https://www.zhihu.com/login/phone_num
二是郵箱登錄 API : https://www.zhihu.com/login/email
第一步、打開首頁獲取_xref值,驗證圖片
第二步、輸入賬號密碼
第三步、看是否需要驗證、要則下載驗證碼圖片,手動輸入
第四步、判斷是否登錄成功、登錄成功后獲取頁面值。
requests 與 http.cookiejar 相結合使用
session = requests.session
session.cookies = http.cookiejar.LWPCookies(filename='abc')
...
請求網址后
...
session.cookies.save() 保存cookies
加載cookies
try:
session.cookies.load(ignore_discard=True)
except:
print('沒有cookies')
"""
import requests
from bs4 import BeautifulSoup as BS
import time
from subprocess import Popen # 打開圖片
import http.cookiejar
import re
# 模擬瀏覽器訪問
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36'
}
home_url = "https://www.zhihu.com"
base_login = "https://www.zhihu.com/login/" # 一定不能寫成http,否則無法登錄
session = requests.session()
session.cookies = http.cookiejar.LWPCookieJar(filename='ZhiHuCookies')
try:
# 加載Cookies文件
session.cookies.load(ignore_discard=True)
except:
print("cookie未保存或cookie已過期")
# 第一步 獲取_xsrf
_xsrf = BS(session.get(home_url, headers=headers).text, "lxml").find("input", {"name": "_xsrf"})["value"]
# 第二步 根據賬號判斷登錄方式
account = input("請輸入您的賬號:")
password = input("請輸入您的密碼:")
# 第三步 獲取驗證碼圖片
gifUrl = "http://www.zhihu.com/captcha.gif?r=" + str(int(time.time() * 1000)) + "&type=login"
gif = session.get(gifUrl, headers=headers)
# 保存圖片
with open('code.gif', 'wb') as f:
f.write(gif.content)
# 打開圖片
Popen('code.gif', shell=True)
# 輸入驗證碼
captcha = input('captcha: ')
data = {
"captcha": captcha,
"password": password,
"_xsrf": _xsrf,
}
# 第四步 判斷account類型是手機號還是郵箱
if re.match("^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$", account):
# 郵箱
data["email"] = account
base_login = base_login + "email"
else:
# 手機號
data["phone_num"] = account
base_login = base_login + "phone_num"
print(data)
# 第五步 登錄
response = session.post(base_login, data=data, headers=headers)
print(response.content.decode("utf-8"))
# 第六步 保存cookie
session.cookies.save()
# 獲取首頁信息
resp = session.get(home_url, headers=headers, allow_redirects=False)
print(resp.content.decode("utf-8"))
運行結果如下:r=0代表登錄成功
Paste_Image.png