网页全截图实现

前言

使用Python的urllib以及urllib2只能获取到静态的网页,对于一整张网页进行截图就不是很容易了。今天凑巧看到了PhantomJS。于是对于整张网页进行截图保存再也不是一件困难的事情了。

PhantomJS简介

PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast and native support for various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG.

换句话讲,也可以如下理解。

PhantomJS是一个基于webkit的JavaScript API。它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit浏览器 做的事情,它都能做到。它不仅是个隐形的浏览器,提供了诸如CSS选择器、支持Web标准、DOM操作、JSON、HTML5、Canvas、SVG等, 同时也提供了处理文件I/O的操作,从而使你可以向操作系统读写文件等。PhantomJS的用处可谓非常广泛,诸如前端无界面自动化测试(需要结合 Jasmin)、网络监测、网页截屏等。

环境搭建

下载解析器phantomjs

官网地址为:http://phantomjs.org/
截止到2017年2月28日20:14:11为止最新版本为V2.1。下载完成之后解压一下,将Bin目录下的phantomjs.exe放到Python的安装目录的Scripts文件夹内即可。

然后是selenium

关于selenium的安装和驱动的配置,可以参照下面的这个链接:
http://blog.csdn.net/marksinoberg/article/details/53610401

至此,Windows上的Phatomjs对于Python的环境就算是搭建好了。

基本语法

下面根据官网上给的例子,先来做几个小测试,熟悉一下语法。

helloworld

将下面的代码保存为example.js即可。

console.log('Hello, world!');
phantom.exit();

运行方式,在命令行下执行

phantomjs example.js

需要注意的是
<font color='red' size='4'>It is very important to call <code><font color='green' size='5'>phantom.exit()</font></code> at some point in the script, otherwise PhantomJS will not be terminated at all.</font>

截图

var page = require('webpage').create();
page.open('http://blog.csdn.net/marksinoberg', function(status) {
  console.log("Status: " + status);
  if(status === "success") {
    page.render('example.png');
  }
  phantom.exit();
});

运行完此脚本之后将在同级目录下生成一个名为example.png的图片。

使用命令行参数

其实只需要加上对system模块的引用即可。

var page = require('webpage').create(),
  system = require('system'),
  t, address;

if (system.args.length === 1) {
  console.log('Usage: loadspeed.js <some URL>');
  phantom.exit();
}

t = Date.now();
address = system.args[1];
page.open(address, function(status) {
  if (status !== 'success') {
    console.log('FAIL to load the address');
  } else {
    t = Date.now() - t;
    console.log('Loading ' + system.args[1]);
    console.log('Loading time ' + t + ' msec');
  }
  phantom.exit();
});

运行方式:

phantomjs example.js http://blog.csdn.net/marksinoberg

关于JS部分的测试基本上就算是完成了。

结合Python

其实不用Python来调用也是可以的,使用批命令的方式也会很妥当,但是很多时候动态的解析起来,使用Python还是比较爽的,所以接下来就简单的使用Python做下测试。

简易版

先写好一个example.js脚本,内容如下:

var page = require('webpage').create();
page.open('http://lib.csdn.net/experts/detail?type=11', function(status){
    console.log('Status:' + status);
    if(status === "success") {
        page.render('example.png');
    }
    phantom.exit();
});

然后写个Python的脚本,名为example.py 内容如下:

# coding: utf8

import os
os.system("phantomjs example.js")

注意这两个脚本应该在同级目录下,然后运行一下:

python example.py

获取到的结果图如下:


example.png

稍难一点点

修改js中的脚本来实现网址和文件名的方式总归是不妥的,下面使用命令行传参的方式来解决这一个小问题。

var page = require('webpage').create();
var system = require('system');
page.open(system.args[1], function(status){
    console.log('Status:' + status);
    if(status === "success") {
        page.render(system.args[2]);
    }
    phantom.exit();
});

下面是Python代码:

# coding: utf8

import os

argv1 = raw_input('The URL:\n')
argv2 = raw_input('The Saved Picture name:\n')

os.system("phantomjs screenshot.js {} {}".format(argv1, argv2))

运行一下,可以得到下面的截图。


长截图

题外话

起初,我想做的是一个动态解析QQ音乐搜索结果,转成对外可用的JSON接口的,但是发现QQ音乐网页内容是JS动态生成的,而且会根据songurl不同发生页面重定向,至于怎么实现的,我就不得而知了。总之,不好办。

今天看完了Phantomjs,就又试了一下,发现有些可以,有些仍然是不行(重定向那块仍旧是不行)。

下面贴出我的代码块,有兴趣的不妨加以改进。

# coding: utf8

from selenium import webdriver
driver = webdriver.PhantomJS()
# 获取要搜索的歌曲名称。这里因为在Window的CMD中输入中文,故做了编码转换
songname = raw_input('song name:\n').decode('gbk').encode('utf8')
import urllib
songname = urllib.quote(songname)


target_url = "https://c.y.qq.com/soso/fcgi-bin/search_cp?remoteplace=txt.yqq.song&searchid=70358775627327036&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w={}&g_tk=767270056&jsonpCallback=searchCallbacksong8831&loginUin=1064319632&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0".format(songname)
driver.get(target_url)
# 设置超时等待时间
driver.implicitly_wait(20) 
data = driver.page_source
data = data.encode('utf8')
###############################去除HTML代码,转成JSON格式
data = str(data).lstrip("<html><head></head><body><pre style=\"word-wrap: break-word; white-space: pre-wrap;\">searchCallbacksong8831(")
data = data.rstrip(")</pre></body></html>")


file = open('./search_result.json', 'w+')
file.write(data)
file.close()
driver.quit()

# data 为JSON格式,通过查找文件内容,可以发现下面的两种songurl
# http://y.qq.com/#type=song&id=3328967  这样的不行啊
# http://ws.stream.qqmusic.qq.com/TK60b992e09aa466f130adfe8becbb9b083f.mp3?fromtag=0 这样的倒还是可以

给大家看一下我成功获取到的一首歌曲的样例。

  • 首先输入歌曲名称


    歌曲名称
  • 查看生成的JSON文件


    生成的歌曲相关的JSON文件
  • 播放结果


    歌曲播放效果

总结

最后来回顾一下,Phantomjs真的是很强大啊。感觉对它的挖掘还是很浅显,唯一遗憾的就是没能搞定QQ音乐重定向的那个坑。

今天Python就当是打了个酱油吧,其实用批命令脚本会更爽。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容