Comment puis-je prendre une capture d'écran/image d'un site Web en utilisant Python?
ce que je veux réaliser, c'est obtenir une capture d'écran de n'importe quel site Web en python.
Env: Linux
7 réponses
sur le Mac, il y a webkit2png et sur Linux+KDE, vous pouvez utiliser khtml2png . J'ai essayé le premier et cela fonctionne assez bien, et j'ai entendu dire que le second a été utilisé.
je suis tombé récemment sur QtWebKit qui prétend être la plate-forme croisée (Qt roulé WebKit dans leur bibliothèque, je suppose). Mais je n'ai jamais essayé, donc je ne peux pas vous en dire plus.
Le QtWebKit les liens montrent comment accéder à partir de Python. Vous devriez être capable d'utiliser au moins subprocess pour faire la même chose avec les autres.
Voici une solution simple en utilisant webkit: http://webscraping.com/blog/Webpage-screenshots-with-webkit /
import sys
import time
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
class Screenshot(QWebView):
def __init__(self):
self.app = QApplication(sys.argv)
QWebView.__init__(self)
self._loaded = False
self.loadFinished.connect(self._loadFinished)
def capture(self, url, output_file):
self.load(QUrl(url))
self.wait_load()
# set to webpage size
frame = self.page().mainFrame()
self.page().setViewportSize(frame.contentsSize())
# render image
image = QImage(self.page().viewportSize(), QImage.Format_ARGB32)
painter = QPainter(image)
frame.render(painter)
painter.end()
print 'saving', output_file
image.save(output_file)
def wait_load(self, delay=0):
# process app events until page loaded
while not self._loaded:
self.app.processEvents()
time.sleep(delay)
self._loaded = False
def _loadFinished(self, result):
self._loaded = True
s = Screenshot()
s.capture('http://webscraping.com', 'website.png')
s.capture('http://webscraping.com/blog', 'blog.png')
voici ma solution en obtenant de l'aide de diverses sources. Il prend la pleine capture d'écran de page web et il la récolte (optionnel) et génère des vignettes de l'image recadrée aussi. Les exigences sont les suivantes:
exigences:
- Installer NodeJS
- utilisant le gestionnaire de paquets de Node installer phantomjs:
npm -g install phantomjs
- Installer le sélénium (dans votre virtualenv, si vous utilisez ce)
- installer imageMagick
- ajouter phantomjs à system path (sous windows)
importations
sous-processus importation Popen, PIPE
de sélénium importation webdriver
abspath = lambda *p: os.chemin.abspath (os.chemin.join(*p))
ROOT = abspath (os.chemin.dirname (___fichier__))
def execute_command(commande):
résultat = Popen (commande, shell=True, stdout=PIPE).la sortie standard stdout.lire()
si len (résultat) > 0 et pas de résultat.isspace():
augmentation de L'Exception(résultat)
def do_screen_capturing(url, screen_path, largeur, hauteur):
imprimer " écran de capture.."
pilote = webdriver.PhantomJS()
# enregistrer le fichier journal de service dans le même répertoire
# si vous voulez avoir le fichier journal stockées ailleurs
# initialise le webdriver.PhantomJS () as
# driver = webdriver.PhantomJS (service_log_path='/var/log/phantomjs/ghostdriver.le journal')
pilote.set_script_timeout(30))
si largeur et hauteur:
pilote.set_window_size(largeur, hauteur)
pilote.get(url)
pilote.save_screenshot(screen_path)
def do_crop(params):
imprimer " Croping image capturée.."
commande= [
"convert",
params ['screen_path'],
'cultures', '%sx%s+0+0' % (params['largeur'], params['hauteur']),
params ["crop_path"]
]
execute_command(" ".join(commande))
def do_thumbnail (params):
imprimer " générer une vignette à partir d'une image saisie.."
commande= [
"convert",
params ["crop_path"],
'filtre', 'Lanczos',
'-vignette', '%sx%s' % (params['largeur'], params['hauteur']),
params ["thumbnail_path"]
]
execute_command(" ".join(commande))
Def get_screen_shot(**kwargs):
url = kwargs ['url']
largeur = int (kwargs.get('width', 1024)) # la largeur de l'écran à capturer
hauteur = int (kwargs.get ('height', 768)) # taille de l'écran à capturer
filename = kwargs.get('nom du fichier', 'écran.png') # nom du fichier, par exemple écran.png
chemin= kwargs.get('path', RACINE) # chemin d'accès au répertoire pour stocker de l'écran
crop = kwargs.get('culture', False) # culture la capture d'écran
crop_width = int (kwargs.get('crop_width', width)) # la largeur de la culture de l'écran
crop_height = int (kwargs.get('crop_height', height)) # la hauteur de la culture de l'écran
crop_replace = kwargs.get ('crop_replace', False) # Est-ce que crop image remplace la capture d'écran originale?
vignette = kwargs.get('vignette', False) # générer une miniature de l'écran, nécessite des cultures=True
thumbnail_width = int (kwargs.get('thumbnail_width', width)) # la largeur de la vignette
thumbnail_height = int (kwargs.get('thumbnail_height', height)) # la hauteur de la vignette
thumbnail_replace = kwargs.get ('thumbnail_replace', False) # Est-ce que thumbnail image remplace crop image?
screen_path = abspath (chemin, Nom du fichier))
crop_path = thumbnail_path = screen_path
si la vignette et non des cultures:
raise Exception, 'Thumnail génération nécessite la culture de l'image, de l'ensemble des cultures=True'
do_screen_capturing(url, screen_path, largeur, hauteur)
si la récolte:
si non crop_replace:
crop_path = abspath (chemin,'crop_' +nom de fichier)
params = {
"width": crop_width, "height": crop_height,
"crop_path": crop_path, "screen_path": screen_path}
do_crop(params)
si miniature:
si pas thumbnail_replace:
thumbnail_path = abspath (chemin,'thumbnail_' +nom de fichier)
params = {
'largeur': thumbnail_width, 'height': thumbnail_height,
"thumbnail_path": thumbnail_path, "crop_path": crop_path}
do_thumbnail (params)
return screen_path, crop_path, thumbnail_path
si _ _ nom_ _ = = " _ _ principal___":
"'
Exigence:
Installer NodeJS
Utiliser le gestionnaire de paquets de Node installer phantomjs: npm-g installer phantomjs
installez selenium (dans votre virtualenv, si vous utilisez)
installer imageMagick
ajouter phantomjs au chemin du système (sur windows)
"'
url = '/q/how-can-i-take-a-screenshot-image-of-a-website-using-python-25463/"http://i.imgur.com/A54lvMG.png?1"> pleine page Web écran
image coupée de l'écran capturé
vignette d'une image coupée
Je ne peux pas commenter la réponse d'ars, mais j'ai en fait code de Roland Tapken en cours d'exécution en utilisant QtWebkit et cela fonctionne assez bien.
voulait juste confirmer que ce que Roland poste sur son blog fonctionne très bien sur Ubuntu. Notre version de production a fini par ne pas utiliser ce qu'il a écrit, mais nous utilisons les fixations PyQt/QtWebKit avec beaucoup de succès.
peut faire en utilisant le sélénium
from selenium import webdriver
DRIVER = 'chromedriver'
driver = webdriver.Chrome(DRIVER)
driver.get('https://www.spotify.com')
screenshot = driver.save_screenshot('my_screenshot.png')
driver.quit()
https://sites.google.com/a/chromium.org/chromedriver/getting-started
vous ne mentionnez pas l'environnement dans lequel vous évoluez, ce qui fait une grande différence car il n'y a pas de navigateur Web Python pur capable de rendre HTML.
mais si vous utilisez un Mac, j'ai utilisé webkit2png avec un grand succès. Si pas, comme d'autres l'ont souligné, il ya beaucoup d'options.
essayez ceci..
#!/usr/bin/env python
import gtk.gdk
import time
import random
while 1 :
# generate a random time between 120 and 300 sec
random_time = random.randrange(120,300)
# wait between 120 and 300 seconds (or between 2 and 5 minutes)
print "Next picture in: %.2f minutes" % (float(random_time) / 60)
time.sleep(random_time)
w = gtk.gdk.get_default_root_window()
sz = w.get_size()
print "The size of the window is %d x %d" % sz
pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,sz[0],sz[1])
pb = pb.get_from_drawable(w,w.get_colormap(),0,0,0,0,sz[0],sz[1])
ts = time.time()
filename = "screenshot"
filename += str(ts)
filename += ".png"
if (pb != None):
pb.save(filename,"png")
print "Screenshot saved to "+filename
else:
print "Unable to get the screenshot."