【问题标题】:Is there a way to use PhantomJS in Python?有没有办法在 Python 中使用 PhantomJS?
【发布时间】:2012-10-28 13:23:27
【问题描述】:

我想在Python 中使用PhantomJS。我用谷歌搜索了这个问题,但找不到合适的解决方案。

我发现os.popen() 可能是一个不错的选择。但我无法向它传递一些参数。

目前使用subprocess.Popen() 可能是一个合适的解决方案。我想知道是否有更好的解决方案。

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

【问题讨论】:

  • 下面我的回答告诉你怎么做。只是看看你的问题,实际上这正是 Selenium 所做的,subprocess.popen,但具有一些扩展功能以使 api 无缝。
  • @flyer:您可能应该考虑更改接受的答案,见下文。谢谢。

标签: python phantomjs


【解决方案1】:

PhantomJS 最近完全是dropped Python support。但是,PhantomJS 现在嵌入了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

【讨论】:

  • 即使放弃了支持,我发现安装 npm(节点包管理器)并使用它来安装最新的 phantomjs(支持 webdriver)并在 python 中安装 selenium ...比尝试更容易让 PyQT 或 PySide 正常工作。 phantom 的优点是它真正无头,不需要 UI/X11 相关的库即可工作。
  • 在尝试使用 ghost.py 并讨厌我的生活后,我在下面添加了一个答案,解释了我的首选解决方案
  • Pykler 的“讨厌我的生活”并非轻描淡写。如果有人将此问题的“正确答案”更改为 Pykler 的,我会节省一天的精力。
  • @YPCrumble:不幸的是,只有 OP 才能做到这一点;更改接受的答案。
  • 今天早上尝试了很多不同的方法后,@Pykler 解决方案最终运行得最顺利。
【解决方案2】:

这是我使用 PhantomJS 和 Django 测试 javascript 的方法:

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

运行测试

manage.py test mobile

【讨论】:

  • 谢谢。我使用 subprocess.Popen 来调用 phantomjs 脚本,它工作:)
  • 您确实看到这是如何受到限制的吧?您所做的只是调用 shell 来执行 phantomjs - 您实际上并没有使用“正确”的接口,您可以通过该接口正确处理异常、阻塞等。
  • @kamelkev:我明白这是多么有限。好处是这种方法允许我使用 Django 的引导功能来设置一个测试数据库,其中每个测试的内容都正确。是的,它可以与其他答案结合使用,以实现两全其美。
【解决方案3】:

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

  1. 安装NodeJS
  2. 使用 Node 的包管理器安装 phantomjs:npm -g install phantomjs-prebuilt
  3. 安装 selenium(在您的 virtualenv 中,如果您正在使用它)

安装后,你可以使用phantom,简单如下:

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()

如果您的系统路径环境变量设置不正确,您需要指定确切的路径作为webdriver.PhantomJS() 的参数。替换这个:

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

...带有以下内容:

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

参考资料:

【讨论】:

  • 这很好用,可能节省了我很多天。谢谢你。如果想要将整个呈现的页面作为源返回,那就是driver.page_source
  • 这确实工作得很好,我很惊喜,因为phantomjs.org/faq.html 说“不是 Node.js 模块”——然而,npmjs.org/package/phantomjs 的 npm 包装器使它为此目的而运行。就我而言,我想这样做:bodyStr= driver.find_element_by_tag_name("body").get_attribute("innerHTML") 并且......它奏效了!
  • 我同意 ghost 具有疯狂的依赖关系,即使安装了数百万个 X11 相关库,我实际上也无法启动并运行它。鬼是一个恐怖故事。
  • @phabtar 您需要将 phantomjs 的路径作为第一个参数传递给 PhantomJS ... 或修复您的 Windows 系统路径以便能够看到 phantomjs。
  • 在 Windows 下,我不必通过nodenpm 安装phantomJS。从phantomjs.org/download.html 下载二进制文件并将phantomjs.exe 放入我的PATH 中的某个位置(例如c:\Windows\System32),反之亦然(将其放在任何地方并将文件夹添加到PATH)足以使其在Python 中工作。跨度>
【解决方案4】:

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

按照 Pykler 的建议,我尝试了 PhantomJS 的 Node 安装,但实际上我发现它比 PhantomJS 的独立安装要慢。我猜独立安装之前并没有提供这些功能,但是从 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()

【讨论】:

  • 特别感谢您指出有关在 Ubuntu 上安装 PhantomJS 的 SO 答案,它帮助了我。
  • 我刚刚学到的一种快速安装 Selenium 的方法是,在 Windows 上,输入:C:\Python34\Scripts\pip.exe install Selenium。
【解决方案5】:

这就是我所做的,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')

【讨论】:

  • 谢谢,我可以根据自己的目的对其进行更改。
【解决方案6】:

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

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

该部分将 node.js 安装为二进制文件(至少在我的系统上),然后使用 npm 安装 PhantomJS。最后它创建了一个入口点bin/phantomjs,你可以用它来调用PhantomJS webdriver。 (要安装 Selenium,您需要在 egg 需求或 Buildout 配置中指定它。)

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

【讨论】:

  • 另一种通过构建自动化安装过程的方法是使用gp.recipe.phantomjs,配置phantomjscasperjs
【解决方案7】:

如果使用 Anaconda,请安装:

conda install PhantomJS

在您的脚本中:

from selenium import webdriver
driver=webdriver.PhantomJS()

完美运行。

【讨论】:

  • 目前,linux64的默认频道不包含PhantomJS
  • 该死的,我喜欢 conda
【解决方案8】:

answer by @Pykler 很棒,但 Node 要求已过时。该答案中的 cmets 提出了更简单的答案,我将其放在这里是为了节省其他人的时间:

  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 和 3,您可能需要运行 virtualenv-3.6 mypy 或类似的。

  3. 安装硒:

    pip install selenium
    
  4. 尝试一个简单的测试,就像这个从docs借来的:

    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()
    

【讨论】:

  • 如何在windows上安装PhantomJS?使用pip 命令似乎不起作用。
  • Pip 是一个 python 包安装程序,因此它可以与 selenium 一起使用,它可以作为 python 包使用。 PhantomJS 不是 python 包,因此不能与 pip 一起使用。我为“PhantomJS install windows”做了一个快速的谷歌搜索,结果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多