本帖最后由 xhtdtk 于 2022-5-2 14:24 编辑
问题如图:
requests提交的表单数据不仅需要账号密码,还需要识别后的验证码
登录思路:
众所周知,识别图片最简单的第三方库是ddddocr,只需要5行代码就能进行识别
[Python] 纯文本查看 复制代码 import ddddocr
ocr=ddddocr.DdddOcr()
with open('图片路径','rb') as f:
code_bytes=f.read()
code=ocr.classification(code_bytes)
因此,我们需要先下载验证码图片
[Python] 纯文本查看 复制代码 import requests
url_code='图片地址'
rep_code=requests.get(url_code)
image_code=rep_code.content
with open('需要存放的路径+图片名','wb') as f:
f.write(image_code)
当然你可以加上请求头
[Python] 纯文本查看 复制代码 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)
当你满心欢喜的提交登录的表单数据后,可能返回了这样的提示“登录失败,请输入正确的验证码!”
[Python] 纯文本查看 复制代码 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进行登录
[Python] 纯文本查看 复制代码 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[eachCookie]+';'
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)
谢谢! |