求教如下代码:
install.packages("rvest")
library(dplyr)
library(rvest)
web<-read_html("https://book.douban.com/top250?icn=index-book250-all",encoding="UTF-8")
positions<-web %>%
html_nodes("#content a") %>%
html_text()
代码没有错误啊,网址也正常,就是R语言跑如上代码要导致系统溢出。
求教各位大神
代码来源于如下:
##运用SelectorGadget插件快速定位
###安装
首先安装SelectorGadget插件,点击<https://cran.r-project.org/web/packages/rvest/vignettes/selectorgadget.html> 中的Installation,SelectorGadget链接。或<http://selectorgadget.com/> Chrome 扩展。
###使用
点击插件后,在网页最下面会启动对话框,同时会有highlight(黄色)框框随鼠标滑动,当点击需要提取的信息时,选择框会变为绿色,SelectorGadget对话框将产生minimal CSS 选择语句。同时匹配语句的元素也会变黄,当再次点击黄色元素时,选择器变为红色,表示排除所选元素。当点击未标黄元素时,表示增加相应的元素,SelectorGadget对话框会随选择元素而发生变化。点击XPath时,会自动根据选择元素自动转换为xpath语法。
##rvest爬取数据
以爬取豆瓣数据为例:
```{r}
#查看书的信息
install.packages("rvest")
library(dplyr)
library(rvest)
web<-read_html("https://book.douban.com/top250?icn=index-book250-all",encoding="UTF-8")
positions<-web %>%
html_nodes("#content a") %>%
html_text()
```
#字符串清理
#去掉多余的空格,“\n”等信息
to_remove <- paste(c("\n","^\\s+|\\s+$"),collapse = "|")
position <- gsub(to_remove,"",positions)
iconv(position,"UTF-8","gb2312")
```{r}
#查看书的题目
position<-web %>%
html_nodes(".pl2 a") %>%
html_text()
#查看encod编码类型
library(stringi)
stri_enc_detect(position)
#转换编码类型
position<-iconv(position,"UTF-8","gb2312")
```
```{r}
#字符串清理
#去掉多余的空格,“\n”等信息
to_remove <- paste(c("\n","^\\s+|\\s+$"),collapse = "|")
position <- gsub(to_remove,"",position)
```
第一行是加载Rvest包。第二行是用“read_html函数读取网页信息(类似Rcurl里的getURL),在这个函数里只需写清楚网址和编码(一般就是UTF-8)即可第三行是获取节点信息。用%>%符号进行层级划分。web就是之前存储网页信息的变量,所以我们从这里开始,然后html_nodes()函数获取网页里的相应节点。在下面代码里我简单的重现了原网页里的一个层级结构。可以看到,实际上我们要爬取的信息在25个class属性为pl的<p>标签里的文本。
<p class=pl>
[清] 曹雪芹 著 / 人民文学出版社 / 1996-12 / 59.70元
</p>
而对于这样的结构,在htmlnodes()函数里的写法就是简单的"p.pl",其中“.”表示class属性的值,如果是id属性则用“#”,如果大家学过CSS选择器就很好理解了,是完全一致的。
最后我们用html_text()函数表示获取文本信息,否则返回的是整个<p>标签。总体上用以下一行代码就可以实现:
```{r,eval=FALSE, include=TRUE}
position<-web %>%
html_nodes("p.pl") %>%
html_text()
```
比较与XML获取节点的方法(如下行代码),其实二者是异曲同工的,只不过将“/”分隔换为了“%>%”,同时个别写法有些许调整。
```{r, eval=FALSE, include=TRUE}
node<-getNodeSet(pagetree, "//p[@class='pl']/text()")
```
最终如果我们打印出这个变量的内容,就会发现和上篇文章中的爬取内容是一致的。
Rvest这个包的说明文档里给出了一些其他例子:
```{r}
ateam <- read_html("http://www.boxofficemojo.com/movies/?id=ateam.htm")
#两行代码分别获取了ateam这个网页里<center>标签里<td>的全部内容和<center>标签里<font>的全部内容
ateam %>% html_nodes("center") %>% html_nodes("td")
ateam %>% html_nodes("center") %>% html_nodes("font")
#官方例子中还给出了获取特定序位的html标签的方法,用到了magrittr包里的extract2函数;以下两行代码都可以获得该网页中第一个<table>标签(由extract2(1)或`[[`(1)获取)中的所有<img>标签里的内容。
library(magrittr)
ateam %>% html_nodes("table") %>% extract2(1) %>% html_nodes("img")
ateam %>% html_nodes("table") %>% `[[`(1) %>% html_nodes("img")
#同理我们也可以获得网页里前两个<table>标签储存的所有<img>标签里的内容。
ateam %>% html_nodes("table") %>% `[`(1:2) %>% html_nodes("img")
ateam %>% html_nodes("table") %>% extract(1:2) %>% html_nodes("img")
```