網(wǎng)頁全截圖實現(xiàn)

前言

使用Python的urllib以及urllib2只能獲取到靜態(tài)的網(wǎng)頁,對于一整張網(wǎng)頁進行截圖就不是很容易了。今天湊巧看到了PhantomJS。于是對于整張網(wǎng)頁進行截圖保存再也不是一件困難的事情了。

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來編譯解釋執(zhí)行JavaScript代碼此迅。任何你可以在基于webkit瀏覽器 做的事情,它都能做到。它不僅是個隱形的瀏覽器,提供了諸如CSS選擇器、支持Web標準、DOM操作众弓、JSON滨达、HTML5竹握、Canvas、SVG等充边, 同時也提供了處理文件I/O的操作,從而使你可以向操作系統(tǒng)讀寫文件等。PhantomJS的用處可謂非常廣泛,諸如前端無界面自動化測試(需要結(jié)合 Jasmin)、網(wǎng)絡監(jiān)測、網(wǎng)頁截屏等。

環(huán)境搭建

下載解析器phantomjs

官網(wǎng)地址為:http://phantomjs.org/
截止到2017年2月28日20:14:11為止最新版本為V2.1。下載完成之后解壓一下,將Bin目錄下的phantomjs.exe放到Python的安裝目錄的Scripts文件夾內(nèi)即可。

然后是selenium

關于selenium的安裝和驅(qū)動的配置,可以參照下面的這個鏈接:
http://blog.csdn.net/marksinoberg/article/details/53610401

至此福也,Windows上的Phatomjs對于Python的環(huán)境就算是搭建好了现喳。

基本語法

下面根據(jù)官網(wǎng)上給的例子灸促,先來做幾個小測試轿偎,熟悉一下語法英遭。

helloworld

將下面的代碼保存為example.js即可多律。

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

運行方式,在命令行下執(zhí)行

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的圖片拓巧。

使用命令行參數(shù)

其實只需要加上對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部分的測試基本上就算是完成了。

結(jié)合Python

其實不用Python來調(diào)用也是可以的,使用批命令的方式也會很妥當,但是很多時候動態(tài)的解析起來,使用Python還是比較爽的,所以接下來就簡單的使用Python做下測試。

簡易版

先寫好一個example.js腳本,內(nèi)容如下:

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 內(nèi)容如下:

# coding: utf8

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

注意這兩個腳本應該在同級目錄下,然后運行一下:

python example.py

獲取到的結(jié)果圖如下:


example.png

稍難一點點

修改js中的腳本來實現(xiàn)網(wǎng)址和文件名的方式總歸是不妥的酣溃,下面使用命令行傳參的方式來解決這一個小問題碘饼。

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

運行一下,可以得到下面的截圖。


長截圖

題外話

起初争拐,我想做的是一個動態(tài)解析QQ音樂搜索結(jié)果绑雄,轉(zhuǎn)成對外可用的JSON接口的,但是發(fā)現(xiàn)QQ音樂網(wǎng)頁內(nèi)容是JS動態(tài)生成的,而且會根據(jù)songurl不同發(fā)生頁面重定向,至于怎么實現(xiàn)的吐根,我就不得而知了膜楷〗嗡總之俩由,不好辦碘梢。

今天看完了Phantomjs,就又試了一下,發(fā)現(xiàn)有些可以,有些仍然是不行(重定向那塊仍舊是不行)。

下面貼出我的代碼塊,有興趣的不妨加以改進。

# coding: utf8

from selenium import webdriver
driver = webdriver.PhantomJS()
# 獲取要搜索的歌曲名稱。這里因為在Window的CMD中輸入中文,故做了編碼轉(zhuǎn)換
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代碼,轉(zhuǎn)成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格式,通過查找文件內(nèi)容,可以發(fā)現(xiàn)下面的兩種songurl
# http://y.qq.com/#type=song&id=3328967  這樣的不行啊
# http://ws.stream.qqmusic.qq.com/TK60b992e09aa466f130adfe8becbb9b083f.mp3?fromtag=0 這樣的倒還是可以

給大家看一下我成功獲取到的一首歌曲的樣例嘉竟。

  • 首先輸入歌曲名稱


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


    生成的歌曲相關的JSON文件
  • 播放結(jié)果


    歌曲播放效果

總結(jié)

最后來回顧一下慕购,Phantomjs真的是很強大啊殿如。感覺對它的挖掘還是很淺顯烤送,唯一遺憾的就是沒能搞定QQ音樂重定向的那個坑叶沛。

今天Python就當是打了個醬油吧溉箕,其實用批命令腳本會更爽但指。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末入热,一起剝皮案震驚了整個濱河市郑气,隨后出現(xiàn)的幾起案子讳侨,更是在濱河造成了極大的恐慌勇婴,老刑警劉巖橱脸,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靖秩,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事〉虐” “怎么了董济?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我刷袍,道長雷酪,這世上最難降的妖魔是什么省骂? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任兰吟,我火速辦了婚禮遵湖,結(jié)果婚禮上迁沫,老公的妹妹穿的比我還像新娘藐吮。我一直安慰自己泥从,他們只是感情好祈餐,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布鳍徽。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遗座。 梳的紋絲不亂的頭發(fā)上懊烤,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天浸遗,我揣著相機與錄音察净,去河邊找鬼。 笑死们拙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的定躏。 我是一名探鬼主播借宵,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疆虚?” 一聲冷哼從身側(cè)響起儡遮,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嘉冒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體礼饱,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡摧找,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了擦剑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖献丑,靈堂內(nèi)的尸體忽然破棺而出安吁,到底是詐尸還是另有隱情妇智,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響霞掺,放射性物質(zhì)發(fā)生泄漏菩彬。R本人自食惡果不足惜耙旦,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望复颈。 院中可真熱鬧获黔,春花似錦、人聲如沸在验。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腋舌。三九已至盏触,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間块饺,已是汗流浹背赞辩。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留授艰,地道東北人辨嗽。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像想诅,于是被迫代替她去往敵國和親召庞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容