有没有办法在Python中使用PhantomJS?

我想在Python中使用PhantomJS 。 我GOOGLE了这个问题,但找不到合适的解决scheme。

我发现os.popen()可能是一个不错的select。 但我不能通过一些论据。

使用subprocess.Popen()现在可能是一个合适的解决scheme。 我想知道是否有更好的解决scheme。

有没有办法在Python中使用PhantomJS?

在Python中使用PhantomJS最简单的方法是通过Selenium。 最简单的安装方法是

  1. 安装NodeJS
  2. 使用Node的包pipe理器安装phantomjs: npm -g install phantomjs-prebuilt
  3. 安装selenium(在你的virtualenv,如果你使用的话)

安装完毕后,您可以使用如下简单的幻像:

 from selenium import webdriver driver = webdriver.PhantomJS() # or add to your PATH driver.set_window_size(1024, 768) # optional driver.get('https://google.com/') driver.save_screenshot('screen.png') # save a screenshot to disk sbtn = driver.find_element_by_css_selector('button.gbqfba') sbtn.click() 

如果您的系统path环境variables设置不正确,则需要将确切的path指定为webdriver.PhantomJS()的参数。 replace这个:

 driver = webdriver.PhantomJS() # or add to your PATH 

…与以下内容:

 driver = webdriver.PhantomJS(executable_path='/usr/local/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs') 

参考文献:

PhantomJS最近完全放弃了Python的支持 。 不过,PhantomJS现在embedded了Ghost Driver 。

自那时以来,一个新的项目已经开始填补空白: ghost.py 。 您可能想要使用它:

 from ghost import Ghost ghost = Ghost() with ghost.start() as session: page, extra_resources = ghost.open("http://jeanphi.me") assert page.http_status==200 and 'jeanphix' in ghost.content 

现在,由于GhostDriver与PhantomJS捆绑在一起,通过Selenium使用它变得更加方便。

正如Pykler所build议的,我尝试了PhantomJS的Node安装,但实际上我发现它比单独安装PhantomJS要慢。 我猜测独立安装并没有提供这些function,但是从v1.9开始,它是非常有用的。

  1. 安装PhantomJS( http://phantomjs.org/download.html )(如果你在Linux上,以下说明将帮助https://stackoverflow.com/a/14267295/382630
  2. 用pip安装selenium。

现在你可以像这样使用

 import selenium.webdriver driver = selenium.webdriver.PhantomJS() driver.get('http://google.com') # do some processing driver.quit() 

以下是我如何使用PhantomJS和DjangotestingJavaScript:

mobile / test_no_js_errors.js

 var page = require('webpage').create(), system = require('system'), url = system.args[1], status_code; page.onError = function (msg, trace) { console.log(msg); trace.forEach(function(item) { console.log(' ', item.file, ':', item.line); }); }; page.onResourceReceived = function(resource) { if (resource.url == url) { status_code = resource.status; } }; page.open(url, function (status) { if (status == "fail" || status_code != 200) { console.log("Error: " + status_code + " for url: " + url); phantom.exit(1); } phantom.exit(0); }); 

mobile / tests.py

 import subprocess from django.test import LiveServerTestCase class MobileTest(LiveServerTestCase): def test_mobile_js(self): args = ["phantomjs", "mobile/test_no_js_errors.js", self.live_server_url] result = subprocess.check_output(args) self.assertEqual(result, "") # No result means no error 

运行testing

manage.py test mobile

这就是我所做的,python3.3。 我正在处理大量的网站列表,因此,超时失败对于整个列表中的作业至关重要。

 command = "phantomjs --ignore-ssl-errors=true "+<your js file for phantom> process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) # make sure phantomjs has time to download/process the page # but if we get nothing after 30 sec, just move on try: output, errors = process.communicate(timeout=30) except Exception as e: print("\t\tException: %s" % e) process.kill() # output will be weird, decode to utf-8 to save heartache phantom_output = '' for out_line in output.splitlines(): phantom_output += out_line.decode('utf-8') 

如果使用Anaconda,请使用以下命令安装:

 conda install PhantomJS 

在你的脚本中:

 from selenium import webdriver driver=webdriver.PhantomJS() 

完美的作品。

如果你正在使用Buildout ,你可以使用gp.recipe.node配方轻松地自动化Pykler描述的安装过程。

 [nodejs] recipe = gp.recipe.node version = 0.10.32 npms = phantomjs scripts = phantomjs 

该部分将node.js安装为二进制(至less在我的系统上),然后使用npm来安装PhantomJS。 最后它会创build一个入口点bin/phantomjs ,您可以使用PhantomJS webdriver。 (要安装Selenium,您需要在您的蛋需求或Buildoutconfiguration中指定它。)

 driver = webdriver.PhantomJS('bin/phantomjs') 

@Pykler的答案很好,但Node的要求已经过时了。 答案中的意见提出了更简单的答案,我已经放在这里来节省时间:

  1. 安装PhantomJS

    正如@ Vivin-Paliath指出的那样,这是一个独立的项目,而不是Node的一部分。

    苹果电脑:

     brew install phantomjs 

    Ubuntu的:

     sudo apt-get install phantomjs 

    等等

  2. 设置一个virtualenv (如果你还没有):

     virtualenv mypy # doesn't have to be "mypy". Can be anything. . mypy/bin/activate 

    如果您的机器同时拥有Python 2和Python 3,则可能需要运行virtualenv-3.6 mypy或类似软件。

  3. 安装selenium:

     pip install selenium 
  4. 尝试一个简单的testing,就像从文档中借用的那样:

     from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.PhantomJS() driver.get("http://www.python.org") assert "Python" in driver.title elem = driver.find_element_by_name("q") elem.clear() elem.send_keys("pycon") elem.send_keys(Keys.RETURN) assert "No results found." not in driver.page_source driver.close()