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

Python 能控制浏览器并交互吗?

  •  
  •   yuewolf · 2015-12-18 21:58:08 +08:00 · 4994 次点击
    这是一个创建于 3281 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用场景如下:
    控制浏览器——哪个都行——登录 QQ 空间(太复杂了,菜鸟提交数据完全搞不定,唯一靠谱的 http://git.oschina.net/gerald/qqlib 已经失效),然后提取 cookie 。

    当然,大牛有通过 post 成功获取的代码提供更好。
    第 1 条附言  ·  2015-12-19 03:55:51 +08:00
    感谢大家的鼎立支持,原来有这么多种方法可以搞定。

    经过摸索,成功搞定啦!
    29 条回复    2015-12-23 00:00:08 +08:00
    chemzqm
        1
    chemzqm  
       2015-12-18 22:01:53 +08:00   ❤️ 1
    走 http 就行了,用不着浏览器啊,就是 OCR 可能比较费劲,开源的都不好用,您可以用 opencv 去实现一个
    hansnow
        2
    hansnow  
       2015-12-18 22:04:13 +08:00   ❤️ 1
    试试 selenium ?
    yuewolf
        3
    yuewolf  
    OP
       2015-12-18 22:12:23 +08:00
    @chemzqm 对菜鸟而言,走 http 太艰难了, QQ 空间这个不是那种一般的字段提交就 OK ,密码那里不知道怎么加密的,加密算法似乎还经常更新。所以,幻想走浏览器是不是更容易。
    just1
        4
    just1  
       2015-12-18 22:18:20 +08:00 via Android   ❤️ 1
    @yuewolf
    linhua
        5
    linhua  
       2015-12-18 22:18:20 +08:00   ❤️ 1
    1.如果只是提取 cookie ,可以用浏览器调试工具找到请求 API ,模拟登录请求,这应该是 qqlib 所用方法。
    2.或者用 headless browser

    https://en.wikipedia.org/wiki/Headless_browser
    https://github.com/dhamaniasad/HeadlessBrowsers
    terence4444
        6
    terence4444  
       2015-12-18 22:19:24 +08:00
    只用 GET/POST 可以,再复杂的一点的就要 HTTP 了吧。
    angelface
        7
    angelface  
       2015-12-18 22:21:37 +08:00   ❤️ 1
    mechanize?
    yuewolf
        8
    yuewolf  
    OP
       2015-12-18 22:27:22 +08:00   ❤️ 1
    @just1 不想多说什么,你有空看一下,还牵涉各种加密。当然,一个简单的“学”字绝对可以解决这个问题。可有时候人是不是应该多少站别人立场上多想那么一丁点儿呢?
    lecher
        9
    lecher  
       2015-12-18 22:33:00 +08:00   ❤️ 3
    又没有给钱,为什么要花自己的时间和精力去站到懒人的立场多考虑一些。
    真不把别人的时间和精力当回事吗。
    kslr
        10
    kslr  
       2015-12-18 22:43:04 +08:00   ❤️ 1
    模拟一个浏览器(搜一下叫什么 JS 来着),控制鼠标去点下登陆,然后获取 Cookie 这样就简单了吧
    yuewolf
        11
    yuewolf  
    OP
       2015-12-18 22:43:39 +08:00   ❤️ 1
    @lecher 你看清楚,我说明自己做过尝试了,找过代码,尝试过。并且,一路搜索找到了对方在简书上的文章 http://www.jianshu.com/p/4217d8f3574b
    尝试了两三天以后,失败了,所以求个指点,想着或许其他人有更好方法和思路。我肯定很菜,但不能说是纯粹的伸手党吧?
    他简单地回复了一个“学”字,让非常郁闷的我心里更堵,所以做了如上回复。我只是觉得,要么干脆就别回复,呵斥我一句能有多爽呢?
    语言撕逼隔几天就上演, V2 里面也不都是纯粹高手在华山论剑吧?我这个问题有那么碍您眼睛?
    icedx
        12
    icedx  
       2015-12-18 22:44:38 +08:00
    vmebeh
        13
    vmebeh  
       2015-12-18 22:46:05 +08:00   ❤️ 1
    不管什么加密都是在浏览器端实现的, JavaScript 可以直接看源码

    以前的 webQQ 的密码是三次 md5 后加盐再一次 md5
    yuewolf
        14
    yuewolf  
    OP
       2015-12-18 22:47:40 +08:00
    @linhua 是的,QQlib 的作者就是这样搞的。分析了 QQ 所用的一个 JS 加密,然后在 http://www.jianshu.com/p/4217d8f3574b 这篇文中提出:
    JS 中的方法对应于 Python 中的实现:
    md5 => hashlib.md5
    uin2hex => to_bytes
    hexchar2bin => bytes.fromhex
    strToBytes => binascii.hexlify
    btoa => base64.b64encode
    说实话,这些我只了解 md5 ……
    而且,看他文中标注似乎已经失效,这个 JS 算法经常变动。
    所以我就想干脆不走 http 提交。
    yuewolf
        15
    yuewolf  
    OP
       2015-12-18 22:49:48 +08:00
    @kslr 我也是觉得这样似乎更简单

    @vmebeh 对的,它的密码各种加密,还老变。
    hanfeng3015
        16
    hanfeng3015  
       2015-12-18 22:51:07 +08:00   ❤️ 1
    可以研究一下 PyWebkit
    yuewolf
        17
    yuewolf  
    OP
       2015-12-18 22:53:10 +08:00
    @lecher 语气可能不好,细思极悔,请勿见怪。
    just1
        18
    just1  
       2015-12-18 22:53:14 +08:00 via Android   ❤️ 1
    Mechanize ?
    yuewolf
        19
    yuewolf  
    OP
       2015-12-18 22:59:01 +08:00
    感谢
    @angelface
    @just1
    @hansnow
    @hanfeng3015
    我去试试看,嘿嘿
    linhua
        20
    linhua  
       2015-12-18 23:03:21 +08:00   ❤️ 2
    也许你想实现在 python 中调用 javascript 代码,即用 python 实现的 javascript 解析器。如 python-spidermonkey , Js2Py
    关键词: javascript parser in python
    quericy
        21
    quericy  
       2015-12-19 00:00:24 +08:00
    个人觉得 LZ 这种情况写个 chrome 扩展进行模拟登录可能会更容易点
    g00001
        22
    g00001  
       2015-12-19 01:03:09 +08:00   ❤️ 1
    aardio 控制浏览器很简单, http://www.visualget.com/ 这个就是 aardio 开发的, 这已经做成一个生成这类程序的开发工具了。里面就有 QQ 空间登录发说说的。
    Stargi
        23
    Stargi  
       2015-12-19 01:13:01 +08:00   ❤️ 1
    yuewolf
        24
    yuewolf  
    OP
       2015-12-19 03:11:09 +08:00
    @Stargi 哈哈,成功登陆了。而且它一个 browser.cookies.all()直接就把 cookie 给取回来了。


    @hansnow splinter 应该是基于 selenium 的, selenium 肯定也能搞定。

    多谢啦~
    msg7086
        25
    msg7086  
       2015-12-19 04:36:32 +08:00
    直接用无头浏览器组件还是很方便的。
    做网站自动化测试的时候也会用到浏览器模拟提交,用到的技术是类似的。

    扩展阅读:
    PhantomJS - Webkit
    Slimer.js - Gecko
    CasperJS - 另一个 JS 运行环境
    thomaspaine
        26
    thomaspaine  
       2015-12-19 20:51:14 +08:00
    robotframework
    适合懒人
    anexplore
        27
    anexplore  
       2015-12-20 00:00:06 +08:00 via iPhone
    selenium webdriver
    yuewolf
        28
    yuewolf  
    OP
       2015-12-22 16:47:03 +08:00
    @msg7086 @Stargi 请教一个问题:
    browser.find_by_id('go').first.click()
    #get the session cookie
    #time.sleep(1)
    theCookies = browser.cookies.all()
    mystr = ";".join(["%s=%s" % (k, v) for k, v in theCookies.items()])
    print mystr
    如果浏览器用 Firefox ,模拟点击之后打开新页面,然后获取登录后的 Cookie 。可是用 PhantomJS 或者 Chrome 获取的都是登录前的 Cookie ,必须上面那样 sleep 1 - 2 秒等页面打开才可以。
    msg7086
        29
    msg7086  
       2015-12-23 00:00:08 +08:00
    @yuewolf 没怎么用过 Python 不太清楚你的问题。
    如果是点击以后获取 Cookie 的话,当然应该等服务器返回新的 Cookie 以后再获取咯。
    你看看有没有页面载入完毕的回调事件之类的东西吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5100 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 07:33 · PVG 15:33 · LAX 23:33 · JFK 02:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.