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)
谢谢! # 何必多此一举,直接拿到数据流识别图片,无需保存图片文件
code_bytes=rep_code.content
code=ocr.classification(code_bytes) ReLoading 发表于 2022-5-2 01:54
# 何必多此一举,直接拿到数据流识别图片,无需保存图片文件
code_bytes=rep_co ...
哈哈,的确是的 学习学习 谢谢 requests session 会话保持 跟着大佬去学习 大佬威武 学习了 小学一手。session keep connect/ddddocr module 学习了,借鉴下 用session好一点,省去一些繁琐
页:
[1]
2