Python模拟登录豆瓣时验证码一直错误怎么办?
我使用的是 python2+urllib2+cookielib 来模拟登录豆瓣。但是很奇怪的是我获取了验证码之后,再尝试登录一直显示验证码错误。后来我打印了一下获取到的 cookie,发现只有一行,也就是并不全。这会不会是登录失败的原因?求各位 v 友帮忙看一下,实在不知道错哪了。。。。谢谢,代码如下。
import urllib
import urllib2
import cookielib
import re
login_url = ‘https://www.douban.com/accounts/login’
#set opener
cookiejar = cookielib.LWPCookieJar()
handler = urllib2.HTTPCookieProcessor(cookiejar)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
text = urllib2.urlopen(login_url).read()
cookie = “”
for item in cookiejar:
cookie += item.name + ‘=’ + item.value + ‘;’
print cookie
#get captcha image
image_pattern = re.compile(’<img.?src="(.?)" alt.*?/>’)
picture_url = re.findall(image_pattern, text)
picture = urllib2.urlopen((str(picture_url[0]))).read()
#save captcha image
captcha_image = open(’./image.jpg’, ‘wb’)
captcha_image.write(picture)
captcha_image.close()
#get captcha id
pattern = re.compile(’<input.?captcha-id".?value=(.*?)/>’, re.S)
captcha_id = re.findall(pattern, text)
#input secret_code
captcha_code = raw_input(‘input the code’)
#set post_data
params = {}
params[‘source’] = ‘None’
params[‘redir’] = ‘https://www.douban.com’
params[‘form_email’] = ‘[email protected]’
params[‘form_password’] = ‘xxxxxx’
params[‘captcha-solution’] = captcha_code
params[‘captcha-id’] = str(captcha_id[0])
params[‘login’] = ‘登录’
postdata = urllib.urlencode(params)
headers = {
“Host”: “accounts.douban.com”,
“User-Agent”: “Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0”,
“Accept”: “text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8”,
“Accept-Language”: “en-US,en;q=0.5”,
“Referer”: “https://www.douban.com/accounts/login”,
“Cookie”: cookie,
“Connection”:“keep-alive”
}
#login
req = urllib2.Request(login_url, postdata, headers)
response = urllib2.urlopen(req)
print response.read()
Python模拟登录豆瓣时验证码一直错误怎么办?
验证码一般靠 session 也就是需要 cookie 来标记
遇到豆瓣登录验证码问题,通常是因为请求头或会话状态不对。豆瓣的验证码是和会话绑定的,你得确保用同一个requests.Session对象来处理整个登录流程,包括获取和提交验证码。
直接上代码,重点看注释:
import requests
from bs4 import BeautifulSoup
def login_douban(username, password):
# 1. 创建会话,保持cookies
session = requests.Session()
# 2. 先访问登录页,获取必要参数和初始cookies
login_url = 'https://accounts.douban.com/passport/login'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://accounts.douban.com/'
}
# 3. 获取登录页面,提取captcha_id
resp = session.get(login_url, headers=headers)
soup = BeautifulSoup(resp.text, 'html.parser')
# 查找captcha_id - 豆瓣可能藏在不同位置
captcha_id = None
captcha_tag = soup.find('input', {'name': 'captcha-id'})
if captcha_tag:
captcha_id = captcha_tag.get('value')
# 4. 如果有验证码,先获取图片
if captcha_id:
captcha_url = f'https://accounts.douban.com/j/mobile/captcha?captcha_id={captcha_id}'
captcha_resp = session.get(captcha_url, headers=headers)
# 这里需要你手动识别验证码
# 保存图片到本地查看
with open('captcha.jpg', 'wb') as f:
f.write(captcha_resp.content)
captcha_solution = input('请输入验证码图片中的文字: ')
else:
captcha_solution = ''
# 5. 构造登录数据
login_data = {
'name': username,
'password': password,
'remember': 'false',
'captcha-solution': captcha_solution,
'captcha-id': captcha_id if captcha_id else ''
}
# 6. 提交登录请求
login_api = 'https://accounts.douban.com/j/mobile/login/basic'
response = session.post(login_api, data=login_data, headers=headers)
# 7. 检查登录结果
result = response.json()
if result.get('status') == 'success':
print('登录成功!')
# 可以继续用这个session访问需要登录的页面
return session
else:
print(f'登录失败: {result.get("message")}')
return None
# 使用示例
if __name__ == '__main__':
# 替换成你的账号密码
session = login_douban('your_username', 'your_password')
关键点:
- 必须用Session:整个流程要用同一个
requests.Session(),这样cookies和验证码ID才能对应上。 - 验证码获取时机:要在访问登录页后立即获取验证码图片,不要先获取图片再开新会话。
- 请求头要全:User-Agent、Referer这些都要带上,模拟真实浏览器。
- 验证码识别:豆瓣的验证码通常需要人工识别,代码里只是保存图片让你手动输入。
如果还不行,可能是豆瓣更新了反爬机制,需要检查页面结构变化。
总结建议:确保会话一致和请求头完整是关键。
但是不是保存了 cookie 然后获取到对应的验证码,再用之前的 cookie 来登录的吗?验证码应该是对应上的吧
请求验证码的时候如果不需要标志, 即验证码地址没有附加参数, 直接不带 cookie 去请求就好了, 但是返回的 cookie 要保存
cookie 不是保存在cookiejar变量中的吗?还有就是我打印 cookie 的时候发现只有一个 key-value,不完整。
你问"这会不会是登录失败的原因", 我在 1L 回答你了。至于 cookie 不完整的问题,我没用过 cookielib 不是很清楚,不过你可以试试在得到验证码之后再去打印看看
虽然我不懂 Python,但是我看不出来你取验证码 cookie 步骤在哪里
好的,谢谢指教。主要是才接触这方面,不是很明白。
可以尝试下 requests 库,更强大些。
大致意思就是给 urllib2 换了一个 opener,然后访问的时候会把页面的 cookie 自动保存在变量里面。但是可能因为我才接触 cookielib,用法上可能有点问题。
用 requests.session
http://docs.python-requests.org/zh_CN/latest/user/advanced.html
我刚给你分析了一下 豆瓣验证码并不产生 cookie 不好意思
嗯嗯,谢谢。但是这样的话,就更应该能登录进去了诶。估计应该是 cookie 的问题,因为没有取完整。但是不知道哪错了。
提个醒,可能是 refer 没设导致的,试一下把 refer 设上

