R语言网络爬虫(rvest和Rselenium)

以前一直以为 网络爬虫 是高大上的, 涉及到网页知识/编程代码/正则...等等一系列想想就头疼的物件儿,一次偶然的机会看到了rvest(向 hadley 大师傅献上最真诚的膝盖),一股如厕后的畅快感油然而生,原来爬数也可以 谈笑间,樯橹灰飞烟灭...废话不多说,请看大屏幕

注,有任何建议或疑问,请加 QQ: 1595218767 ,共同探讨学习
如R/python代码编程作图等方面需要帮忙,欢迎来店咨询 之恒科技, 挥动热情的小爪爪期待你哦

rvest

1. 安装

install.package('rvest')
# 想获取最新版,可以github安装
# install.packages("devtools")
devtools::install_github("hadley/rvest")

2. 基本架构及参数

2.1 网页内容读取

info1 <- read_html(url/pageSource)

2.2 节点解析

html_node(x,css/xpath) / html_nodes(x,css/xpath)
如果要解析的节点只有 一 个: html_node(x,css/xpath)
如果要解析的节点 有 多 个: html_nodes(x,css/xpath)


nodes1

2.3 html_node 之 css VS xpath

2.3.1 CSS选择器参考手册

CSS选择器参考手册传送门

2.3.2 xpath参考手册

xpath参考手册传送门
xpath使用总结传送门
在Chrome浏览器中,通过右击所需要查看的元素,单击“检查”,在开发者模式中,通过右击被蓝色覆盖(即被选中)的部分,单击Copy,单击Copy Xpath,即可得到Xpath

2.4 目标获取

2.4.1 html_text()
text1
read_html() %>% html_node(css='p.blog-summary') %>% html_text()
[1] 摘要:
[2] 本文简单介绍循环神经网络RNN的发展过程,....  

介于 p 节点 之间的 非html 语法的文本都会被提取

2.4.2 html_attr()
attr1
read_html() %>% html_node(css='span.name') %>% html_attr('href')
[1] '/u/3283d485c98a'

3. 爬虫案例

3.1 功能性讲解

3.1.1 html_nodes

如果想获取下图中 被选中的信息 则

node-src

上图目标value信息包含在 a class='title' /a 下,可以通过
如果class='title name',可以用 html_nodes('a.title.name')

web1 %>% html_nodes(css='a.title') %>% html_text()
node-res
3.1.2 html_attr

如果想获取下图中 被选中的信息 则


attr-src

可以通过下面语句来实现

web1 %>% html_nodes(css='a.title') %>% html_attr('href')
attr-res
3.1.3 html_table
library(magrittr)
Library(rvest)
url1 <- 'https://amjiuzi.github.io/2017/08/13/ggradar/'
read_html(url1) %>% html_table() %>% extract2(3) #提取第3张表
        type price price2 allowance YouHao
1     bought 4.122  4.109     4.139  4.122
2 considered 4.109  4.108     4.133  4.109
3 NoInterest 4.126  4.125     4.107  4.126

3.2. 案例分享

rvest包抓取招聘信息实例

Rselenium

Rselenium较rvest复杂,涉及rvest暂无法实现的动态抓取时可以配合rvest使用

Rselenium使用手册

1. 安装

1.1 安装JDK,配置环境变量

1.2 下载selenium-server-standalone-xxx.jar(windows os)

linux or mac os 请自行查阅安装配置 selenium server的方法

1.3 浏览器支持

firefox + geckoDriver
chrome + chromeDriver

切记,将Driver解压文件放至 firefox/chrome安装目录下(与 xx.exe同一文件夹就行)

这里有一个安装使用的简单教程 利用RSelenium抓取动态页面, 感谢[火车嘟嘟嘟]的无私贡献!

2. 基本架构及参数

2.1.启动 selenium server

java -jar xxx/selenium-server-standalone-xxx.jar

2.2.模拟启动浏览器

library(RSelenium)
remDr <- remoteDriver(remoteServerAddr='localhost',port=4444L,
                      browserName='chrome')
remDr$open(silent = TRUE)
Url='https://movie.douban.com/tag/#/'
remDr$navigate(url)

2.3.信息抓取

element1 <- remDr$findElements(using = 'css','') # html_node(css='')
element1 <- remDr$findElements(using = 'xpath','') # html_node(xpath='')
element1$getElementText() # html_text()
element1$getElementAttribute('href') # html_text()

2.4.事件模拟

element1 <- remDr$findElement(using = "xpath", "/html/body/div[3]/div[2]/div[2]")
element1$clickElement() # 单击事件
element1$sendKeysToElement(list('R cran')) # 填充文本
element1$sendKeysToElement(list('R cran',key ='enter')) # 填充文本并点击确定

2.5.模拟关闭浏览器

remDr$close() # 关闭浏览器

3. 动态抓取案例

3.1. 通过比较本页页码和下页页码判断是否到了最后一页

user0 <- c()
rev0 <- c()
html0 <- c()
while (page.previous != page.current) {
  user1 <- unlist(lapply(remDr$findElements('css','a.user'),function(x) x$getElementText()[[1]]))
  rev1 <- remDr$findElements('xpath',"//*[@class='reviewText stacked']/span")
  html1 <- lapply(rev.info,function(x){x$getElementAttribute('outerHTML')[[1]]})
  
  user0    <- append(user0,user1)
  rev0    <- append(rev0,rev1)
  html0  <- append(html0,html1)
  
  page.previous <- remDr$findElement('css','em.current')$getElementText()[[1]] %>% as.numeric()
  next.btn <- remDr$findElement('css','a.next_page')
  next.btn$clickElement()
  Sys.sleep(3)
  page.current <- remDr$findElement('css','em.current')$getElementText()[[1]] %>% as.numeric()
}

3.2. 通过直接寻找页面最底部来破解异步加载

library(RSelenium)
library(rvest)
for (i in 1:5) {
  pagedown <- remDr$findElement('css','body')
  pagedown$sendKeysToElement(list(key='end'))
  Sys.sleep(3)
  page1 <- remDr$getPageSource()[[1]]
  info1 <- read_html(page1) %>% html_nodes() 

  # ...
  Sys.sleep(3)
}

3.3. 通过点击"加载更多"来破解异步加载

more1
i=0
while (i <= 10000) {
  xxxxxx
  i = i+1
}

Rselenium 和 rvest之间的衔接

xxxx

crawl之后的文本处理(stringr包)

library(stringr)
lapply(bas_info1[,3],
        function(x){Sys.sleep(2);
          read_html(x)%>%html_nodes(css="div.rating_self.clearfix")%>%
                     html_text() %>% str_trim() %>% # trim掉前后空格
                     str_replace_all('    ','')%>% # 替换夹杂在文本中的空格
               })

更多stringr的使用信息请参考
传送门

usful img2wd OCR

推荐阅读更多精彩内容

  • 洞见SELENIUM自动化测试 写在最前面:目前自动化测试并不属于新鲜的事物,或者说自动化测试的各种方法论已经层出...
    立师兄Linty阅读 4,780评论 3 45
  • 从零开始学习rvest网络爬虫抓数据-Stone.Hou 大神 Hadley rvest in GitHub参考資...
    一筐荚果阅读 6,376评论 0 19
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 18,458评论 1 40
  • 古语有云:“志不立,天下无可成之事”。纵观古今中外,凡是有所成就之人,无不是胸怀大志之人。既然我不想生无所成,那么...
    金来阅读 172评论 0 2
  • ~~蜜蜂从一朵花飞到另一朵,只汲取花蜜中的精华和芳香,一点都不会打扰到花儿本身,然后继续飞到另一朵花中,停在那里畅...
    lovekrishina阅读 123评论 0 0