这种自带黑科技的R包,请给我来一打

浏览: 1526

今天要介绍的这个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.co

image.png

image.png

由于长屏长宽比例不符合微信公众号图片上传规定,无法上传,只能给个截图,看看霸气的截长屏。

delay参数设置的抓取延时长度,这样避免有些内容还没来记得加载完成!

pdf无法上传公众号编辑器,这里就看下其中一个图片的效果吧!

以上是因为没有设置截屏范围,所以默认抓取了全屏,这里设置一下截屏参数!

webshot("http://study.163.com/", "yunketangv.png",cliprect="viewport",delay = 5)   
#只抓取当前屏幕可见范围内的网页内容

image.png

为啥抓取的那些完整的长图,只有最顶部图片是加载完毕的,后面都是只有框架和文字,没有图片显示呢,我猜这个还是因为异步加载的缘故,即便是真人操纵浏览器,浏览器也是根据实际鼠标动作或者窗口位置,实时更新当前屏幕内的内容,而那些还没有滚动到的页面位置,就只有页面框架,图片还没有触发更新动作,使用浏览器鼠标下拉动作时,我们也能明显感觉到有些图片从无到有的加载过程。

webshot("http://raindu.com/", "raindu.png",cliprect="viewport",delay = 5,zoom=1) 
webshot("http://raindu.com/", "raindu2.png",cliprect="viewport",delay = 5,zoom=2)

image.png

image.png

image.png

zoom参数设置抓取的图片缩放倍数。

webshot("http://music.163.com/", "yunyinyue.png",cliprect="viewport",delay = 5,, expand = c(10, 50, 

image.png

image.png

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

image.png

使用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

image.png

image.png

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)

image.png

image.png

虽然字体渲染没有解决好,局部图片加载未完成(可能我设置的等待时间有些短了),大框架加载出来了,webshot函数处理动态网页略微有些笨拙,但是静态网页还是很棒的。

webshot函数不仅URL地址可以批量化,后面的所有参数都支持向量化,有些边距参数可以设置为列表格式,但是要与url向量长度相等。

我是通过昨天那个rdom包项目主页顺藤摸瓜找到这个好玩的包的,rdom作者说,自己的灵感来源于webshot,这些包作者开发者这些工具真的是创意满满,以后还要什么截图工具(曾经我以为我使用的faststone截图工具是这个世界上最好用的截图工具,看来我错了o(╯□╰)o)

这个包的应用场景在哪里呢,比如说百度文库带有财富值的重要文档,豆丁网,知网的重要救急文档。一些不允许copy文字或者下载内容的网站。(没关系我不要你的内容,我对你的网页也不感兴趣,我拍个照就走,你奈我何)。

比如现在反扒很严的某些网站,也许你并不需要整个的扒下人家的网页(有难度处理也很费劲),抓取网页快照,现在OCR识别技术这么棒,主要图片足够清晰,表格和文字分分钟导出来,可是如果是要抓网页的话,挺折腾人的。

这个包的作者设计思路也是很简单粗暴,能拍照解决的事情,干嘛要跟人家程序员相爱相杀。

在线课程请点击文末原文链接:
 Hellobi Live | 9月12日 R语言可视化在商务场景中的应用 https://edu.hellobi.com/course/195 

欢迎关注数据小魔方qq交流群


推荐 2
本文由 杜雨 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册