POST請求登錄網(wǎng)頁

一、登錄知乎
這里用的是手機端登錄的,知乎登錄的鏈接

知乎登錄
post請求

post請求的參數(shù):
_xsrf:據(jù)說是防跨站請求的;
password:密碼
email:登錄郵箱
captcha:驗證碼

在登錄頁定位到這些參數(shù),用post在登錄時傳入這些參數(shù),就可以登錄了;
下面是完整代碼:

import requests, time
from http import cookiejar
from PIL import Image
import re

session = requests.session()
session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')
headers = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36'
}
try:
    # 從本地文件加載cookies
    # ignore_discard的意思是即使cookies將被丟棄也將它保存下來,ignore_expires的意思是如果在該文件中cookies已經(jīng)存在,則覆蓋原文件寫入
    session.cookies.load(ignore_discard=True)
except Exception as e:
    print('exception:', e)
    print('沒有cookie信息')

def get_xsrf():
    index_url = 'https://www.zhihu.com/signin?next=/'
    # _xsrf 是一個動態(tài)變化的必要參數(shù)
    index_page = session.get(index_url, headers=headers)
    html = index_page.text
    pattern = r'name="_xsrf" value="(.*?)"'
    # 這里的_xsrf 返回的是一個list
    _xsrf = re.findall(pattern, html)
    return _xsrf[0]

def get_captcha():
    t = str(int(time.time() * 1000))
    captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"
    response = session.get(captcha_url, headers=headers)
    captcha_name = 'captcha.gif'
    with open(captcha_name, 'wb') as f:
        f.write(response.content)
    im = Image.open(captcha_name)
    im.show()
    return input('請輸入驗證碼: ')

def get_email():
    return input('請輸入郵箱: ')

def get_password():
    return input('請輸入密碼: ')


def login(email, password, _xsrf, captcha):
    data = {
        '_xsrf': _xsrf,
        'password': password,
        'email': email,
        'captcha': captcha
    }
    login_url = 'https://www.zhihu.com/login/email'
    response = session.post(login_url, data=data, headers=headers)
    print('response.json() =', response.json())
    # 保存cookies到本地
    session.cookies.save()

def isLogin():
    # 查看用戶個人信息來判斷是否已經(jīng)登錄
    url = "https://www.zhihu.com/settings/profile"
    # 這里重定向一定要設置為false, 否則就算沒有登錄會被重定向到登錄的地址去, 然后code就返回200了
    response = session.get(url, headers=headers, allow_redirects=False)
    code = response.status_code
    if code == 200:
        return True
    else:
        return False


if __name__ == '__main__':
    if isLogin():
        print('您已經(jīng)登錄')
    else:
        email = get_email()
        password = get_password()
        _xsrf = get_xsrf()
        print('_xsrf =', _xsrf)
        captcha = get_captcha()
        login(email, password, _xsrf, captcha)

運行結果:

登錄成功

這里是用郵箱登錄的,驗證碼需要手動輸入;

二、自動識別驗證碼
python識別驗證碼,需要安裝的模塊

Ubuntu版本:
1、tesseract-ocr安裝
sudo apt-get install tesseract-ocr
2、pytesseract安裝
sudo pip install pytesseract
3、Pillow 安裝
sudo pip install pillow

其他linux版本(如centos):
1、tesseract-ocr安裝 沒找到直接命令安裝,所以需要手動下載安裝包。 https://github.com/tesseract-ocr/tesseract 在上述地址中下載最新的tesseract-ocr的安裝包,并解壓。 通過以下命令安裝:
(1)cd tesseract-3.04.01
(2)./autogen.sh
(3)./configure 注意,如果出現(xiàn)error: leptonica not found,需要下載安裝leptonica http://www.leptonica.org/download.html
(4)make
(5)make install
(6)ldconfig
2、pytesseract安裝 sudo pip install pytesseract
3、Pillow 安裝 sudo pip install pillow

windows版本:
1、tesseract-ocr安裝 下載,并安裝。
注意:如果是64位的用戶,在安裝的時需要改變安裝目錄,如下圖所示

安裝路徑

2、pytesseract安裝 pip install pytesseract
3、Pillow 安裝 pip install pillow

下面驗證一下識別驗證碼:

#coding:utf-8
import pytesseract
from PIL import Image
image = Image.open('code.png')
code = pytesseract.image_to_string(image)
print(code)

可能會遇到的問題:
問題1、FileNotFoundError: [WinError 2] 系統(tǒng)找不到指定的文件。

Paste_Image.png

解決辦法:
1、[推薦]: 將tesseract.exe添加到環(huán)境變量PATH中,
例如: 默認路徑為C:\Program Files (x86)\Tesseract-OCR
注意: 為了使環(huán)境變量生效,需要關閉cmd窗口或是關閉pycharm等ide重新啟動
2、 修改pytesseract.py文件,指定tesseract.exe安裝路徑
打開文件 pytesseract.py,找到如下代碼,將tesseract_cmd的值修改為全路徑,在此使用就不會報錯了。

# CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY
# tesseract_cmd = 'tesseract'
tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract.exe'

3、 在實際運行代碼中指定

pytesseract.pytesseract.tesseract_cmd = 'D:\\Tesseract-OCR\\tesseract.exe'

問題2:
pytesseract.pytesseract.TesseractError: (1, 'Error opening data file \Tesseract-OCR\tessdata/eng.traineddata')

解決方法:
1、[推薦]:將tessdata目錄的上級目錄所在路徑(默認為tesseract-ocr安裝目錄)添加至TESSDATA_PREFIX環(huán)境變量中
例如: C:\Program Files (x86)\Tesseract-OCR
2、 在.py文件配置中指定tessdata-dir

tessdata_dir_config = '--tessdata-dir "D:\\Tesseract-OCR\\tessdata"'
# tessdata_dir_config = '--tessdata-dir "'C:\\Program Files (x86)\\Tesseract-OCR\\tessdata"'
pytesseract.image_to_string(image, config=tessdata_dir_config)

小試牛刀:

#coding:utf-8
import pytesseract
from PIL import Image
image = Image.open('code.png')
code = pytesseract.image_to_string(image)
print(code)

運行結果:

結果
驗證碼

參考文檔

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 我自己的理解 有可能繞過認證碼盡量選擇繞過去,請多嘗試,繞過去爬取效率高不少; 先不考慮那些一天一套認證碼的網(wǎng)站,...
    __混沌閱讀 3,208評論 1 1
  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,835評論 6 427
  • 經(jīng)過對django的初步學習,我們已經(jīng)對后臺的基本流程以及django的運作有了一定的了解,但是這還不足夠,dja...
    coder_ben閱讀 3,957評論 8 34
  • 前言 相信大家利用 Python 寫的爬蟲應該遇到過要輸入驗證碼的尷尬局面,又或者寫了個自動填充表單的小程序,結果...
    迦度藍洛閱讀 16,702評論 2 35
  • 仍要感恩,感謝上帝!(?*) 這一周,實在是早上睜不開眼中午起不來床的日子…做夢與現(xiàn)...
    4eb414fc6a66閱讀 208評論 0 0

友情鏈接更多精彩內(nèi)容