模拟登录1-古诗文网

import requests
from lxml import etree
from PIL import Image
import pytesseract

url = 'https://so.gushiwen.cn/user/login.aspx'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}

def login():
    session = requests.Session()
    resonpse = session.get(url=url,headers=headers)
    tree = etree.HTML(resonpse.text)
    code_img_src = 'https://so.gushiwen.cn/' + tree.xpath('//*[@id="imgCode"]/@src')[0]
    viewstate = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
    img_data = session.get(url = code_img_src, headers = headers).content
    with open('img.jpg','wb') as f:
        f.write(img_data)

    image = Image.open('img.jpg')
    #需要将图片转为RGB格式
    image = image.convert('RGB')
    code = pytesseract.image_to_string(image)
    if(len(code) >= 4):
        code = code[:4]
        print('验证码为:'+ code)
        # 组织fromdata
        data = {
            '__VIEWSTATE' : viewstate,
            '__VIEWSTATEGENERATOR': 'C93BE1AE',
            'email': 'xxxx',
            'pwd': 'xxxx',
            'code': code,
            'denglu': '登录'
        }
        response = session.post(url=url,data=data)
        if(response.status_code == 200):
            print(len(response.text))
            tree = etree.HTML(response.text)
            login_flag = tree.xpath('//*[@id="html"]/body/div[2]/div[1]/span[1]')
            if(login_flag):
                print('登录成功!')
            else:
                print('login failed !')
                return login()
    else:
        print('识别失败,重新登录!')
        return login()


# 由于tesserate识别准确录太低,所以进行了多次识别,登录成功后才返回
if __name__ == '__main__': 
    login()

对于这种简单的字符验证码可以借助tesseract等orc来进行识别,虽然免费,但是识别准确率较低。

登录效果

AZ3S.
验证码为:AZ3S
13011
login failed !
PM28
验证码为:PM28
13853
登录成功!

对于这种简单的字符验证码分为以下几种情况

1.验证码的url不变,验证码也不变

这种情况最简单,直接解析出验证码的url,直接向验证码的url发起请求,保存验证码,然后进行识别

2. 验证码的url不变,验证码一直在变

这种情况在向目标网址发起请求时,实例化一个session,用session来维持会话,并用session来向验证码的url发起请求(本例就是此种形式)

3. 验证码的url后面加上随机参数,且验证码一直变

function reload() {
    var verifyObject = $('#code_img');
    verifyObject.attr('src',verifyObject.attr('src').split('?')[0]+'?'+Math.random());
}
原因:浏览器下使用GET发送请求时,如果两次请求的地址和参数相同,
在不刷新页面的情况下,浏览器会缓存第一次请求的内容,服务端更新后浏览器仍然显示第一次的内容。 


因此,GET请求URL后加随机数或者时间戳,让服务器认为不是相同的请求。进而加载不同的验证码。

此种方式按第一种方式处理
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值