Python:如何高效地运行多个PhantomJS实例?

Python:如何高效地运行多个PhantomJS实例?,python,selenium,phantomjs,Python,Selenium,Phantomjs,我使用多处理导入池中的库,使用多处理 虽然我使用的是请求,但我希望使用selenium,因为一些数据正在加载到弹出窗口中。使用Phantomjs而不导致内存泄漏的最佳方法是什么?大致翻译的基本思想如下: from __future__ import unicode_literals import logging from werkzeug.routing import Map from werkzeug.exceptions import HTTPException from werkzeug.

我使用多处理导入池中的库
,使用多处理


虽然我使用的是
请求
,但我希望使用selenium,因为一些数据正在加载到弹出窗口中。使用Phantomjs而不导致内存泄漏的最佳方法是什么?

大致翻译的基本思想如下:

from __future__ import unicode_literals
import logging
from werkzeug.routing import Map
from werkzeug.exceptions import HTTPException
from werkzeug.wrappers import Request
class WebApp(object):

    def __init__(self, **kw):
        self.log = logging.getLogger(__name__)

    def __call__(self, environ, start_response):
        return self.wsgi_app(environ, start_response)

    def wsgi_app(self, environ, start_response):
        request = Request(environ)
        response = self.dispatch_request(request)
        return response(environ, start_response)

    def dispatch_request(self, request):
        adapter = self.url_map.bind_to_environ(request.environ)
        try:
            endpoint, values = adapter.match()
            method = getattr(self, 'endpoint_{}'.format(endpoint))
            return method(adapter, request, **values)
        except HTTPException, e:
            return e

    url_map = Map([])


from pyvirtualdisplay import Display
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from subprocess import Popen, PIPE
import multiprocessing
display = Display(visible=0, size=(800, 600))
display.start()

def get_proxy_obj():
    proxy = '123.456.789.012'

    proxyobj = Proxy({
        'proxyType': ProxyType.MANUAL,
        'httpProxy': proxy,
        'ftpProxy': proxy,
        'sslProxy': proxy,
        'noProxy': '' # set this value as desired
    })
    capabilities = DesiredCapabilities().FIREFOX
    capabilities['acceptSslCerts'] = True
    proxyobj.add_to_capabilities(capabilities)
    return capabilities





drivers = [
     Firefox(FirefoxProfile('/etc/firefox/u2vgyy61.Proxied_User/'),
             capabilities=get_capabilities()),
     Firefox(FirefoxProfile('/etc/firefox/u2vgyy61.Proxied_User/'),
             capabilities=get_capabilities()),
     Firefox(FirefoxProfile('/etc/firefox/u2vgyy61.Proxied_User/'),
             capabilities=get_capabilities())
 ]

class Routes(WebApp):
    def endpoint_get_response(self, adapter, request, **values):
        url = request.values.get("query_param_here","")
        if url:
            # something better here
            while True:
                try:
                    driver = driver.pop()
                    resposne_txt = driver.get(url)
                    # response_txt = Popen(['docker', "exec", "-it", "selenium_phantom", url]).communicate()[0]
                    drivers.append(driver)
                    return Response(response_text)
                except:
                    sleep(1)
                    continue

        else:
            return Response("Not", status=400)

    url_map = Map([
            Rule('/get_response', endpoint='get_response', methods=['GET']),
        ])
例如,用法:

curl http://node1/get_response?query_param_here=http://stackoverflow.com
curl http://node2/get_response?query_param_here=http://stackoverflow.com
curl http://node3/get_response?query_param_here=http://stackoverflow.com
curl http://node4/get_response?query_param_here=http://stackoverflow.com
...
and so on
使用类似于以下内容的负载平衡器:


设置selenium网格,并将
maxInstances
设置为每个节点都可以处理的内容,这样您就可以根据需要添加节点了吗?您正在寻找多少实例?每分钟有多少个请求?如果这不是一个选项,也许考虑在他们提出请求时重用硒会话并旋转它们。@ JMunsCH不知道关于代码>硒Grid 。因为我愿意使用并行处理,所以一次可以处理5个实例。每个请求都会有2-5秒的延迟。@jmunch第二,我需要一个基于服务器的解决方案,这个网格似乎安装了Java,你说的“基于服务器的解决方案”是什么意思?它是用于单元测试的吗?或者像爬行/刮擦之类的东西?如果是用于单元测试,可以考虑使用PyValualDebug使用XVFB,如果它用于抓取爬行,那么继续执行您正在做的操作,但是考虑将其放入DoCKER容器中,因为内存原因,并且在它前面添加一个REST接口,这样您就可以通过“重新启动”DOCKER容器来处理内存泄漏。通过这种方式,您还可以使用指向所有容器和rest接口的负载平衡器水平扩展它。@jmunch您已经给出了一些有力的建议。你能给我一些资源来进一步了解这种设置吗?