【核心要素】代码总结:模拟登录最核心的一点就是这里必须使用同一个Session 会话的请求来登录【获取验证码和登录必须是同一个Sesson实例】,不然模拟登录会无法成功!
第一步:创建一个Session实例对象【s = requests.Session()】
第二步:请求验证码图片识别验证码【使用s这个Session实例-s.get请求图片验证码识别】
第三部:继续使用s这个Session实例请求模拟登录,这样肯定就没问题了
总结:所有的模拟登录图片验证码验证的都必须使用同一个Session实例请求!
import requests
import re
import random
from io import BytesIO
from PIL import Image
url = 'http://zhanzhang.sogou.com/index.php'
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
}
s = requests.Session()
response = s.get(url, headers=headers)
verify = re.findall("js_vcode_img\"\ssrc=\"(.*?)\"", response.text)[0]
# verify_url = 'http://zhanzhang.sogou.com' + verify + "?tag=" + str(random.random())
verify_url = "http://zhanzhang.sogou.com/index.php/uc/vcode"
print(verify_url)
verify_response = s.get(verify_url, headers=headers)
im = Image.open(BytesIO(verify_response.content))
im.show()
result = input("请输入验证码:\n")
data = {
"loginForm[username]": "账户",
"loginForm[password]": "密码",
"loginForm[vcode]": result
}
login_url = 'http://zhanzhang.sogou.com/index.php/login'
r = s.post(login_url, json=headers, data=data)
print(r.text)