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
no13bus
V2EX  ›  Python

python 模拟登录带有验证码的网站。如何保证验证码和当前爬取的登录页面同步?因为每打开一次页面 验证码就不同。还是上代码吧。大家帮忙看看。

  •  
  •   no13bus ·
    no13bus · 2014-09-22 10:58:39 +08:00 · 13485 次点击
    这是一个创建于 3720 天前的主题,其中的信息可能已经有所发展或是发生改变。
    登录页面是: http://110.249.223.91/hbhb/Default.aspx
    自己代码执行的时候 最后的结果result.content不是登录之后的界面 而是还是登录之前的页面。result.history返回是空 而不是返回登录跳转成功的状态码302.

    第 1 条附言  ·  2014-09-22 18:35:08 +08:00
    已经修改成功了。吧headers里面的cookie项删除即可。代码已经更新。谢谢大家。这次幸好是验证码比较好识别。直接调用py的库就行了。
    27 条回复    2016-07-05 12:49:59 +08:00
    CDuXZMAPgHp1q9ew
        1
    CDuXZMAPgHp1q9ew  
       2014-09-22 11:13:30 +08:00
    试试这样? http://110.249.223.91/hbhb/(wyzkkr55fxit0o45yho2u5nv)/Default.aspx
    我觉得应该保持session
    不是很懂哦!
    janxin
        2
    janxin  
       2014-09-22 11:21:23 +08:00
    cap_str识别出来没有用吧?
    no13bus
        3
    no13bus  
    OP
       2014-09-22 11:28:01 +08:00
    @wujichao 括号里面的是啥?
    whywhywhy
        4
    whywhywhy  
       2014-09-22 11:33:20 +08:00
    正常情况下,只要带着正确的SessionId去请求验证码,以及提交,就不会有问题。(同一个SessionId请求多次验证码。以最后一次为准)
    no13bus
        5
    no13bus  
    OP
       2014-09-22 11:45:52 +08:00
    @janxin



    图片里面是我的抓包记录。图片里面可以看到登录页面打开之后,验证码的网址 http://110.249.223.91/hbhb/CheckCode.aspx 也随后请求了,代码里面我模拟了请求http://110.249.223.91/hbhb/default.aspx 是不是说我后面再次模拟请求验证码的地址的时候,其实是第二次点击了验证码地址?
    1130335361
        6
    1130335361  
       2014-09-22 11:52:27 +08:00
    'txtCheckCode':cap_str
    no13bus
        7
    no13bus  
    OP
       2014-09-22 11:52:56 +08:00
    @whywhywhy 嗯。那你的意思是说我的那个代码没啥问题?可是我执行的时候 最后的result结果并不是登录之后的页面。我再次使用mysession.get('http://110.249.223.91/hbhb/Main.aspx') 返回的是500错误。这说明我并没有登录进去。我使用chrome的一个插件postman测试的时候也是没有登录进去。
    no13bus
        8
    no13bus  
    OP
       2014-09-22 11:55:21 +08:00
    @1130335361 修改了。但是还是登录不进去。
    mhycy
        9
    mhycy  
       2014-09-22 11:56:47 +08:00
    检查是否存在JS添加/修改参数的情况
    一般验证码是结合Cookie/Session做标记的吧?
    mornlight
        10
    mornlight  
       2014-09-22 11:56:50 +08:00
    @no13bus 不会啊,你抓包时有这个请求是因为浏览器会自动加载验证码,程序里你只获取Default.aspx的话默认不会去加载其他东西的。
    你先试试手动请求最新的验证码,然后把验证码填进去再 模拟登录看看,是不是其他部分有问题。
    mhycy
        11
    mhycy  
       2014-09-22 12:07:39 +08:00
    ibtnlogin.y
    ibtnlogin.x

    这个参数每次请求都不一样
    检查一下
    CDuXZMAPgHp1q9ew
        12
    CDuXZMAPgHp1q9ew  
       2014-09-22 12:25:12 +08:00
    @no13bus session
    no13bus
        13
    no13bus  
    OP
       2014-09-22 12:27:16 +08:00
    @mhycy 那个我看了 基本上就是你点击登录那个按钮的时候 鼠标在按钮的上面的相对坐标。
    no13bus
        14
    no13bus  
    OP
       2014-09-22 12:51:39 +08:00
    @mornlight
    抓包结果


    利用postman进行模拟请求



    模拟请求的时候确实得不到登录之后的页面。

    no13bus
        15
    no13bus  
    OP
       2014-09-22 13:01:49 +08:00
    @janxin 刚更新了代码。用了。但是现在还是不能登录。搞不懂为什么
    no13bus
        16
    no13bus  
    OP
       2014-09-22 13:02:23 +08:00
    @wujichao requests.Session就可以保持session的
    janxin
        17
    janxin  
       2014-09-22 13:26:49 +08:00   ❤️ 1
    @no13bus 'Cookie':'ASP.NET_SessionId=zybypfvmlkof0f55rrtprvb3',你cookies写死了
    no13bus
        18
    no13bus  
    OP
       2014-09-22 13:39:41 +08:00
    @janxin 直接把他删除了。就好了。登录上去了。忘了requests.Session是自动保持cookie状态的,header不用另加cookie参数
    pc10201
        19
    pc10201  
       2014-09-22 13:57:13 +08:00
    这种情况用浏览器模拟是最好的办法~
    imn1
        20
    imn1  
       2014-09-22 14:24:36 +08:00
    凡是需要session的进程,需要先get一次url获取cookies,其中至少需要得到session-id的相关项,然后后续的请求/post都应该附带这个cookies发送出去
    no13bus
        21
    no13bus  
    OP
       2014-09-22 15:10:21 +08:00
    @imn1 嗯。多谢。mysession = requests.Session()
    url = 'http://110.249.223.91/hbhb/Default.aspx'
    r = mysession.get(url,timeout=60*4) 这个就是了。requests的session方法就可以保持session的状态。很好用。
    no13bus
        22
    no13bus  
    OP
       2014-09-22 15:11:23 +08:00
    @pc10201 你说的是什么工具?我用的postman这个东西模拟请求的。就是上面一个截图里面提到的postman
    ld0891
        23
    ld0891  
       2014-09-22 15:48:36 +08:00
    调HTTP最好用Firefox,因为Chrome一些字段有限制没法自定义。
    记得Postman要用个代理才能修改限制字段。
    no13bus
        24
    no13bus  
    OP
       2014-09-22 18:33:58 +08:00
    @ld0891 字段限制是什么意思?
    ld0891
        25
    ld0891  
       2014-09-22 20:08:18 +08:00
    @no13bus 就是HTTP报文头有些字段没法修改,比如Host,Referer啥的。
    具体参见http://www.getpostman.com/docs/requests,里面Headers有详解。
    no13bus
        26
    no13bus  
    OP
       2014-09-22 20:23:37 +08:00
    @ld0891 哦。我这里能改。你说的那个我之前就下载过。http://blog.getpostman.com/wp-content/uploads/2014/02/Postman_-_v0_9_5_and_Airmail.png
    这个东西我有的。多谢了。下载了之后 就能修改了
    kanchi240
        27
    kanchi240  
       2016-07-05 12:49:59 +08:00
    @no13bus 我按你的方法试了我的项目,提示验证码失败, cookie 是用的 request 库的 session 来管理的,而且我打印 cookie 里面信息,从获取验证码请求到登陆 post , cookie 值都是一样的,不知道为什么?
    @imn1 @ld0891
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1212 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 23:06 · PVG 07:06 · LAX 15:06 · JFK 18:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.