[R语言] 利用RSelenium/ Rwebdriver抓取动态页面

Posted 乔博研习社

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[R语言] 利用RSelenium/ Rwebdriver抓取动态页面相关的知识,希望对你有一定的参考价值。

前言

有关R语言爬虫的实践,主要有以下几个包:RCurl、XML、rvest、RSelenium、Rwebdriver,相比Python,R语言的爬虫实例比较少,学习R语言爬虫,可以参考《基于R语言的自动数据收集》,该书涉及的面比较广且配有案例,但有些章节讲的不够深入,仍需补充完善。

爬虫对象一般有静态页面、script页面、ajax页面,至于网页知识和相关原理暂不关注,本文主要与大家分享如何利用RSelenium抓取动态页面(JS渲染页面)。

RSelenium介绍

RSelenium作用是用R调用Selenium Server。SeleniumServer允许你在不同的浏览器上打开网址,对网页进行操作,并爬取网页元素的独立JAVA程序。所以,通过Selenium Server我们可以对网页进行操作,然后爬取操作后的数据,从而进行爬取动态页面。

基于selenium调用Rwebdriver包,便可将动态网页(ajax)处理成我们熟悉的爬虫方法,再爬取页面。

准备工作

安装系统:Win7 64

下载安装:

1.     JAVAJDK 1.8.0_101(传送门);

Selenium Server是一个JAVA程序,需要JAVA的环境,要安装jdk;

安装配置(传送门)。

2.     SeleniumServer stand-alone 3.4.0(传送门);

Selenium Server的JAVA文件;

在cmd中运行java -jar D:\R\selenium-server-standalone-3.4.0.jar

出现 ”SeleniumServer is up and running“ 表示启动成功。

3.     Chrome浏览器 60.0.3112.90 (传送门),需翻墙。

ChromeDriver 2.31(传送门);

4.     SeleniumServer调用Chrome的驱动。

把解压后的ChromeDriver.exe放在

C:\Program Files(x86)\Google\Chrome\Application,与chrome.exe放在同一个目录下面。

将C:\ProgramFiles (x86)\Google\Chrome\Application添加到环境变量PATH的路径中。

应用实例

1.     目标:在网贷之家的数据平台http://shuju.wdzj.com/中爬取近7日各个P2P平台的数据表格(成交量、平均收益率、投资人数、人均投资金额)下图红色方框的内容。



2.     爬取流程

    1>启动Selenium Server。

    通过R调用SeleniumServer并打开网页,对页面进行点击,选取相应条件。     通过RSelenium与rvest共同爬取数据。

    2>安装包

    Rwebdriver包需要调用devtools从github下载:

    devtools::install_github(repo="Rwebdriver",username="crubba")


3.    爬虫程序


library(Rwebdriver)

library(XML)

start_session(root ="http://localhost:4444/wd/hub/", browser ="chrome") 

list_url <-  "http://shuju.wdzj.com/"

post.url(url = list_url)

 

# 近7日

condition_date <-element_xpath_find("/html/body/div[3]/div[2]/div[1]/div[2]/div[2]/div[1]/ul/li[2]")

element_click(ID = condition_date, times =1, button = "left")

# 数据自选指标

shuju_diy <- element_xpath_find("/html/body/div[3]/div[2]/div[2]/div[1]/a")

element_click(ID = shuju_diy, times = 1,button = "left")

#平均借款期限(去除字段)

condition_diy_d4 <-element_xpath_find("/html/body/div[3]/div[2]/div[2]/div[2]/div[2]/ul/li[3]")

element_click(ID = condition_diy_d4, times= 1, button = "left")

#待还余额(去除字段)

condition_diy_d8 <- element_xpath_find("/html/body/div[3]/div[2]/div[2]/div[2]/div[2]/ul/li[5]")

element_click(ID = condition_diy_d8, times= 1, button = "left")

#投资人数(选入字段)

condition_diy_d1 <-element_xpath_find("/html/body/div[3]/div[2]/div[2]/div[2]/div[2]/ul/li[10]")

element_click(ID = condition_diy_d1, times= 1, button = "left")

#人均投资金额(选入字段)

condition_diy_d13 <-element_xpath_find("/html/body/div[3]/div[2]/div[2]/div[2]/div[2]/ul/li[11]")

element_click(ID = condition_diy_d13, times= 1, button = "left")

#确定

submit_diy <- element_xpath_find("//*[@id='btn-diy']")

element_click(ID = submit_diy, times = 1,button = "left")

 

pageSource <- page_source() # 保存静态页面

list_web <-htmlParse(pageSource,encoding = "UTF-8")   #中文乱码

tableNodes <-getNodeSet(list_web,"//*[@id='platTable']") #解析表格

tb <- readHTMLTable(tableNodes[[1]],header = FALSE)

names(tb) <-c('amount','incomeRate','bidderNum','avgBidMoney')

write.csv(tb,'tb.csv')

 



本文通过Xpath确定选项的位置,然后点击。在Chrome浏览器中,通过右击所需要查看的元素,单击“检查”,在开发者模式中,通过右击被蓝色覆盖(即被选中)的部分,单击Copy,单击Copy Xpath,即可得到Xpath。通过page_source()保存成静态页面,然后用XML解析,获取并保存。

结语

作为初学者,我是站在巨人肩膀前进,感谢那些乐于学习和分享的人,在你们的文章里,我学到很多,然后自己将案例重新走通,再分享。希望对初学者有一定的帮助。如果需要更加深入了解,请查看参考资料。


参考资料

[1] https://zhuanlan.zhihu.com/p/24772389

[2] https://zhuanlan.zhihu.com/p/28108329

[3] http://blog.csdn.net/abc200941410128/article/details/72511931

[4] RSelenium: Basics


以上是关于[R语言] 利用RSelenium/ Rwebdriver抓取动态页面的主要内容,如果未能解决你的问题,请参考以下文章

R语言文本处理中文分词并制作文字云

并行运行 RSelenium

异常处理RSelenium switchToFrame()错误:ElementNotVisible

使用 RSelenium 下载 pdf

使用RSelenium执行拖放操作

在 RSelenium 中完成的文档