爬虫爬出来的数据不全_“简单粗暴”的R语言爬虫·其二

c803e9d55004a32a4c7f38e407f166c0.png

继续我们简单的爬虫教程,在上期文章的结尾留下了一个问题,我们对于某些网站的数据,采用Rvest包中的函数却爬取不了。那么现在就来解决这个问题,R语言能解决这个问题的包有Rselenium和Rwebdriver,两个包的用法都比较相识,下面主要介绍Rwebdriver,网上对于Rselenium的教程应该比较多罒ω罒。在正式介绍Rwebdriver这个包之前,我们先来认识一下为什么我们不能爬取那些特别的网页和使用Rwebdriver之前的环境设置。


Rvest包能爬取的网页为静态网页,故而言之对那些“动态”的网页就无能为力,“动态”网页就是诸如使用了ajax异步加载技术,让网页能实现实时的更新网页数据,且更新的数据并不会真正嵌入到网页的源代码中,所以对“动态”网页下载源代码后再提取数据是行不通的。而我们的解决方法就是通过调用Selenium Server来模拟浏览器环境,在这之前我们需要设置java环境和selenium以及浏览器驱动的下载。下面的连接有具体的教程,我就不多叙述了,如果有问题的话,我们可以互相交流一下:

使用Rselenium和Rwebdriver的前期准备​blog.csdn.net

如果安装上面的步骤,设置好Java环境,安装好selenium插件以及对于版本的浏览器驱动,就可以对大部分日常网页的数据“为所欲为”了。

一、Rselenium和Rwebdriver包的安装

Rselenium包可以从镜像中直接下载,而Rwebdriver则需要从github上下载并且需要用到devtools包。

#安装Rselenium包
install.packages("Rselenium")
#安装Rwebdriver包
library(devtools)   
install_github(repo= "Rwebdriver", username = "crubba")

二、启用selenium

在R中加载完Rwebdriver包或者Rselenium包之后,我们首先要做的是启动selenium,原本是要在cmd中输入命令:

java -Dwebdriver.chrome.driver="D:Seleniumchromedriver.exe" -jar D:Seleniumselenium-server-standalone-3.4.0.jar

其中后面的chromedriver.exe和selenium-server-standalone-3.4.0.jar具体的目录要根据实际填写。但是我们的R语言自从更新之后,就有了可以直接在R中执行该启动命令

14084926c6c080d85d0cc7268bea5f3e.png

若我们在R中的Terminal输入命令后如上述的信息显示,则证明我们已经成功启用了selenium了。

三、启用网页

在启用selenium之后,我们就可以在R中使用相关的命令,打开浏览器并且访问目标的网页。完整的代码如下:

library(Rwebdriver)
#打开谷歌浏览器
start_session(root = 'http://localhost:4444/wd/hub/',browser = 'chrome')
#访问目标网页---LOL英雄信息网站
url = "http://lol.qq.com/web201310/info-heros.shtml"
post.url(url)

能够成功打开浏览器会出现下面的信息提示:

2a1ef8df03723c48710c3829445fc7f7.png

之后使用的post.url(url)就能访问对应的网页:

47aa2c67efb168b887d02cd9fcb17468.png

当我们成功打开目标网页的时候,我们就已经相当于控制了网页的内容,我们可以通过代码实现对网页数据的爬取,网页的点击,网页的跳转等一系列的操作,那么剩下的内容就让我们看看如何使用简单的命令去爬取数据。

四、爬取数据

我们以爬取LOL网站上的英雄名称信息为例,在控制网页之后,我们就可以用对付普通网页的方法来处理了,简单来说就是使用Rvest,那么下面就展示一下简单的代码:

library(rvest)
name = page_source()%>%read_html(encoding = 'gb2312')%>%html_nodes('li a p')%>%html_text()

4790c50d4e1900b91a7c4f2d493f3373.png

所以得出的结论就是Rwebdriver或者Rselenium和rvest两者结合,就能解决动态网页数据爬取的问题。

可能有朋友会认为上面Rselenium的Java环境设置和安装步骤比较麻烦,的确,当初安装的时候也花了很长时间。如果我们遇到一些表格数据,它所在的网页是动态网页,那么此处建议可以用rdom包。该包采用调用的plantomjs无头浏览器,专治各种wed端js动态脚本的隐藏数据。当然我们也需要在网站下载plantomjs无头浏览器,之后将其添加到环境变量中,比如下载的文件的路径是:C:Program Filesphantomjs-2.1.1-windowsbin,则我们需要在环境变量Path添加上对应的路径。

b109853edaeb7456eaab71d405ba4d90.png

之后我们就可以在R语言中按照rdom包,但是该包没有在CRAN中,需要从github中下载:

#检测系统路径中是否存在phantomjs浏览器
stopifnot(Sys.which("phantomjs") != "")
#下载rdom包
devtools::install_github("cpsievert/rdom")

比如我们爬取LOL选手数据,网页中数据包含在表格,如下:

b900d7fd14c0b15430332fa4d7ab213b.png
library(rdom)
library(dplyr)
library(XML)
url = 'https://www.wanplus.com/lol/playerstats'
#设置header为F,不然中文读取有问题[汗]
table <- rdom(url) %>% readHTMLTable(header = F)

d519b0fe25a2ddcb63f2efcaace9bba6.png

rdom的包我也是刚刚接触,对其理解比较浅,所以以后有机会再跟大家分享,或者有大神也可以介绍就非常感激了。

总的来说,我们就用Rselenium、Rwebdriver、rdom就可以解决网页异步结构等问题,所以希望文章能够帮助大家。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值