1. 程式人生 > 其它 >介面實戰:登入古詩文網站(有驗證碼)

介面實戰:登入古詩文網站(有驗證碼)

一、先找到網頁的介面:使用假的密碼登入,找到登入的介面

2、分析引數:有以下6個引數,經過分析 只需要獲取這兩個引數即可:__VIEWSTATE、code。

__VIEWSTATE引數可以直接獲取擷取:

而code是驗證碼需要去識別:

3、首先獲取   __VIEWSTATE

import requests
from lxml import etree
import re
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36", }
session = requests.Session() # 建立session物件
# 第一次使用session,捕獲請求cookie
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
page_text = session.get(url = url,headers = headers).text
tree = etree.HTML(page_text)
# 獲取'__VIEWSTATE (擷取資料兩種辦法)'和'__VIEWSTATEGENERATOR'
# VIEWSTATE = tree.xpath('//input[@id="__VIEWSTATE"]/@value')[0] #方法一 html調取
VIEWSTATE=re.findall('id="__VIEWSTATE" value="(.+?)"',page_text)[0]  #方法二 擷取
VIEWSTATEGENERATOR = tree.xpath('//input[@id="__VIEWSTATEGENERATOR"]/@value')[0]


4、解析驗證碼

# 解析驗證碼圖片地址
img_src = 'https://so.gushiwen.cn/' + tree.xpath('//*[@id="imgCode"]/@src')[0]
# 將驗證碼圖片儲存到本地
img_data = session.get(img_src,headers = headers).content
with open('./code.jpg','wb') as fp:
    fp.write(img_data)
# 解析驗證碼圖片
from PIL import Image
import pytesseract
import os
#圖片處理
im=Image.open('./code.jpg')
#PIL有九種不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
im=im.convert('RGBA')
im.show
tesseract_cmd = 'C:\Program Files (x86)\Tesseract-OCR\\tesseract.exe' #此需下載
code_text = pytesseract.image_to_string(im)
code_text = code_text.replace("\n","") #解析了驗證碼
#驗證碼圖片重新命名
src = os.path.join(os.path.abspath("./"), 'code.jpg')
dst = os.path.join(os.path.abspath("./"), code_text[0:4] + '.jpg')
os.rename(src, dst)

5、模擬登陸

   # 流程:1 對點選登入按鈕對應的請求進行傳送(post請求)
    #      2 處理請求引數:
    #        使用者名稱 密碼 驗證碼 其他防偽引數

    login_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'

    data = {
        '__VIEWSTATE': VIEWSTATE,
        '__VIEWSTATEGENERATOR': 'C93BE1AE',
        'from': 'http://so.gushiwen.cn/user/collect.aspx',
        'email': '15281619774', # 更換自己的使用者名稱
        'pwd': 'luopan',     # 更換自己的密碼
        'code': code_text,
        'denglu': '登入'
    }
    # 對點選登入按鈕發起請求,獲取登入成功後對應的頁面原始碼資料,儲存為網頁
    page_text_login = session.post(url = login_url,data = data,headers = headers).text
    with open('./gushiwen.html','w',encoding = 'utf-8') as fp:
        fp.write(page_text_login)
    #如果登入成功則刪除圖片
    if page_text_login.find(u"已繫結") !=-1: #登入成功
        os.remove("./"+ code_text[0:4] + '.jpg')
        return "登入成功"
    else :
        return "登入失敗"
    os.remove("./" + " .jpg")
if __name__ == "__main__":
    r = 0
    while xxxx() == "登入失敗" :
        r +=1
    print(r)

以上的程式碼合起來即可。