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

请帮忙看一下这段代码,python中用requests模块保持登录!

  •  
  •   zippera ·
    zippera · 2013-08-18 11:47:18 +08:00 · 4625 次点击
    这是一个创建于 4115 天前的主题,其中的信息可能已经有所发展或是发生改变。
    问题:

    1. 可以正常登录,返回的r.html也正常。但是用s访问本站的其他页面时,cookie似乎失效了,百思不得其解。请帮忙修正一下!

    2. 下载电子书的时候也要进行登录验证。而下载一般使用urllib.urlretrieve(),怎样跟cookie绑定?

    3. 请问它的formhash怎么生成的,可不可以自动计算或获取?

    这里注册了一个临时的账号,方便大家直接测试。formhash是通过chrome的开发工具集看到的。

    代码如下:

    6 条回复    1970-01-01 08:00:00 +08:00
    iloahz
        1
    iloahz  
       2013-08-18 12:56:06 +08:00
    formhash一般会在form里面吧,解析一些dom或者正则一下提取出来呗
    kunimi
        2
    kunimi  
       2013-08-18 13:13:06 +08:00
    formhash挺好找的:
    from bs4 import BeautifulSoup
    lgurl = 'http://mlook.mobi/member/login'
    login_page = s.get(lgurl).content
    soup = BeautifulSoup(login_page)
    formhash = soup.find_all('input', {'type': 'hidden', 'name': 'formhash'})[0]['value']

    Session失效的问题没细看,lz找到答案记得po上来
    allenforrest
        3
    allenforrest  
       2013-08-18 13:13:12 +08:00
    1、session会保存cookie没问题,但问题可能不一定出在cookie,建议用浏览器(chrome、firefox)抓一下登陆和后续访问其他页面的http消息,然后和用python requests交互的比较一下(requests的可以设置proxies把http重定向到fiddler来抓取),可能网站是判断了其他的http头参数,我之前遇到一个问题就是被判断了referer不正确就拒绝了我的访问,cookie没问题。
    2、是否可以用urllib2下载?把requests session的cookie导过来。
    zippera
        4
    zippera  
    OP
       2013-08-18 14:11:05 +08:00
    @iloahz
    @kunimi
    @allenforrest

    formhash用bs解决了,多谢!session的问题还是没有头绪。 关于下载,用s.get获取后再用write写入文件行不行?
    pythoner
        5
    pythoner  
       2013-08-18 14:24:38 +08:00
    1,我运行了你的代码。post之后没有登陆成功(r.html是一个登陆表单)
    2,下载文件不一定非得用urllib.urlretrieve()。requests get到数据后写文件也一样

    你应该看看登陆post出去的数据,是不是跟你在浏览器里登陆post出去的数据一致。
    zippera
        6
    zippera  
    OP
       2013-08-18 15:32:42 +08:00
    @allenforrest
    @pythoner 不好意思,可能是formhash过期了,我修改了上面代码,现在不会存在过期问题了,运行正常。
    @kunimi

    我使用request.headers发现第二个请求没有伪装成浏览器,修改了一下代码,搞定了.

    感谢各位!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   931 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:33 · PVG 06:33 · LAX 14:33 · JFK 17:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.