私が達成したいのは、Pythonの任意のWebサイトからWebサイトのスクリーンショットを取得することです。
環境:Linux
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')
Mac にはwebkit2pngがあり、Linux+KDE ではkhtml2pngを使用できます。私は前者を試してみましたが、非常にうまく機能し、後者が使用されていると聞きました。
私は最近、クロスプラットフォームであると主張するQtWebKitに出くわしました (Qt は WebKit をライブラリに組み込んだと思います)。しかし、私はそれを試したことがないので、これ以上は言えません。
QtWebKit のリンクは、Python からアクセスする方法を示しています。少なくともサブプロセスを使用して、他のプロセスと同じことができるはずです。
arsの答えについてコメントすることはできませんが、実際にはQtWebkitを使用してRoland Tapkenのコードを実行し、非常にうまく機能しています。
Rolandが彼のブログに投稿したものがUbuntuでうまく機能することを確認したかっただけです。私たちの製品版は、彼が書いたものをまったく使用していませんでしたが、PyQt/QtWebKitバインディングを使用して大成功を収めています。
注:以前のURLは次のとおりです:http ://www.blogs.uni-osnabrueck.de/rotapken/2008/12/03/create-screenshots-of-a-web-page-using-python-and-qtwebkit/作業用コピーで更新しました。
HTML をレンダリングできる純粋な Python Web ブラウザーがないため、実行している環境については言及していません。
しかし、Mac を使用している場合、私はwebkit2pngを使用して大きな成功を収めました。そうでない場合は、他の人が指摘したように、多くのオプションがあります。
これを試して..
#!/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."