以前一直以为 网络爬虫 是高大上的, 涉及到网页知识/编程代码/正则...等等一系列想想就头疼的物件儿,一次偶然的机会看到了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)
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()
read_html() %>% html_node(css='p.blog-summary') %>% html_text()
[1] 摘要:
[2] 本文简单介绍循环神经网络RNN的发展过程,....
介于 p 节点 之间的 非html 语法的文本都会被提取
2.4.2 html_attr()
read_html() %>% html_node(css='span.name') %>% html_attr('href')
[1] '/u/3283d485c98a'
3. 爬虫案例
3.1 功能性讲解
3.1.1 html_nodes
如果想获取下图中 被选中的信息 则
上图目标value信息包含在 a class='title' /a 下,可以通过
如果class='title name',可以用 html_nodes('a.title.name')
web1 %>% html_nodes(css='a.title') %>% html_text()
3.1.2 html_attr
如果想获取下图中 被选中的信息 则
可以通过下面语句来实现
web1 %>% html_nodes(css='a.title') %>% html_attr('href')
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