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?
Le moyen le plus simple d'utiliser PhantomJS dans python consiste à utiliser Selenium. La méthode d'installation la plus simple est
npm -g install phantomjs-prebuilt
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:
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
_
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.
Maintenant, vous pouvez utiliser comme ça
import Selenium.webdriver
driver = Selenium.webdriver.PhantomJS()
driver.get('http://google.com')
# do some processing
driver.quit()
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
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:
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
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.
Installer Selenium:
pip install Selenium
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()
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')
Si vous utilisez Anaconda, installez-le avec:
conda install PhantomJS
dans votre script:
from Selenium import webdriver
driver=webdriver.PhantomJS()
fonctionne parfaitement.
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')