這種自帶黑科技的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:

github.com/ljtyduyu/Dat


推薦閱讀:

Windows截屏方法有哪些?
MacBook在Windows系統下的鍵盤截屏如何操作?
截圖的解析度取決於屏幕的解析度嗎?

TAG:R编程语言 | 截屏 | 网页抓取 |