V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
UKeeySDis
V2EX  ›  Python

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

  •  1
     
  •   UKeeySDis · 2017-07-29 18:40:54 +08:00 · 4281 次点击
    这是一个创建于 2676 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我使用的是 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()
    
    13 条回复    2017-07-30 08:20:59 +08:00
    RLib
        1
    RLib  
       2017-07-29 21:04:22 +08:00
    验证码一般靠 session 也就是需要 cookie 来标记
    UKeeySDis
        2
    UKeeySDis  
    OP
       2017-07-29 21:47:29 +08:00
    @RLib 但是不是保存了 cookie 然后获取到对应的验证码,再用之前的 cookie 来登录的吗?验证码应该是对应上的吧
    RLib
        3
    RLib  
       2017-07-29 21:57:48 +08:00
    请求验证码的时候如果不需要标志, 即验证码地址没有附加参数, 直接不带 cookie 去请求就好了, 但是返回的 cookie 要保存
    UKeeySDis
        4
    UKeeySDis  
    OP
       2017-07-29 22:02:29 +08:00
    @RLib cookie 不是保存在`cookiejar`变量中的吗?还有就是我打印 cookie 的时候发现只有一个 key-value,不完整。
    RLib
        5
    RLib  
       2017-07-29 22:08:05 +08:00
    你问"这会不会是登录失败的原因", 我在 1L 回答你了。至于 cookie 不完整的问题,我没用过 cookielib 不是很清楚,不过你可以试试在得到验证码之后再去打印看看
    eoo
        6
    eoo  
       2017-07-29 22:11:58 +08:00 via Android
    虽然我不懂 Python,但是我看不出来你取验证码 cookie 步骤在哪里
    UKeeySDis
        7
    UKeeySDis  
    OP
       2017-07-29 22:13:16 +08:00
    @RLib 好的,谢谢指教。主要是才接触这方面,不是很明白。
    katios
        8
    katios  
       2017-07-29 22:15:48 +08:00
    可以尝试下 requests 库,更强大些。
    UKeeySDis
        9
    UKeeySDis  
    OP
       2017-07-29 22:17:03 +08:00
    @eoo 大致意思就是给 urllib2 换了一个 opener,然后访问的时候会把页面的 cookie 自动保存在变量里面。但是可能因为我才接触 cookielib,用法上可能有点问题。
    scriptB0y
        10
    scriptB0y  
       2017-07-29 22:36:03 +08:00
    eoo
        11
    eoo  
       2017-07-29 22:39:18 +08:00
    @UKeeySDis 我刚给你分析了一下 豆瓣验证码并不产生 cookie 不好意思
    UKeeySDis
        12
    UKeeySDis  
    OP
       2017-07-30 00:21:51 +08:00
    @eoo 嗯嗯,谢谢。但是这样的话,就更应该能登录进去了诶。估计应该是 cookie 的问题,因为没有取完整。但是不知道哪错了。
    ghui
        13
    ghui  
       2017-07-30 08:20:59 +08:00 via Android
    提个醒,可能是 refer 没设导致的,试一下把 refer 设上
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3474 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:28 · PVG 19:28 · LAX 03:28 · JFK 06:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.