Python 模拟登录豆瓣的验证码一直错误

2017-07-29 18:40:54 +08:00
 UKeeySDis

我使用的是 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'] = 'xxxxxx@qq.com'
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()
4130 次点击
所在节点    Python
13 条回复
RLib
2017-07-29 21:04:22 +08:00
验证码一般靠 session 也就是需要 cookie 来标记
UKeeySDis
2017-07-29 21:47:29 +08:00
@RLib 但是不是保存了 cookie 然后获取到对应的验证码,再用之前的 cookie 来登录的吗?验证码应该是对应上的吧
RLib
2017-07-29 21:57:48 +08:00
请求验证码的时候如果不需要标志, 即验证码地址没有附加参数, 直接不带 cookie 去请求就好了, 但是返回的 cookie 要保存
UKeeySDis
2017-07-29 22:02:29 +08:00
@RLib cookie 不是保存在`cookiejar`变量中的吗?还有就是我打印 cookie 的时候发现只有一个 key-value,不完整。
RLib
2017-07-29 22:08:05 +08:00
你问"这会不会是登录失败的原因", 我在 1L 回答你了。至于 cookie 不完整的问题,我没用过 cookielib 不是很清楚,不过你可以试试在得到验证码之后再去打印看看
eoo
2017-07-29 22:11:58 +08:00
虽然我不懂 Python,但是我看不出来你取验证码 cookie 步骤在哪里
UKeeySDis
2017-07-29 22:13:16 +08:00
@RLib 好的,谢谢指教。主要是才接触这方面,不是很明白。
katios
2017-07-29 22:15:48 +08:00
可以尝试下 requests 库,更强大些。
UKeeySDis
2017-07-29 22:17:03 +08:00
@eoo 大致意思就是给 urllib2 换了一个 opener,然后访问的时候会把页面的 cookie 自动保存在变量里面。但是可能因为我才接触 cookielib,用法上可能有点问题。
scriptB0y
2017-07-29 22:36:03 +08:00
eoo
2017-07-29 22:39:18 +08:00
@UKeeySDis 我刚给你分析了一下 豆瓣验证码并不产生 cookie 不好意思
UKeeySDis
2017-07-30 00:21:51 +08:00
@eoo 嗯嗯,谢谢。但是这样的话,就更应该能登录进去了诶。估计应该是 cookie 的问题,因为没有取完整。但是不知道哪错了。
ghui
2017-07-30 08:20:59 +08:00
提个醒,可能是 refer 没设导致的,试一下把 refer 设上

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/378884

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX