在开发中,有这样一个需求,就是分享某个网页内容到微博上,需要将网页截图下来,当微博配图发上去。phantomjs刚好可以满足这个需求。
phantomjs地址: https://github.com/ariya/phantomjs/
ubuntu中安装phantomjs:
sudo apt-get install phantomjs
新建一个js文件 github.js:
var page = require('webpage').create(); page.open('http://github.com/', function () { page.render('github.png'); phantom.exit(); });
然后运行:
phantomjs github.js
传递参数给js文件:
//用phantom库,将html页面保存为图片 // 参数1 为网页完整的url地址 参数2 为图片保存的完整路径 var page = require('webpage').create(); var args = require('system').args; args.forEach(function(arg, i) { if (i==1){ address = arg; } else if(i==2){ dest_filename = arg; } }); page.settings.userAgent = 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25'; //page.customHeaders = {'Referer': 'localhost'}; page.open(address, function () { page.render(dest_filename); phantom.exit(); }); console.log(dest_filename);
可以通过python来调用phantomjs:
def timeout_command(command, timeout): """call shell-command and either return its output or kill it if it doesn't normally exit within timeout seconds and return None""" cmd = command start = datetime.datetime.now() process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) while process.poll() is None: time.sleep(0.2) now = datetime.datetime.now() if (now - start).seconds> timeout: try: os.kill(process.pid, signal.SIGKILL) os.waitpid(-1, os.WNOHANG) except: pass return '' return process.stdout.readlines() ''' 将页面保存为图片 ''' def html2jpg(url): filename = '%s.jpg' % time.time() imgdir = '/tmp/screenshots/' if not os.path.isdir(imgdir): os.makedirs(imgdir) filepath = os.path.join(imgdir, filename) jspath = os.path.join(os.path.dirname(__file__), 'html2jpg.js') cmd = 'phantomjs %s "%s" %s' % (jspath, url, filepath) ret = timeout_command(cmd, timeout=5) if not ret: return None ret = ret[0].strip() if not str(ret) == str(filepath): return None img_url = '/tmp/screenshots/%s' % filename return img_url
如果运行 phantomjs 命令出现类似 X Server打开失败的错误,将phantomjs升级到最新版本就好了。
解决中文字体问题:apt-get install xfonts-wqy
知乎用的另一个库 wkhtmltojpg
http://www.zhihu.com/question/21455769
python有个类似的库:
https://github.com/jeanphix/Ghost.py
不过我试了一下,好像有些问题,还不太稳定和成熟。