在命令行或使用Python从网站上截取屏幕截图

10
我将从这个页面中获取屏幕截图: http://books.google.de/books?id=gikDAAAAMBAJ&pg=PA1&img=1&w=2500 或保存它输出的图像。
但我找不到方法。 用wget / curl会出现“不可用错误”,使用其他工具如webkit2png / wkhtmltoimage / wkhtmltopng也是如此。
是否有一种干净的方法可以使用Python或命令行完成?
最好的问候!

我相信这个问题在另一个帖子中已经得到了回答?(https://dev59.com/ZXVD5IYBdhLWcg3wJIIK) - user856358
据我所了解,他们不会从网页中截取屏幕截图,只会从打开的窗口中截取。但我的计划是在不打开URL的情况下完成。需要保存大约1000张图片,仅涵盖一些书籍。 - danbruegge
3个回答

15
你可以使用 ghost.py 如果你喜欢。 https://github.com/jeanphix/Ghost.py 这里是一个如何使用它的例子。
from ghost import Ghost
ghost = Ghost(wait_timeout=4)
ghost.open('http://www.google.com')
ghost.capture_to('screen_shot.png')

最后一行代码将图像保存在当前目录中。

希望这有所帮助。


4
不错。看起来真的很好,但我不想安装Qt. :/ - danbruegge

8

我在一个无头的Centos虚拟机上,尝试截取Ghost的屏幕截图时遇到了困难。对我来说,SeleniumPhantomJS是可行的解决方案:

from selenium import webdriver
br = webdriver.PhantomJS()
br.get('http://www.stackoverflow.com')
br.save_screenshot('screenshot.png')
br.quit

当我运行以下代码时出现了这个错误:Traceback (most recent call last): File "C:\bunker\Lib\site-packages\custom_selenium.py", line 2, in <module> br = webdriver.PhantomJS() File "C:\bunker\Lib\site-packages\selenium\webdriver\phantomjs\webdriver.py", line 49, in __init__ service_args=service_args,log_path=service_log_path) TypeError: __init__() got an unexpected keyword argument 'log_path' - Ashish Gupta
嗯,不太确定,但我想知道如果你编辑webdriver.py的__init__函数并删除log_path参数会发生什么。 - billrichards

6
有时需要额外的http头,例如User-Agent才能使下载工作正常。在Python 2.7中,你可以这样做:
import urllib2
request = urllib2.Request(
    r'http://books.google.de/books?id=gikDAAAAMBAJ&pg=PA1&img=1&w=2500',
    headers={'User-Agent':'Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 firefox/2.0.0.11'})
page = urllib2.urlopen(request)

with open('somefile.png','wb') as f:
    f.write(page.read())

或者您可以查看wget或curl中添加HTTP头的参数。


1
但它不会生成捕获网站的图像。该图像将是损坏的。 - Mahadeva
@SarvagyaPant 我运行了这个脚本并验证了下载的非损坏图像。这只花费了我不到一分钟的时间。在提出未经证实的声明之前,请您至少付出最低限度的努力。 - tdelaney
只有当“url”是“直接链接到图像”时,才会生成正确的图像。对于其他基于HTML的网页,这种方法不起作用。此外,如果保证URL是图像,则可以直接使用“urllib.urlretrieve”。 - Mahadeva
它适用于任何单一资源,例如图像、网页、mp3、pdf等等... 它不会跟随链接或构建组合网页,但这不是用户想要的。他向我们展示了一个图像的url,并说他想要该图像的“屏幕截图”。但“屏幕截图”只是图像文件本身。有多种下载网络内容的方法 - 我的例子是一个完全正常接受的方式。 - tdelaney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接