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

44
demandé sur Breakthrough 2009-07-29 02:48:13

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.

9
répondu ars 2009-07-29 01:12:48

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')
41
répondu hoju 2014-09-20 21:09:43

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:

  1. Installer NodeJS
  2. utilisant le gestionnaire de paquets de Node installer phantomjs: npm -g install phantomjs
  3. Installer le sélénium (dans votre virtualenv, si vous utilisez ce)
  4. installer imageMagick
  5. 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
  • 35
    répondu Aamir Adnan 2013-08-05 21:30:57

    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.

    5
    répondu aezell 2009-07-29 04:50:30

    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

    1
    répondu Joolah 2018-05-31 03:00:54

    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.

    0
    répondu Daniel Naab 2009-07-28 23:28:08

    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."
    
    -1
    répondu Anand 2013-12-13 12:02:11