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. 通过直接寻找页面最底部来破解异步加载

QQ: 1595218767

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

QQ: 1595218767

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容