使用Python Requests登录带验证码网站时验证码无效的问题求助
解决验证码无效问题:关联Session请求验证码
你的问题根源在于验证码请求没有和登录会话绑定。当前代码里,你用requests.get(CapImgURL)单独请求验证码图片,这会创建一个全新的HTTP会话,和之前获取登录页面的Session()实例完全无关。而网站是通过会话Cookie来关联验证码与用户登录请求的,两个不同会话拿到的验证码自然无法匹配,导致登录时提示无效。
修正方案:用同一个Session请求验证码
必须使用初始化的Session对象(也就是代码里的s)来请求验证码图片,这样所有请求都会共享同一个会话Cookie,网站就能正确关联你的验证码和后续登录请求。另外还要注意代码里的变量名拼写错误(CaptchaImgURL和CapImgURL不一致),这也可能导致问题。
修正后的完整代码如下:
import requests from bs4 import BeautifulSoup # 初始化会话、基础参数 url = "http://somesite.com" headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"} # 补充你的请求头 LoginHeaders = headers # 一般登录请求的headers和页面请求一致,可根据实际调整 user = "你的用户名" pwd = "你的密码" login_details = {} with requests.Session() as s: # 1. 用会话请求登录页面,获取会话Cookie r = s.get(url, headers=headers) soup = BeautifulSoup(r.content, features="html.parser") # 2. 用同一个会话请求验证码图片(注意变量名统一) CaptchaImgURL = 'https://somesite.com/image.axd?uid=49a9ca-3a3e-40e7' r = s.get(CaptchaImgURL) # 这里用s.get而不是requests.get with open('ImageVerify.jpg', 'wb') as f: f.write(r.content) # 3. 收集登录信息并提交 login_details['username'] = user login_details['passwd'] = pwd login_details['txtImgVerifyCode'] = input('Enter Code: ') login_details['button'] = 'Log in' # 4. 用同一个会话提交登录请求 r = s.post(url, data=login_details, headers=LoginHeaders) # 验证登录结果示例 if "登录成功" in r.text: print("登录成功!") else: print("登录失败,可能是验证码或账号密码错误")
额外优化建议
如果验证码URL是动态生成的(比如每次请求登录页都会变化uid参数),建议不要硬编码URL,而是从登录页的HTML中解析出来:
# 从soup中提取验证码图片URL(替换成实际的img标签属性) captcha_img = soup.find('img', id='verify-code-img') if captcha_img: CaptchaImgURL = captcha_img['src'] # 处理相对URL,拼接成绝对URL if not CaptchaImgURL.startswith('http'): CaptchaImgURL = requests.compat.urljoin(url, CaptchaImgURL)
这样即使网站调整了验证码URL的参数,你的代码也能自动适配,避免硬编码带来的维护问题。
内容的提问来源于stack exchange,提问作者jonny789
相关产品推荐
相关产品推荐

