WebShot 2009
昨日の夜中に突然ウェブページのSnapShotを撮るサーバが欲しくなった。SBMのサイトによくある奴。FreeBSD / Linuxでやりたいのよね。
先人の知恵を探すのだが、良い検索語がわからない。「Webnailと呼ばれているらしい」ということでGoogleさんに聞いてみたら「もしかして: Webmail」とか言われて死にたくなった。結局 "Webpage screenshot"とかで良かったよ。
んで探すと良く出てくるのがXvfb + firefoxの組み合わせ。2006年のSimpleAPIの時にみなこぞって作ってたらしく、その頃の話が出てくる。 この方法は、Firefoxを使っているので、いろいろな通知系を殺さないといけないのと、そもそもonLoadのイベントが取れないからsleepを適当にやってからScreenshot撮るってのがぜんぜんだめ。
んでもうちょっと探すと、Xvfb + QtWebKitを使った話がでてきた。これだとonLoadのイベントが取れる。
- XServer-less webpage screenshot | insecure:
- Cybso. » Blog Archive » Create screenshots of a web page using Python and QtWebKit:
試してみたら、かなり簡単に撮れて拍子抜け。PortsでXorg + Qt一式のビルドに3、4時間かかったけどな!
元コードをちょっと弄って、scrollbarを消してみた
frame = self.page.mainFrame()
# hide menu bar
frame.setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff)
frame.setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff)
縦長のScreenShotを撮るには baseSize = QSize(800, 600) # まず基準となるサイズにする self.page.setViewportSize(baseSize) # contentSizeの方が多きかったら(スクロールバーが出てたら) contentSize = self.page.mainFrame().contentsSize() if contentSize.width() > baseSize.width(): self.page.setViewportSize(contentSize)
あと僕の環境だと、Qtの画像縮小は汚ないのでPILとかを使ったほうが良い。
これの前段にSquidとか挟むべきなんだろうな。まぁなにはともあれ、やりたい事はできた