這種自帶黑科技的R包,請給我來一打
今天要介紹的這個R包,有些特別!
它即不能做可視化,也不能用來抓數據!
它的核心功能是抓拍,對,你沒聽錯,就是抓取,和狗仔差不多!
而且專門抓拍網頁,有點兒類似於我們常說的網頁快照。
底層仍然是通過plantomjs無頭瀏覽器提供渲染支持,所以它可以解析帶有js動態腳本的非同步載入網頁。
它抓拍功能強大的什麼地步,基本是原生的瀏覽器界面清晰度(除了格式是靜態圖片之外,基本不會損失什麼像素)。
抓拍輸出的圖片像素與長寬比支持自定義、支持zoom縮放,支持png、jpeg、pdf三種主流圖片格式,支持定義窗口內元素和滾動長圖。(那種一個網頁特別長要滾到到底部的一樣不用擔心)。
支持圖片簡單修飾、尺寸調整、內存壓縮。
它的名字叫webshot,項目主頁在這裡:https://github.com/wch/webshot
。
關於包下載:
devtools::install_github("wch/webshot")
,如果出現timeout問題,請載入curl包,還不行,請切換到非教育網(不要問我怎麼知道的,原因不可描述!)
這個包底層需要使用PhantomJS
瀏覽器,所以仍然需要你提前下載,你可以到這個網站(http://phantomjs.org/)
手動下載,這個包下載之後,裡面有一個下載PhantomJS
的內建函數webshot::install_phantomjs()
,免去了你版本篩選的麻煩,非常方便!
library("webshot")
webshot包的最主要函數只有一個——webshot函數(現在的R包開發者套路都很深,一個函數一個包)默認情況下,webshot會抓取目標網址的整個網頁(無論你的網頁一屏是否能夠盛的下,即便單窗口容不下,這個函數也會默認抓取所有網頁可視內容,所以截長屏分分鐘的事兒)。
setwd("D:/R/Image/screenshot")webshot("http://study.163.com/", "yunketang.png",delay = 5) #輸出png格式截屏webshot("http://study.163.com/", "yunketang.jpeg",delay = 5) #輸出jpeg格式截屏webshot("http://study.163.com/", "yunketang.pdf",delay = 5) #輸出PDF格式截屏
由於長屏長寬比例不符合微信公眾號圖片上傳規定,無法上傳,只能給個截圖,看看霸氣的截長屏。
delay參數設置的抓取延時長度,這樣避免有些內容還沒來記得載入完成!
pdf無法上傳公眾號編輯器,這裡就看下其中一個圖片的效果吧!
以上是因為沒有設置截屏範圍,所以默認抓取了全屏,這裡設置一下截屏參數!
webshot("http://study.163.com/", "yunketangv.png",cliprect="viewport",delay = 5) #只抓取當前屏幕可見範圍內的網頁內容
為啥抓取的那些完整的長圖,只有最頂部圖片是載入完畢的,後面都是只有框架和文字,沒有圖片顯示呢,我猜這個還是因為非同步載入的緣故,即便是真人操縱瀏覽器,瀏覽器也是根據實際滑鼠動作或者窗口位置,實時更新當前屏幕內的內容,而那些還沒有滾動到的頁面位置,就只有頁面框架,圖片還沒有觸發更新動作,使用瀏覽器滑鼠下拉動作時,我們也能明顯感覺到有些圖片從無到有的載入過程。
webshot("http://raindu.com/", "raindu.png",cliprect="viewport",delay = 5,zoom=1) webshot("http://raindu.com/", "raindu2.png",cliprect="viewport",delay = 5,zoom=2)
zoom參數設置抓取的圖片縮放倍數。
webshot("http://music.163.com/", "yunyinyue.png",cliprect="viewport",delay = 5,, expand = c(10, 50, 10, 50))
expand設置圖片輸出的頁面邊距,以像素為單位,參數只需提供一個長度為4的數值型向量,分別代表top、right、bottom、left。
對比一下雲音樂原始web頁面與設置頁邊距後的圖片有什麼不同。
仔細對比會發現,使用普通截圖工具(faststone截得)截圖結果,因為是Chrome渲染,字體和布局效果更為逼真,但是清晰度不行(可能是工具限制),使用webshot截得看起來清晰度更好,但是裡面的字體渲染失真。(變成了宋體)。
webshot函數允許你輸入css表達式來選擇網頁局部進行截取:
webshot("http://study.163.com/", "yunyinyuejubu.png",selector = ".m-slide.f-pr",delay = 2) webshot("http://music.163.com/", "yunyinyuejubu.png",selector = "div#index-banner.n-ban.d-flag",delay = 2)
使用css表達式,提取出了網易雲課堂主頁,中間的滾動廣告位展示區。(廣告位沒有抓到,抓到了一個頂邊菜單欄o(╯□╰)o)
webshot還可以支持對輸出的截圖進行簡單壓縮、裁剪!
library("magrittr")url<-"http://image.baidu.com/search/detail?z=0&word=%E9%98%BF%E5%88%98&hs=0&pn=3&spn=0&di=0&pi=42852035143&tn=baiduimagedetail&is=0%2C0&ie=utf-8&oe=utf-8&cs=1160865886%2C3784169015&os=&simid=&adpicid=0&lpn=0&fm=&sme=&cg=&bdtype=-1&oriquery=&objurl=http%3A%2F%2Fh.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F00e93901213fb80e3cc67a1d3fd12f2eb83894e0.jpg&fromurl=&gsm=0&catename=pcindexhot"webshot(url=url,file ="baiduphoto.png",selector = "div.img-wrapper",delay = 2) %>% resize("50%") %>% shrink()
webshot最厲害的地方在於,它可以接受多個網址,批量抓取網頁快照。
urls<-c("http://study.163.com/smartSpec/intro.htm#/smartSpecIntro","http://study.163.com/client/download.htm","http://study.163.com/cp/introduction.htm","http://b.study.163.com/","http://www.icourse163.org/")webshot(urls, "wangyicourse.png",cliprect ="viewport",delay = 2)
雖然字體渲染沒有解決好,局部圖片載入未完成(可能我設置的等待時間有些短了),大框架載入出來了,webshot函數處理動態網頁略微有些笨拙,但是靜態網頁還是很棒的。
webshot函數不僅URL地址可以批量化,後面的所有參數都支持向量化,有些邊距參數可以設置為列表格式,但是要與url向量長度相等。
我是通過昨天那個rdom包項目主頁順藤摸瓜找到這個好玩的包的,rdom作者說,自己的靈感來源於webshot,這些包作者開發者這些工具真的是創意滿滿,以後還要什麼截圖工具(曾經我以為我使用的faststone截圖工具是這個世界上最好用的截圖工具,看來我錯了o(╯□╰)o)
這個包的應用場景在哪裡呢,比如說百度文庫帶有財富值的重要文檔,豆丁網,知網的重要救急文檔。一些不允許copy文字或者下載內容的網站。(沒關係我不要你的內容,我對你的網頁也不感興趣,我拍個照就走,你奈我何)。
比如現在反扒很嚴的某些網站,也許你並不需要整個的扒下人家的網頁(有難度處理也很費勁),抓取網頁快照,現在OCR識別技術這麼棒,主要圖片足夠清晰,表格和文字分分鐘導出來,可是如果是要抓網頁的話,挺折騰人的。
這個包的作者設計思路也是很簡單粗暴,能拍照解決的事情,幹嘛要跟人家程序員相愛相殺。
在線課程請點擊文末原文鏈接:
Hellobi Live | 9月12日 R語言可視化在商務場景中的應用
往期案例數據請移步本人GitHub:https://github.com/ljtyduyu/DataWarehouse/tree/master/File推薦閱讀:
※Windows截屏方法有哪些?
※MacBook在Windows系統下的鍵盤截屏如何操作?
※截圖的解析度取決於屏幕的解析度嗎?