210 votes

Est-il possible d'utiliser PhantomJS en Python?

Je veux utiliser PhantomJS en Python. J'ai googlé ce problème, mais ne pouvait pas trouver une solution adéquate.

- Je trouver de l' os.popen() peut être un bon choix. Mais je ne pouvais pas laisser passer certains arguments.

Est-il possible d'utiliser PhantomJS en Python?

Mise à JOUR

À l'aide de sous-processus.Popen() peut être une bonne solution pour l'instant. Je veux savoir si il y a une meilleure solution ou pas.

380voto

Pykler Points 2698

Le moyen le plus facile à utiliser PhantomJS en python est via le Sélénium. La méthode d'installation est la plus simple

  1. Installer NodeJS
  2. À l'aide de Node package manager installer phantomjs: npm -g install phantomjs
  3. installer le sélénium (dans votre virtualenv, si vous utilisez cette)

Après l'installation, vous pouvez utiliser fantôme aussi simple 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 système path n'est pas réglée correctement, vous aurez besoin de spécifier le chemin d'accès exact comme un argument à l' webdriver.PhantomJS(). Remplacer ce:

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

... avec les éléments suivants:

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

Références:

81voto

Martijn Pieters Points 271458

PhantomJS a récemment abandonné le support Python . Cependant, PhantomJS intègre désormais Ghost Driver .

Un nouveau projet s'est depuis intensifié pour combler le vide: Ghost.py . Vous voulez probablement l'utiliser à la place:

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

40voto

Pankaj Points 1006

Maintenant, depuis la GhostDriver est livrée avec PhantomJS, il est devenu encore plus pratique à utiliser par le biais de Sélénium.

J'ai essayé l'installation du Nœud de PhantomJS, comme suggéré par Pykler, mais dans la pratique, je l'ai trouvé à être plus lent que l'installation autonome de PhantomJS. Je suppose que l'installation autonome n'a pas fourni ces fonctionnalités plus tôt, mais à partir de la v1.9, c'est très bien fait.

  1. Installer PhantomJS (http://phantomjs.org/download.html) (Si vous êtes sur Linux, en suivant les instructions de l'aide http://stackoverflow.com/a/14267295/382630)
  2. Installer le Sélénium aide de pip.

Maintenant, vous pouvez l'utiliser comme ceci

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

driver.quit()

8voto

Emil Stenström Points 3551

Voici comment je teste javascript en utilisant 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 des tests :

manage.py test mobile

5voto

tlib Points 21

c'est ce que je fais, python3.3. Je traitais d'énormes listes de sites. Par conséquent, le dépassement du délai d'attente était essentiel pour que le travail puisse être exécuté dans toute la liste.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X