Python各种花式截图工具,截到你手软
前言:
最近,项目中遇到了一个关于实现通过给定URL,实现对网页屏幕进行截图的一个功能,前面代码中已经用python的第三方库实现了截图功能,但在上线以后出现了一些bug,所以就改bug的任务就落在了我的头上,这方面前面没有接触过,正好利用这个机会学习一下python中各种截图方法,下面就是我要介绍的一些常用截图功能的基本使用,希望可以帮到你,也可以提出文中不足的地方。
PIL和Pillow
PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用,不过只支持到Python 2.7
Pillow:是PIL的一个派生分支,但如今已经发展成为比PIL本身更具活力的图像处理库。目前最新版本是3.0.0
1、安装
在Debian/Ubuntu Linux下直接通过apt安装:
$ sudo apt-get install python-imaging
Mac和其他版本的Linux可以直接使用easy_install或pip安装,安装前需要把编译环境装好:
$ sudo easy_install PIL
Windows平台就去PIL官方网站下载exe安装包或pip
$ pip install pillow
2、实现屏幕截图
from PIL import ImageGrab
im = ImageGrab.grab()
im.save("1.png") #定义保存的路径和保存的图片格式
PyQt4
PyQt是一个创建GUI应用程序的工具包。它是Python编程语言和Qt库的成功融合。Qt库是目前最强大的库之一。PyQt是由Phil Thompson 开发。PyQt是Qt库的Python版本。PyQt3支持Qt1到Qt3。 PyQt4支持Qt4。它的首次发布也是在1998年,但是当时它叫 PyKDE,因为开始的时候SIP和PyQt没有分开。PyQt是用SIP写的。PyQt 提供 GPL版和商业版。
1、安装
windows下:
32位: http://sourceforge.net/projects/pyqt/files/PyQt4/PyQt-4.11.4/PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe
64位: http://sourceforge.net/projects/pyqt/files/PyQt4/PyQt-4.11.4/PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x64.exe
linux下:
https://www.riverbankcomputing.com/software/pyqt/download
2、实现网页截图
有些图片较多,或是页面较长的网站,截出来的图,会出现图片未加载完毕或页面截取不完整等情况,找了很多资料也没解决,如果那个小伙伴会的话,可以教一下我
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys,time
import os.path
from PyQt4 import QtGui, QtCore, QtWebKit class PageShotter(QtGui.QWidget):
def __init__(self, url, parent=None):
QtGui.QWidget.__init__(self, parent)
self.url = url def shot(self):
webView = QtWebKit.QWebView(self)
webView.load(QtCore.QUrl(self.url))
self.webPage = webView.page()
self.connect(webView, QtCore.SIGNAL("loadFinished(bool)"), self.savePage) def savePage(self, finished):
if finished:
print "开始截图!"
size = self.webPage.mainFrame().contentsSize()
print "页面宽:%d,页面高:%d" % (size.width(), size.height())
self.webPage.setViewportSize(QtCore.QSize(size.width() + 16, size.height()))
img = QtGui.QImage(size, QtGui.QImage.Format_ARGB32)
painter = QtGui.QPainter(img)
self.webPage.mainFrame().render(painter)
painter.end()
fileName = "shot.png"
if img.save(fileName):
filePath = os.path.join(os.path.dirname(__file__), fileName)
print "截图完毕:%s" % filePath
else:
print "截图失败"
else:
print "网页加载失败!"
self.close() if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
shotter = PageShotter("https://www.jd.com/")
shotter.shot()
sys.exit(app.exec_())
加强版
#!/usr/bin/python
# coding:utf-8 import sys
import os.path
import requests
import urlparse
import time sys.path.append('../')
from PyQt4 import QtGui, QtCore, QtWebKit
from PyQt4.QtNetwork import QNetworkRequest class WebStatus(object):
def __init__(self, timeout, tries):
'''
类说明:获取网页的状态码。如200表示“网页正常,可访问”
参数:timeout(s) 请求等待时间;tries 请求次数;
'''
self.__timeout = timeout
self.__tries = tries self.__headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
} def clear_url(self, url):
if not url:
return None
if ',' in url:
url = url.split(',')[0]
url = url.strip()
if url.startswith('http://') or url.startswith('https://'):
pass
else:
url = 'http://' + url
try:
parse = urlparse.urlparse(url)
url_new = parse.scheme + '://' + parse.netloc
except:
url_new = url
if url_new.endswith('.'):
url_new = url_new.rstrip('.')
return url_new def isAccessible(self, url):
'''
说明:获取网页状态码,判断该网页是否可正常访问的,200表示网页可正常访问的。
参数:url 网址;
返回:
True:状态码200,网页正常可访问;
False:网页状态码非200,或者请求异常。
'''
url = self.clear_url(url)
tries = self.__tries
status = False
r = None
while tries > 0:
try:
r = requests.get(url=url, headers=self.__headers, timeout=self.__timeout)
except:
tries -= 1
status = False
else:
if r.status_code == 200:
status = url
break
finally:
if r:
r.close()
r = None
return status def __del__(self):
pass class PageShotter(QtGui.QWidget):
def __init__(self, url, parent=None,pic_path = './pic_path'):
path = os.path.exists(pic_path)
if not path:
os.mkdir(pic_path)
self.request = QNetworkRequest()
QtGui.QWidget.__init__(self, parent)
self.url = url
self.dir_path = os.path.join(pic_path,str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + '_' + urlparse.urlparse(self.url).netloc + '.png') def shot(self):
webView = QtWebKit.QWebView(self)
self.request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0")
webView.load(QtCore.QUrl(self.url))
self.webPage = webView.page()
self.connect(webView, QtCore.SIGNAL("loadFinished(bool)"), self.savePage)
return self.dir_path def savePage(self, finished):
if finished:
size = self.webPage.mainFrame().contentsSize()
self.webPage.setViewportSize(QtCore.QSize(size.width() + 16, size.height()))
img = QtGui.QImage(size, QtGui.QImage.Format_ARGB32)
painter = QtGui.QPainter(img)
self.webPage.mainFrame().render(painter)
painter.end()
if img.save(self.dir_path):
filePath = os.path.join(os.path.dirname(__file__),self.dir_path)
#print "截图完毕:%s" % filePath
else:
print "截图失败"
else:
print "网页加载失败!"
self.close() if __name__ == "__main__":
obj1 = WebStatus(10, 2)
status = obj1.isAccessible("https://www.jd.com")
if status:
app = QtGui.QApplication(sys.argv)
shotter = PageShotter(status,pic_path = './dirpath_test')
obj = shotter.shot()
print obj
sys.exit(app.exec_())
else:
print 'Invalid URL'
pyqt4截图加强版
selenium +phantomjs
安装请参考 http://www.cnblogs.com/luxiaojun/p/6144748.html
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities dcap = dict(DesiredCapabilities.PHANTOMJS) #设置userAgent
dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0 ") obj = webdriver.PhantomJS(executable_path='C:\Python27\Scripts\phantomjs.exe',desired_capabilities=dcap) #加载网址
obj.get('http://wap.95533pc.com')#打开网址
obj.save_screenshot("1.png") #截图保存
obj.quit()
另外还有利用subprocess中的popen方法指令linux命令进行截图的方法,如 cutycapt,会在以后的文章中继续写到,同样也可以参考以下文章:
http://www.111cn.net/sys/linux/81361.htm
Python各种花式截图工具,截到你手软的更多相关文章
- python学习——截图工具编写
学习一门语言最好的方法便是实践,想要拿Python写一个截图工具,网上一搜资料果然已经很多,前辈们都已经做的很到位了.现在就一步步来学习一下: 首先学习截图整个桌面的方法,可以使用Python中的PI ...
- ubuntu自带截图工具gnome-screenshot
记得以前用windows,各种截图工具,现在用了ubuntu,一下子不知怎么截图,从网上搜索一下,ubuntu真强大! 下面是我用ubuntu自带的截图工具截的图.
- 利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)
对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...
- QQ截图工具提取
今晚关了QQ,突然想截个图,但是呢又不想打开QQ了,于是在网上搜索截图工具,下载了几个,感觉都没有QQ截图好用.索性直接百度QQ截图工具提取,看到有些网站上有提取的,里面的文件有点多,不是我中意的,突 ...
- MFC 之 截图工具
这个截图工具能实现最主要的截图功能,并保存为bmp图片. 编写环境是vs2005,使用Unicode,基于对话框. 没什么难度,直接看代码 项目名称为CutOut // CutOutDlg.h : 头 ...
- windows最简单的局部截图工具
大家写博客的时候应该经常要用截图吧!不知道大家用的都是什么截图工具. 1.最开始我只会键盘的printscreen截图,然后去电脑,附件,画图....总之很多步骤,贼麻烦. 2.然后用电脑玩qq的时候 ...
- ubuntu下超强的截图工具scrot
Scrot ,是一个命令行下使用的截图工具,支持全屏.窗口.选取.多设备.缩略图.延时,甚至可以截图完毕之后指定某程序打开截好的图片. 终端安装: sudo apt-get install s ...
- 利器推荐-Snipaste截图工具
利器推荐-Snipaste截图工具 一.引言 接触这个工具之前一直用QQ的ctrl+alt功能进行截图,但是有时候QQ没有登陆,或者没网的环境就没法使用:这时候可能会使用windows自带的截图工具, ...
- ubuntu截图工具
ubuntu截图工具 首先,我们用apt-get install 去安装一个,scrot 主要用在命令行下,它使用 imlib2 库来抓取并保存图像 sudo a ...
随机推荐
- WebStorm中Node.js项目配置教程(1)——创建项目
Node.js绝对是一个web开发的热点话题,作为web神器的WebStorm也是开发Node.js的佼佼者. 接下来就Node.js项目在WebStorm的配置操作就行详细的讲解,首先是创建项目.两 ...
- 点击按钮,通过JS代码实现复制INPUT表单,表格:
获取表单: <SCRIPT LANGUAGE="JavaScript"> function copyinput() { var input=document.getEl ...
- Linux Shell脚本入门--awk命令详解
简单使用: awk :对于文件中一行行的独处来执行操作 . awk -F :'{print $1,$4}' :使用‘:’来分割这一行,把这一行的第一第四个域打印出来 . 详细介绍: AWK命令介绍 ...
- CF:Problem 427C - Checkposts良好的沟通 Tarjan算法
tarjan算法的第一个问题 喷我的脸....手写叠式开成BOOL,我一直在找错了... #include<cstdio> #include<cstring> #include ...
- 项目管理和版本跟踪——Redmine和SVN的结合
项目管理和版本跟踪——Redmine和SVN的结合 分类: Redmine2009-06-01 10:38 565人阅读 评论(0) 收藏 举报 svn项目管理tortoisesvn数据库railsr ...
- SQL注入漏洞和SQL调优SQL注入漏洞和SQL调优
SQL注入漏洞和SQL调优 最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“'1'='1'”这 ...
- c#拷贝
话谈c#拷贝 c#中类型分为值类型和引用类型,值类型对象赋值是本身就是赋的自身的一个副本,而引用类型赋值时则赋的是指向堆上的内存,假如我们不想赋这个地址而想将对象赋过去要怎么做呢?首先要知道拷贝分为浅 ...
- usaco1.1.1Your Ride Is Here(入门题)
一下是我很久很久之前刷的题目...随便扔在这里啦.. Description 一个众所周知的事实,在每一慧星后面是一个不明飞行物UFO.这些不明飞行物时常来收集来自在地球上忠诚的支持者.不幸的是,他们 ...
- c# 窗体最小化后截图实现
我们知道,当我们需要对Control进行截图时,我们可以使用Control.DrawToBitmap()进行截图, 那么问题来了,当我们的窗体最小化了,我们还怎么截图呢? 当窗体最小化的时候,我们知道 ...
- (转)cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
学C++的时候,这几个输入函数弄的有点迷糊:这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行)转载请保留作者信息:1.cin1 ...