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

python登录V2EX失败

  •  
  •   xuelang ·
    selfboot · 2013-05-12 10:36:53 +08:00 · 7282 次点击
    这是一个创建于 4214 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前看了“谁写个自动领取奖励脚本?”(http://www.v2ex.com/t/68136),自己刚接触python,所以想试着写一个练练手。

    用到python的requests库,关于网站登录部分,分析了一下登录提交的表单,有5个字段,类似下面:
    next=%2F&u=***&p=***&once=21381&next=%2F

    首先分析登录界面取出next,once,next值,分别为input_next_value_pre、input_once_value、input_next_value_post, 然后用requests请求页面,主要代码如下:
    signin_url = "http://www.v2ex.com/signin"
    user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) \
    AppleWebKit/537.31 (KHTML, like Gecko) \
    Chrome/26.0.1410.65 Safari/537.31"
    headers = {"User-Agent": user_agent}

    logininfo = {"next": input_next_value_pre,
    "u": usr_name,
    "p": passwd,
    "once": input_once_value,
    "next": input_next_value_post
    }
    signin_req = requests.post(signin_url,
    data=logininfo,
    headers=headers,
    )

    结果登录老是失败,怀疑是v2ex的登录表单中有两个next字段,并且值一样,这样构建post字典第二个next就被忽略,不知道该怎么解决呢?
    第 1 条附言  ·  2013-05-13 08:50:51 +08:00
    37 条回复    1970-01-01 08:00:00 +08:00
    whtsky
        1
    whtsky  
       2013-05-12 10:45:13 +08:00 via iPhone
    你很缺钱么…
    DH
        2
    DH  
       2013-05-12 11:06:32 +08:00   ❤️ 1
    我估计是cookie的问题,你在post之前,先GET一次,把cookie存下来,再post。
    swulling
        3
    swulling  
       2013-05-12 11:15:23 +08:00   ❤️ 1
    1. 第一次请求的时候有PB3_SESSION的cookie,不用存,用requests的话直接用Session就很方便
    2. next不是问题,你提交两个就好了
    3. 注意POST的Referer要带上

    实测可以登陆,没问题
    swulling
        4
    swulling  
       2013-05-12 11:16:01 +08:00   ❤️ 1
    4. next不用分析页面,直接'/'就好
    xuelang
        5
    xuelang  
    OP
       2013-05-12 11:38:01 +08:00
    @whtsky 不是,只是对网站自动验证感兴趣,又看到那个问题,就拿v2ex做了下实验了
    xuelang
        6
    xuelang  
    OP
       2013-05-12 11:38:59 +08:00   ❤️ 1
    @DH
    @swulling
    谢谢,已解决。
    DH
        7
    DH  
       2013-05-12 11:42:32 +08:00   ❤️ 1
    网站防爬虫的办法是五花八门,每个站都不一样。
    xuelang
        8
    xuelang  
    OP
       2013-05-12 11:44:23 +08:00
    @DH 那要爬网站时,认证时有没有什么一般的思路呢?
    swulling
        9
    swulling  
       2013-05-12 11:45:29 +08:00   ❤️ 1
    @xuelang 分析请求。模拟人工操作。

    一般来说,只要不是开验证码或者用浏览器插件。。凡是人能做的,机器也能做
    xuelang
        10
    xuelang  
    OP
       2013-05-12 11:48:03 +08:00
    @swulling 嗯,明白了。
    xuelang
        11
    xuelang  
    OP
       2013-05-12 11:52:08 +08:00
    @swulling 不过说到底还是要了解http协议,web的一些知识。
    DH
        12
    DH  
       2013-05-12 11:53:45 +08:00   ❤️ 1
    一般就是cookie上做文章,有些好像是js设置cookie,就得运行js代码或者弄明白算法自己算。

    苹果那个下单页面,把cookie放在静态文件里面,这些文件一般爬虫不抓,就缺cookie的值。
    Aeolia
        13
    Aeolia  
       2013-05-12 15:00:22 +08:00
    @xuelang 请问最后是怎么解决的?
    beakey
        14
    beakey  
       2013-05-12 16:01:21 +08:00
    @xuelang once的随即生成就可以?
    xuelang
        15
    xuelang  
    OP
       2013-05-12 17:25:45 +08:00
    @Aeolia post请求头加了Referer,并且用requests的Session.
    xuelang
        16
    xuelang  
    OP
       2013-05-12 17:26:39 +08:00
    @beakey once先get一下登陆界面,分析html取出once值。
    yanwen
        17
    yanwen  
       2013-05-12 22:00:20 +08:00
    菜鸟求代码。
    yaotian
        18
    yaotian  
       2013-05-12 22:30:04 +08:00
    @swulling 可有些网站有加密的,例如weibo.com的登陆。机器去做不是很容易的。
    flewover
        19
    flewover  
       2013-05-12 22:33:17 +08:00
    @yaotian weibo.com如何做加密的?我之前有用过selenium的api登录weibo.com很容易。
    swulling
        20
    swulling  
       2013-05-12 23:10:33 +08:00
    @yaotian 没啥不容易的

    不嫌烦的话用python去模拟js的行为,嫌烦的话直接用这个
    https://github.com/DYFeng/GRobot

    除非丧心病狂用flash,activex。。
    yaotian
        21
    yaotian  
       2013-05-13 00:07:46 +08:00
    @swulling 占用资源大吗?
    xuelang
        22
    xuelang  
    OP
       2013-05-13 08:53:01 +08:00
    @yanwen 我也第一次写.
    swulling
        23
    swulling  
       2013-05-13 13:09:17 +08:00
    @yaotian gevent + webkit,应该不高,不过我没测过性能

    作者原来是webkit/selenium二选一,后者资源占用比较大,貌似新版本去掉了
    yanwen
        24
    yanwen  
       2013-05-14 15:14:34 +08:00
    @xuelang 用了一下你的gist。。。貌似也是login 失败。。
    xuelang
        25
    xuelang  
    OP
       2013-05-14 16:45:52 +08:00
    @yanwen 我的可以登录上去啊(刚测的);不过短时间内多次登录会失败,可能服务器有限制。
    yanwen
        26
    yanwen  
       2013-05-14 19:59:56 +08:00
    还是不行。。也许是人品问题。。呃。。
    @xuelang

    http://bcs.duapp.com/picstore/CoUbLHaInI.jpg
    xuelang
        27
    xuelang  
    OP
       2013-05-14 22:15:06 +08:00
    @yanwen 没在win下试过。难道是user-agent的问题,你换成win下浏览器的user-agent试一下
    yanwen
        28
    yanwen  
       2013-05-14 22:23:53 +08:00
    @xuelang

    还是没搞明白到底是什么原因。。。。
    改了UA,依旧提示登陆失败。。
    yanwen
        29
    yanwen  
       2013-05-14 22:28:30 +08:00
    会不会是BS版本的问题??我装了两个BS版本。。一个是3的。。一个是4的。。是这个原因么?
    xuelang
        30
    xuelang  
    OP
       2013-05-14 22:31:11 +08:00
    @yanwen 把3卸了试试?
    yanwen
        31
    yanwen  
       2013-05-14 22:35:17 +08:00
    卸了BS3.2.1之后,还是不行。。没办法。mark一下。。改天有时间再弄。。
    xuelang
        32
    xuelang  
    OP
       2013-05-14 22:49:36 +08:00
    @yanwen 刚在win7下试了一下,可以正常登录。不知道怎么传图。。
    yanwen
        33
    yanwen  
       2013-05-14 23:51:23 +08:00
    @xuelang 直接粘贴图片的url地址就可以了。。
    yanwen
        35
    yanwen  
       2013-05-15 00:04:00 +08:00
    真奇怪。。等我重装py看看能不能解决。。真搓。。哎。。
    xieren58
        36
    xieren58  
       2013-05-17 12:24:10 +08:00
    怎么不用mechanize ?
    xuelang
        37
    xuelang  
    OP
       2013-05-17 12:55:10 +08:00
    @xieren58 不知道这个库呢,有空再看下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 22:59 · PVG 06:59 · LAX 14:59 · JFK 17:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.