xhtdtk 发表于 2022-5-2 01:35

requests遇到登录需要识别验证码的解决思路

本帖最后由 xhtdtk 于 2022-5-2 14:24 编辑

问题如图:

requests提交的表单数据不仅需要账号密码,还需要识别后的验证码


登录思路:
众所周知,识别图片最简单的第三方库是ddddocr,只需要5行代码就能进行识别
import ddddocr
ocr=ddddocr.DdddOcr()
with open('图片路径','rb') as f:
    code_bytes=f.read()
code=ocr.classification(code_bytes)


因此,我们需要先下载验证码图片
import requests
url_code='图片地址'
rep_code=requests.get(url_code)
image_code=rep_code.content
with open('需要存放的路径+图片名','wb') as f:
    f.write(image_code)


当然你可以加上请求头
import requests
header={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
}
url_code='图片地址'
rep_code=requests.get(url_code,headers=header)
image_code=rep_code.content
with open('需要存放的路径+图片名','wb') as f:
f.write(image_code)


当你满心欢喜的提交登录的表单数据后,可能返回了这样的提示“登录失败,请输入正确的验证码!”
import requests
header={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
}
url_login='登录地址'
data_login={
    'username': '账号',
    'password':'密码',
    'code': ‘ddddocr识别后的验证码’
}
rep_login=requests.post(url_login,headers=header,data=data_login)
print(rep_login.text)

打印的信息为:
{'error': '登录失败,请输入正确的验证码!'}


这可能是因为登录的cookie和获取验证码图片的cookie不相同导致的,所以应该先获取登录页面的cookie并用此cookie下载验证码图片,再用此cookie进行登录
import requests
import ddddocr

#先获取登录页面的cookie并添加到请求头(登录页面和登录地址可能不是同一地址)
header={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
}
url_loginPage='页面地址'
rep_loginPage=requests.get(url_loginPage,headers=header)
cookies_loginPage=rep_loginPage.cookies.get_dict()
cookie=''
for eachCookie in cookies_loginPage.keys():
    cookie=cookie+eachCookie+'='+cookies_loginPage+';'
header['cookie']=cookie[:-1]

#下载验证码图片
url_code='图片地址'
rep_code=requests.get(url_code,headers=header)
image_code=rep_code.content
with open('需要存放的路径+图片名','wb') as f:
    f.write(image_code)

#使用ddddocr识别验证码
ocr=ddddocr.DdddOcr()
with open('图片路径','rb') as f:
    code_bytes=f.read()
code=ocr.classification(code_bytes)

#登录(登录页面和登录地址可能不是同一地址)
url_login='登录地址'
data_login={
    'username': '账号',
    'password':'密码',
    'code': ‘ddddocr识别后的验证码’
}
rep_login=requests.post(url_login,headers=header,data=data_login)
print(rep_login.text)


谢谢!

ReLoading 发表于 2022-5-2 01:54

# 何必多此一举,直接拿到数据流识别图片,无需保存图片文件
code_bytes=rep_code.content
code=ocr.classification(code_bytes)

xhtdtk 发表于 2022-5-2 01:59

ReLoading 发表于 2022-5-2 01:54
# 何必多此一举,直接拿到数据流识别图片,无需保存图片文件
code_bytes=rep_co ...

哈哈,的确是的

nbwww 发表于 2022-5-2 07:33

学习学习   谢谢

封心棒棒糖 发表于 2022-5-2 07:40

requests session 会话保持

slbcmgn 发表于 2022-5-2 08:16

跟着大佬去学习

asd885522 发表于 2022-5-2 08:19

大佬威武          学习了

sitiger 发表于 2022-5-2 08:46

小学一手。session keep connect/ddddocr module

lnshijia 发表于 2022-5-2 09:26

学习了,借鉴下

XiaoZouYu 发表于 2022-5-2 09:37

用session好一点,省去一些繁琐
页: [1] 2
查看完整版本: requests遇到登录需要识别验证码的解决思路