接口实战:登录古诗文网站(有验证码)

一、先找到网页的接口:使用假的密码登录,找到登录的接口

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.png','wb') as fp:
fp.write(img_data)
# 解析验证码图片
from PIL import Image,ImageEnhance
import pytesseract
import os
#图片处理
im=Image.open('./code.png')
#PIL有九种不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
tesseract_cmd = 'C:\\Users\\l84196880\AppData\\Local\\Tesseract-OCR\\tesseract-uninstall.exe' #此需下载


# 下面为增强部分
im= im.convert("YCbCr")
enh_con = ImageEnhance.Contrast(im)
contrast = 1.5
image_contrasted = enh_con.enhance(contrast)

# 增强亮度
enh_bri = ImageEnhance.Brightness(image_contrasted)
brightness = 1.5
image_brightened = enh_bri.enhance(brightness)
# image_brightened.show()
# 增强对比度
enh_col = ImageEnhance.Color(image_brightened)
color = 1.5
image_colored = enh_col.enhance(color)
# image_colored.show()
# 增强锐度
enh_sha = ImageEnhance.Sharpness(image_colored)
sharpness = 3.0
image_sharped = enh_sha.enhance(sharpness)
# image_sharped.show()

# 灰度处理部分
im2 = image_sharped.convert("L")
# im2.show()
code_text = pytesseract.image_to_string(im2,lang='eng').strip() # 使用image_to_string识别验证码
print(code_text)

code_text = code_text.replace("\n","") #解析了验证码
#验证码图片重命名
src = os.path.join(os.path.abspath("./"), 'code.png')
dst = os.path.join(os.path.abspath("./"), code_text[0:4] + '.png')
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)

以上的代码合起来即可。

posted @ 2022-03-28 11:41  夙兴夜寐  阅读(270)  评论(0编辑  收藏  举报