今天要介绍的这个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识别技术这么棒,主要图片足够清晰,表格和文字分分钟导出来,可是如果是要抓网页的话,挺折腾人的。
这个包的作者设计思路也是很简单粗暴,能拍照解决的事情,干嘛要跟人家程序员相爱相杀。
往期案例数据请移步本人GitHub: https://github.com/ljtyduyu/DataWarehouse/tree/master/File