[PYTHON] Utilisez Ghost.py comme alternative à PhantomJS

deck2pdf

Cette année, j'ai créé un outil CUI appelé deck2pdf qui capture les diapositives HTML et les convertit en PDF.

En gros, comme la méthode sort souvent si vous google, "Capturez chaque page en PNG → connectez tout pour créer un PDF", en version 0

Je l'ai écrit de manière partagée. Donc, je cherchais et trouvais ce Ghost.py avec l'intention de l'unifier le plus possible avec le paquet Python.

Apprenez à connaître Ghost.py

Ghost.py est un client WebKit écrit en Python avec des sessions, des évaluations, des captures d'écran et plus encore. Je n'ai pas fait de comparaison détaillée avec PhantomJS etc., mais je n'ai eu aucun problème avec le comportement minimum (même si j'étais coincé), donc je l'ai utilisé dans mon propre package tel quel.

Essayez d'utiliser Ghost.py

Essayez d'installer

Ghost.py utilise Qt, vous avez donc besoin de PySide ou PyQt. Cette fois, j'ai essayé d'utiliser PySide.

$ brew install qt
$ pip install PySide==1.2.2
$ pyside_postinstall.py -install
$ pip install Ghost.py

Supplément

En fait, la dernière version de PySide est la 1.2.4 à ce stade, mais comme la 1.2.4 n'a pas de roue Mac, il semble que la construction etc. fonctionnera et l'installation prendra du temps. Si vous n'avez pas installé PySide pour le moment et que vous souhaitez l'essayer pour le moment, je pense qu'il est plus rapide d'utiliser la 1.2.2 comme décrit ci-dessus.

Essayez d'utiliser

Tout d'abord, commencez le fantôme


>>> from ghost import Ghost
>>> ghost = Ghost()
>>> session = ghost.start()

Le processus côté client s'exécute lorsque vous créez une instance de Ghost. Créez une instance de la session avec la méthode start ().

Accéder à la page de démonstration des diapositives HTML5


>>> resp = session.open('http://html5slides.googlecode.com/svn/trunk/template/index.html')
2015-12-20T18:02:12.662Z [WARNING ] QT: libpng warning: iCCP: known incorrect sRGB profile
2015-12-20T18:02:12.746Z [WARNING ] QT: libpng warning: iCCP: known incorrect sRGB profile
>>> type(resp)
<type 'tuple'>
>>> len(resp)
2
>>> resp[0]
<ghost.ghost.HttpResource object at 0x10a99f510>
>>> resp[1]
[<ghost.ghost.HttpResource object at 0x10a99f510>, <ghost.ghost.HttpResource object at 0x10a99f410>, <ghost.ghost.HttpResource object at 0x10a99f610>, <ghost.ghost.HttpResource object at 0x10a99f750>, <ghost.ghost.HttpResource object at 0x10a99f8d0>, <ghost.ghost.HttpResource object at 0x10a99f910>, <ghost.ghost.HttpResource object at 0x10a99fb10>, <ghost.ghost.HttpResource object at 0x10a99fc10>, <ghost.ghost.HttpResource object at 0x10a99fa10>, <ghost.ghost.HttpResource object at 0x10a99fd10>]
>>>
>>> resp[0].url
u'http://html5slides.googlecode.com/svn/trunk/template/index.html'
>>> resp[1][0].url
u'http://html5slides.googlecode.com/svn/trunk/template/index.html'
>>> resp[1][1].url
u'http://html5slides.googlecode.com/svn/trunk/slides.js'
>>> resp[1][2].url
u'http://fonts.googleapis.com/css?family=Open+Sans:regular,semibold,italic,italicsemibold|Droid+Sans+Mono'

Il est difficile de comprendre s'il s'agit d'un shell interactif, mais il demandera et obtiendra toutes les ressources référencées dans l'URL et le contenu spécifié dans session.open (url).

>>> session.capture_to('capture_1.png')

Vous pouvez prendre une capture d'écran avec la méthode capture_to. Mais,,, capture_1.png

Si vous ne spécifiez pas correctement la zone de capture, ce sera terrible. Ou il peut être préférable de fixer la taille à l'avance car le port de vue peut être défini.

>>> session.capture_to('capture_2.png', region=(1940, 0, 3000, 740))
>>>

capture_2.png

Un peu accro

Ce Ghost.py peut appeler js directement dans la session.

Déplacer les diapositives html5slides vers la page suivante


>>> session.evaluate('nextSlide()')
(None, [])
>>> session.capture_to('capture_3.png', region=(1940, 0, 3000, 740))

capture_3.png

La diapositive n'avance pas même si j'exécute la fonction pour faire avancer la diapositive et la capturer. (Si vous exécutez nextSlide sur Chrome normal, etc., la diapositive se poursuivra sans problème)

Comme je l'ai confirmé en créant deck2pdf, il semble que la session Ghost.py confie la progression du temps au code en dehors de Ghost.py. Par conséquent, si vous ne faites rien, même si vous appelez le code js avec evaluer, il ne sera exécuté que si le temps avance.

python


>>> session.sleep(1)
>>> session.capture_to('capture_4.png', region=(1940, 0, 3000, 740))

Voici le résultat du glissement pendant 1 seconde. J'ai pu capturer le contenu de la diapositive sans aucun problème. capture_4.png

Résumé

Bien qu'il y ait quelques bizarreries comme celle-ci, je peux faire des choses qui peuvent être faites sur la base de WebKit, donc il semblait que je pourrais jouer à diverses choses si je m'entendais bien.

Il semble que cela soit gênant pour du matériel tel que le clonage de SpeakerDeck avec une grande pureté Python ou la création de diapositives à partir d'archives qui résument le HTML.

Recommended Posts

Utilisez Ghost.py comme alternative à PhantomJS
Une alternative à `pause` en Python
Préparation à l'utilisation d'Ansible sur un serveur Linux existant
Spécifiez MinGW comme compilateur utilisé dans Python
[Astuces] Comment utiliser l'iPhone comme caméra Web sous Linux
Créer un environnement pour utiliser CaboCha avec Google Colaboratory
Comment utiliser xml.etree.ElementTree
Comment utiliser Python-shell
Remarques sur l'utilisation de tf.data
Comment utiliser virtualenv
Comment utiliser Seaboan
Comment utiliser la correspondance d'image
Comment utiliser Pandas 2
Poésie - Une alternative à Pipenv
Comment utiliser Virtualenv
Comment utiliser pytest_report_header
Comment utiliser Bio.Phylo
Comment utiliser SymPy
Comment utiliser x-means
Comment utiliser WikiExtractor.py
Comment utiliser IPython
Comment utiliser virtualenv
Comment utiliser Matplotlib
Comment utiliser iptables
Comment utiliser numpy
Raisons d'utiliser le journal
Comment utiliser TokyoTechFes2015
Comment utiliser venv
Comment utiliser le dictionnaire {}
Comment utiliser Pyenv
Facile à utiliser SQLite3
Comment utiliser la liste []
Comment utiliser python-kabusapi
Python-Comment utiliser pyinstaller
Comment utiliser OptParse
Comment utiliser le retour
Comment utiliser pyenv-virtualenv
Comment utiliser imutils
Publié en tant que pièce jointe à Slack sur AWS Lambda (Python)
Comment utiliser Fujifilm X-T3 comme webcam sur Ubuntu 20.04
C'était trop facile d'utiliser une base de données existante avec Django
Comment utiliser cuML SVC comme classificateur CV Gridsearch
Utiliser l'API REST avec JIRA (enregistrement de l'utilisateur comme exemple)
Comment utiliser un fichier autre que .fabricrc comme fichier de configuration
Comment utiliser des valeurs discrètes comme variables dans Scipy Optimize
Utilisez Colab uniquement comme environnement GPU externe (à partir de 2020.6 / environnement Mac)
Utilisez Xming pour lancer une application GUI Ubuntu sous Windows.