盒子
盒子
文章目录
  1. python批量打开网页
  2. python网页截图
    1. 实现方式一
    2. 实现方式二
    3. 实现方式三
  3. Javascript网页截图

批量网站截图

在批量网站处理过程中,我们时常会需要打开大量的页面,查看页面内容是否是我们需要的。这种需求下,本文就主要研究懒人的处理技巧。

python批量打开网页

本程序主要用于调用chrome浏览器,当然也可以修改源代码,支持其他浏览器,来批量打开浏览器,用户只需要查看后再关闭页面,即可实现批量网页查看的功能。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python
#coding=utf-8
import webbrowser
import re
import time
import os
path = './url.txt'
myUrlFile = open(path)
filelist = myUrlFile.readlines()

chromePath = r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
webbrowser.register('chrome', None, webbrowser.BackgroundBrowser(chromePath))
count = 0
namecount = 0
dealcount = 0
for s in filelist:
count = count + 1
if (count % 5) == 0:
keyput = raw_input('Press any key to continue:');
webbrowser.get('chrome').open_new_tab(s.strip())
myUrlFile.close()

python网页截图

上面是python打开批量网页,懒人就是要突出一个懒,我还是觉得很麻烦,于是我想实现批量给这些网页截图,然后保存成一个页面,然后直接翻页查看。
linux下面有一个工具实现了这个功能,叫做Peepingtom,这里就不详细介绍这个软件了,经过本人实测,速度不是很满意,也有可能姿势不对。
于是我就琢磨着自己写一个啊,在网上找啊找,招到了如下三个脚本的实现方式,其实也就是两种思路,效果一样,差强人意。排除时间因素,他们还是蛮不错的,但是对于批量网站这种需求,该方案还是不行啊。这里列举其代码如下,代码中留有原作者信息。

实现方式一

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import time
from selenium import webdriver
browser = webdriver.Firefox()
browser.set_window_size(1055, 800)
browser.get("http://www.yooli.com/")
browser.find_element_by_id("idClose").click()
#time.sleep(5)
browser.save_screenshot("shot.png")
browser.quit()

实现方式二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# 来源 http://www.oschina.net/code/snippet_219811_14920

import sys
import os.path
from PyQt4 import QtGui,QtCore,QtWebKit

class PageShotter(QtGui.QWidget):
def __init__(self,url,filename,parent=None):
QtGui.QWidget.__init__(self,parent)
self.url = url
self.filename = filename
self.webpage = None

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.save_page)

def save_page(self,finished):
#print finished
if finished:
print u"开始截图!"
size = self.webpage.mainFrame().contentsSize()
print u"页面宽:%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= self.filename;
if img.save(filename):
filepath = os.path.join(os.path.dirname(__file__), filename)
print u"截图完毕:%s" % filepath
else:
print u"截图失败";
else:
print u"网页加载失败!"
self.close()

if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
#shotter = PageShotter("http://www.adssfwewfdsfdsf.com")
shotter = PageShotter("http://www.youku.com/", 'shot.png')
shotter.shot()
sys.exit(app.exec_())

实现方式三

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# -*- coding: utf-8 -*-
# author: oldj <oldj.wu@gmail.com>
# blog: http://oldj.net
#
from selenium import webdriver
import time

def capture(url, save_fn="capture.png"):
browser = webdriver.Firefox() # Get local session of firefox
browser.set_window_size(1200, 900)
browser.get(url) # Load page
browser.execute_script("""
(function () {
var y = 0;
var step = 100;
window.scroll(0, 0);
function f() {
if (y < document.body.scrollHeight) {
y += step;
window.scroll(0, y);
setTimeout(f, 50);
} else {
window.scroll(0, 0);
document.title += "scroll-done";
}
}

setTimeout(f, 1000);
})();
""")


for i in xrange(30):
if "scroll-done" in browser.title:
break
time.sleep(1)
browser.save_screenshot(save_fn)
browser.close()

if __name__ == "__main__":
capture("http://www.taobao.com")

Javascript网页截图

后来我又仔细的思考了下,要实现网页截图,对页面的渲染是必不可少的,要么我们借助于webkit引擎(事实上,上面的python脚本基本原理就是那样的),但是实际测试效果不是非常好,要么我们自己写一个渲染的引擎,显然这不现实,或者说没有必要。最好的方法就是利用现有的chrome或者firefox帮助我们实现,于是我想通过JS来实现网页截图

基本原理是我们通过html2canvas将要截取的页面元素保存成canvas对象,然后通过canvas2image.js将页面保存成本地图片。测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<body>
<script src="./html2canvas.js"></script>
<script src="./canvas2image.js"></script>
<script type="text/javascript">
(function() {
window.onload = function(){
html2canvas(document.body, {
onrendered: function(canvas) {
document.body.appendChild( canvas );
var strDataURI = canvas.toDataURL();
Canvas2Image.saveAsPNG(canvas);
}
});
};
})();
</script>

<p>这里是测试内容,这里是测试内容,这里是测试内容,这里是测试内容。</p>
</body>
</html>

说明:页面中要引入那两个JS

测试代码就写到这里,很多人说这种方法不支持跨域的图片截图问题,我也没有深入去研究,毕竟我的主要用途是截取webshell页面,基本不存在跨域问题。具体实现上可能还需要使用chrome插件的方式,留待后续研究吧。