全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
1946 0
2017-05-08
求教如下代码:
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")
```


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群