web-dev-qa-db-fra.com

Est-il possible d'utiliser PhantomJS en Python?

Je veux utiliser PhantomJS dans Python . J'ai cherché ce problème sur Google mais je ne trouvais pas de solutions adéquates.

Je trouve que os.popen() peut être un bon choix. Mais je ne pouvais pas passer des arguments à cela.

Utiliser subprocess.Popen() peut être une solution appropriée pour le moment. Je veux savoir s'il existe une meilleure solution ou non.

Est-il possible d'utiliser PhantomJS en Python?

201
flyer

Le moyen le plus simple d'utiliser PhantomJS dans python consiste à utiliser Selenium. La méthode d'installation la plus simple est

  1. Installer NodeJS
  2. À l'aide du gestionnaire de paquets de Node, installez phantomjs: npm -g install phantomjs-prebuilt
  3. installez Selenium (dans votre virtualenv, si vous l'utilisez)

Après l’installation, vous pouvez utiliser fantôme aussi simplement que:

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

Si votre variable d'environnement de chemin d'accès système n'est pas définie correctement, vous devez spécifier le chemin d'accès exact en tant qu'argument pour webdriver.PhantomJS(). Remplacez ceci:

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

... avec ce qui suit:

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

Références:

369
Pykler

PhantomJS récemment abandonné Python support tout à fait. Cependant, PhantomJS intègre désormais Ghost Driver .

Un nouveau projet a depuis été mis en place pour combler le vide: ghost.py . Vous voudrez probablement utiliser cela à la place:

_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
_
80
Martijn Pieters

Maintenant que le GhostDriver est fourni avec le PhantomJS, il est devenu encore plus pratique de l’utiliser via Selenium.

J'ai essayé l'installation Node de PhantomJS, comme suggéré par Pykler, mais en pratique, je l'ai trouvée plus lente que l'installation autonome de PhantomJS. Je suppose que l'installation autonome ne fournissait pas ces fonctionnalités plus tôt, mais à partir de la v1.9, elle le fait beaucoup.

  1. Installez PhantomJS ( http://phantomjs.org/download.html ) (Si vous êtes sous Linux, les instructions suivantes vous aideront https://stackoverflow.com/a/14267295/38263 )
  2. Installez Sélénium à l’aide de pip.

Maintenant, vous pouvez utiliser comme ça

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

driver.quit()
39
Pankaj

Voici comment tester javascript avec PhantomJS et Django:

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

Exécuter les tests:

manage.py test mobile

8
Emil Stenström

Le answer by @Pykler est excellent, mais l'exigence Node est obsolète. Les commentaires dans cette réponse suggèrent la réponse plus simple, que j'ai mise ici pour faire gagner du temps aux autres:

  1. Installer PhantomJS

    Comme @ Vivin-Paliath le souligne, il s'agit d'un projet autonome, qui ne fait pas partie de Node.

    Mac:

    brew install phantomjs
    

    Ubuntu:

    Sudo apt-get install phantomjs
    

    etc

  2. Configurez un virtualenv (si vous ne l'avez pas déjà fait):

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

    Si votre ordinateur est équipé de Python 2 et 3, vous devrez peut-être exécuter virtualenv-3.6 mypy ou similaire.

  3. Installer Selenium:

    pip install Selenium
    
  4. Essayez un test simple, comme celui emprunté à la 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()
    
6
Andrew E

c'est ce que je fais, python3.3. Je traitais d'énormes listes de sites, il était donc essentiel de ne pas respecter le délai d'expiration pour que le travail soit exécuté dans son intégralité.

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')
5
tlib

Si vous utilisez Anaconda, installez-le avec:

conda install PhantomJS

dans votre script:

from Selenium import webdriver
driver=webdriver.PhantomJS()

fonctionne parfaitement.

5
clg4

Si vous utilisez Buildout , vous pouvez facilement automatiser les processus d'installation décrits par Pykler à l'aide de la recette gp.recipe.node .

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

Cette partie installe node.js en binaire (du moins sur mon système), puis utilise npm pour installer PhantomJS. Enfin, il crée un point d’entrée bin/phantomjs, avec lequel vous pouvez appeler le WebDriver PhantomJS. (Pour installer Selenium, vous devez le spécifier dans vos exigences Egg ou dans la configuration Buildout.)

driver = webdriver.PhantomJS('bin/phantomjs')
1
Denis Drescher