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

请教一个 Flask 控制 selenium 的思路

  •  
  •   tbag781623489 · 2018-01-27 13:47:23 +08:00 · 4312 次点击
    这是一个创建于 2521 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人正在做一个练手的爬虫项目,主要是用 flask 充当 selenium 爬虫的控制面板,初步渣代码如下:

    from flask import Flask,render_template,request,redirect,url_for
    from Control import control  ## selenium 的 class
    
    app = Flask(__name__)
    app.secret_key = 'dqwer235r*tbqew4r1$1232~@'
    test = control()    ##启动后会启动两个 selenium 实例。。。
    
    @app.route('/dashboard/',methods=['GET','POST'])
    def dashboard():
        if request.method == 'GET':
            return render_template('dashboard.html')
        elif request.method == 'POST':
            if request.form['submit'] == 'Start':
                msg = 'Started.'
                qrSrc = test.qr()   ## 返回 selenium 中获取的二维码链接
                return render_template('dashboard.html',msg=msg,qrSrc=str(qrSrc))
            else:
                msg = 'no'
                return render_template('dashboard.html',msg=msg)
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0',port=80,debug=True)
    
    
    from selenium import webdriver
    import time
    
    class control:
        def __init__(self):
            self.driver = webdriver.Chrome()
    
        def qr(self):
            self.driver.get('http://example.com')
            time.sleep(2)
            qr_src = self.driver.find_element_by_id('js_login_qrcode_img').get_attribute('src')
            return qr_src   ##扫描二维码登陆
    
    if __name__ == '__main__':
        test = control()
        print(test.qr())
    

    想请教下如何实现 selenium 的持久化,即浏览器一直不关闭并且能接收 flask 传入的命令?感觉要把 flask 嵌入另一个 selenium 的 class 中,但我比较想把 flask 和爬虫两者分离。另外上面的代码会弄出两个浏览器实例,暂时未知道原因。。 谢谢大家 :)

    第 1 条附言  ·  2018-01-28 20:02:14 +08:00

    selenium-RC这个看了下似乎是selenium 1启动webdriver的方式,standalone-server这条路看来走不通,现在卡在轮询是否已扫描二维码登陆这里。。 感觉要用协程或者subprocess来进行selenium状态的轮询,只是不知道会不会导致又启动一个新的浏览器实例。。

    tornado会不会好点?或者flask有没有关于这方面的库?

    第 2 条附言  ·  2018-02-02 00:33:51 +08:00
    解决了,轮询用 socketio 库,网页端用 setinterval 更新 websocket。
    6 条回复    2018-01-27 23:18:54 +08:00
    xuyl
        1
    xuyl  
       2018-01-27 14:03:01 +08:00   ❤️ 1
    这个时候就要用到 flask 的上下文机制了
    1314258
        2
    1314258  
       2018-01-27 14:49:43 +08:00 via iPhone   ❤️ 1
    selenium 变成 http server,flask 发参数过去就可以了。
    tbag781623489
        3
    tbag781623489  
    OP
       2018-01-27 15:31:40 +08:00 via iPhone
    @1314258 多谢,selenium-rc 看起来不错,研究一下

    @xuyl 多谢指点,不过这个有点复杂,可能我要理解一段时间,而且网上也搜不到上下文的应用例子。。
    zeq
        4
    zeq  
       2018-01-27 15:42:15 +08:00   ❤️ 1
    两个实例的问题,你可以试一下 debug=False 或者 debug=True, use_reloader=False
    hareandlion
        5
    hareandlion  
       2018-01-27 15:46:37 +08:00 via iPhone
    请问 selenium server 长期运行对硬件资源有限制吗?没看到这方面的资料
    tbag781623489
        6
    tbag781623489  
    OP
       2018-01-27 23:18:54 +08:00
    @zeq 谢谢,的确是 debug=False 后变回一个实例了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6129 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:28 · PVG 10:28 · LAX 18:28 · JFK 21:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.