the example illustrate how ‘rvest’ package can be used for accessing data from an HTML page available on the web

library(rvest)
## Loading required package: xml2
library(tidyverse)
## ─ Attaching packages ─────────────────────── tidyverse 1.2.1 ─
## ✔ ggplot2 3.2.0     ✔ purrr   0.3.2
## ✔ tibble  2.1.3     ✔ dplyr   0.8.3
## ✔ tidyr   0.8.3     ✔ stringr 1.4.0
## ✔ readr   1.3.1     ✔ forcats 0.4.0
## ─ Conflicts ──────────────────────── tidyverse_conflicts() ─
## ✖ dplyr::filter()         masks stats::filter()
## ✖ readr::guess_encoding() masks rvest::guess_encoding()
## ✖ dplyr::lag()            masks stats::lag()
## ✖ purrr::pluck()          masks rvest::pluck()

the variable url contains a URL

url <-
    "https://www.sec.gov/Archives/edgar/data/1067983/000119312516760194/d268144d10q.htm"

read_html() used to read HTML code from page

tenqreport_html <- read_html(url)

xpath used retreive HTML code specifically for balance sheet table

balance_sheet_html <- html_nodes(tenqreport_html,
xpath='/html/body/document/type/sequence/filename/description/text/table[7]')

HTML code from the balance sheet table is obtained

balance_sheet_list <- html_table(balance_sheet_html)

Balance sheet data is save from a list into a data frame

balance_sheet_table <- balance_sheet_list[[1]]

rvest 用法简介

read_html()

读取html文档的函数,其输入可以是线上的 url,也可以是本地的 html 文件

html_nodes()

选择提取文档中指定元素的部分。可以使用 css selectors,例如 html_nodes(doc,“table tb”); 也可以使用 xpath selector,例如 html_nodes(doc,xpath = “//talbe//td”)

html_tag()

提取标签名称

html_text()

提取标签内的文本

html_attr()

提取指定属性的内容

html_attrs()

提取所有的属性名称及其内容

html_table()

解析网页数据表的数据到 R 的数据框中

html_form(), set_values(), submit_form()

分别表示提取、修改和提交表单

网页抓取步骤

提取新浪NBA新闻标题

## 
## Attaching package: 'XML'
## The following object is masked from 'package:rvest':
## 
##     xml

add url

url <- "https://sports.sina.com.cn/nba/"  

read html document

web <- read_html(url) 

提取所有的标题文本

结合 google 的插件 selectorGadget 可以为复杂的网站生成 css 选择器

title <- html_nodes(web,".layout-mb-a") %>%  html_text()

查看结果

head(title)
## [1] "神吐槽:猛龙梦之队来袭!湖人:来练练"
## [2] "人物|哈登质疑的他仍是半成品"         
## [3] "进攻影响力满分的1.47亿胖子"          
## [4] "人物|嗨翻全场!CBA来了个詹姆斯"      
## [5] "神吐槽:詹姆斯在哪都是C位"           
## [6] "天赋组合或能圆那遗憾的梦"

从赶集网上抓取二手房信息

gurl <- "http://cs.ganji.com/shazitang/ershoufang/"

get area

web1 <- read_html(gurl)
area <- html_nodes(web1,".size span:nth-child(3)") %>% html_text()
head(area)
## [1] "77.26㎡" "48㎡"    "38.0㎡"  "59㎡"    "75㎡"    "38㎡"

get size

size <- html_nodes(web1,".size span:nth-child(1)") %>% html_text()
head(size)
## [1] "3室1厅1卫" "2室1厅1卫" "1室0厅1卫" "2室1厅1卫" "3室2厅2卫" "1室0厅1卫"

get price

price <- html_nodes(web1,".num") %>% html_text()
head(price)
## [1] "68"   "60"   "44.8" "67.8" "90"   "44.8"

get floor

floor <- html_nodes(web1,"span:nth-child(7)") %>% html_text()
head(floor)
## [1] "中层(共7层)" "中层(共6层)" "共5层"       "中层(共7层)" "中层(共7层)"
## [6] "共1层"

get orientation

orientation <- html_nodes(web1,"span:nth-child(5)") %>% html_text()
head(orientation)
## [1] "南北" "南北" "南"   "南北" "南北" "南"

combine the information

df <- data.frame(size,
                 price,
                 floor,
                 orientation,
                 area)
df
##         size price        floor orientation    area
## 1  3室1厅1卫    68  中层(共7层)        南北 77.26㎡
## 2  2室1厅1卫    60  中层(共6层)        南北    48㎡
## 3  1室0厅1卫  44.8        共5层          南  38.0㎡
## 4  2室1厅1卫  67.8  中层(共7层)        南北    59㎡
## 5  3室2厅2卫    90  中层(共7层)        南北    75㎡
## 6  1室0厅1卫  44.8        共1层          南    38㎡
## 7  2室1厅1卫    66  低层(共7层)          南    58㎡
## 8  3室1厅1卫   128  低层(共8层)        南北    93㎡
## 9  1室0厅1卫    45  中层(共6层)        南北    37㎡
## 10 1室1厅1卫  53.5  高层(共6层)        南北    45㎡
## 11 3室2厅1卫   112  低层(共7层)          南   110㎡
## 12 2室1厅1卫    95  中层(共8层)        南北 73.25㎡
## 13 2室1厅1卫    66  低层(共7层)          南  58.0㎡
## 14 2室1厅1卫    95  中层(共8层)        南北  73.3㎡
## 15 2室1厅1卫    95  中层(共8层)        南北 73.25㎡
## 16 5室2厅2卫 149.8  高层(共6层)        南北   140㎡
## 17 2室1厅1卫  88.8  中层(共7层)        南北    70㎡
## 18 2室1厅1卫    76  高层(共6层)          南  69.6㎡
## 19 2室2厅1卫    62  中层(共6层)          南    66㎡
## 20 3室2厅2卫   103 中层(共28层)          南   113㎡
## 21 2室1厅1卫  59.8  中层(共6层)          南    48㎡
## 22 4室2厅2卫   399 低层(共32层)        南北   177㎡
## 23 3室2厅2卫   150 低层(共16层)          南 125.9㎡
## 24 2室2厅2卫    66        共5层          东    80㎡
## 25 2室2厅1卫  65.8        共5层          南  67.8㎡
## 26 3室2厅2卫   123 低层(共11层)        南北   146㎡
## 27 3室2厅2卫   100 低层(共40层)          南    99㎡
## 28 3室2厅2卫   108 中层(共18层)        东南   113㎡

读取豆瓣图书250的数据

index <- seq(0,250,by = 25)
index <- index[-length(index)]
for(i in index) {
  
  web <- read_html(str_c("https://book.douban.com/top250?start=",i))
  
  # 读取作者、出版社、时间、价格
  p <- html_nodes(web,"p.pl") %>% html_text()
  
  # 读取图书的名称
  name <- web %>% html_nodes(".pl2 a") %>% html_text()
  
  # 读取 rate 
  rate <- web %>% html_nodes(".rating_nums") %>% html_text()
  
  # 从 p 中提取作者名字  
  p1 <- str_split_fixed(p,"/",2)
  author <- p1[,1]
  
  #消除图书的name q中的空格
  name <-str_replace_all(name," ","")
  name <-str_replace_all(name,"\n","")
   #提取翻译者名字
  p2 <-str_split_fixed(p1[,2],"/",2)
  a <-str_detect(p2[,1],"出版")
  b <- str_detect(p2[,1],"书店")
  interpre <-p2[,1]
  interpre[a|b] <-"NA"
  #提取出版商
  p3 <-str_split_fixed(p2[,2],"/",2)
  publisher <-p3[,1]
  publisher[a] <-p2[a,1]
  publisher[b] <-p2[b,1]
  #提取出版时间
  p4 <-str_split_fixed(p3[,2],"/",2)
  publish_time <-p4[,1]
  publish_time[a]<- p3[a,1]
  publish_time[b]<- p3[b,1]
  publish_time <- str_replace(publish_time,"年","-")
  publish_time <- str_replace(publish_time,"月","-")
  #提取价格
  p5 <-str_split_fixed(p4[,2],"/",2)
  price <- p5[,1]
  price[a] <-p4[a,1]
  price[b] <-p4[b,1]
  #创建数据框存储以上信息
  book <-data.frame(name,rate,author,interpre,publisher,publish_time,price)
  
}
head(book)
##           name rate               author interpre        publisher
## 1       偷书贼  8.0 [澳] 马克斯·苏萨克   孙张静     南海出版公司 
## 2       琅琊榜  8.5                海宴        NA      朝华出版社 
## 3 舞!舞!舞!  8.3       [日] 村上春树   林少华   上海译文出版社 
## 4      子不语1  9.0                夏达        NA    新世纪出版社 
## 5     动物凶猛  8.3                王朔        NA  中国电影出版社 
## 6     浪潮之巅  9.1                吴军        NA  电子工业出版社 
##   publish_time     price
## 1      2007-8    25.00元
## 2     2007-12    49.80元
## 3      2002-6    25.00元
## 4     2009-12   RMB36.00
## 5    2004-02-    15.50元
## 6      2011-8    55.00元

流浪地球评分

URL

comments = c()
for (i in seq(0,180,20)) {
  url <- str_c("https://movie.douban.com/subject/26931786/comments?start=",i,"&limit=20&sort=new_score&status=P")
  web <- read_html(url)
  comments <- c(comments,web %>% html_nodes(".short") %>% html_text() %>% unlist())

}
comments[1:5]
## [1] "荷兰弟很好,但是最终超级英雄还沦为卖情怀的赚钱工具"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
## [2] "当哈皮看着帕克做战衣的时候,或许他想的和我们想的都一样:想你了,托尼。"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
## [3] "漫威历史最差的一部。蜘蛛历史最差的一部。"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
## [4] "当看到前30分钟的时候,我猜测这部应该没啥看点又要学上一部归来讲小屁孩欧洲旅游顺便谈恋爱最后一把鸡汤责任越大能力越大的那点破事,结果剧情就成功反转奥创纪元2.0。当看了电影前58分钟我还在怀疑Marvel 这部电影编剧强行划水,从环太平洋搬来几个怪兽模型搞个烂怂反派拍续集,然后被编剧狠狠打了脸。当看到电影提到神秘客说称自己是来自平行宇宙的超级英雄时,我还在思考会不会是为下一部新solo客串加铺垫时候,然后编剧狠狠嘲讽了平行世界脑洞。最后彩蛋,当出字幕时思考为啥尼克之前说过不要再提惊奇队长的话是什么意思时候,彩蛋解释原来是斯克鲁人。非常精彩的多次反套路出牌,Marvel 再次用这部电影证明了自己在把控故事结构和气氛高潮到了炉火纯青的境界,同期上映的那部福克斯的简直就是丢死人了!"
## [5] "特效达到了一个新的高度。片中加彩蛋双反转防不胜防,电影更加趋向理性化,将能力不可控的矛盾重新提出,与身份性合成更大的矛盾。"

分词并计算词频

library(jiebaR)
## Loading required package: jiebaRD
wk <- worker()
split1 <- segment(comments,wk)

comments_freq <- freq(split1) 
comments_freq %>% arrange(desc(freq)) %>% glimpse()
## Observations: 3,973
## Variables: 2
## $ char <chr> "的", "了", "是", "蜘蛛侠", "在", "我", "和", "也", "电影", "都", "漫威",…
## $ freq <dbl> 884, 279, 207, 124, 124, 119, 116, 111, 100, 80, 73, 70, 6…
comments_freq <- comments_freq[-(which(str_detect(comments_freq$char,"^\\d+$") == 1)),]

comments_freq <- comments_freq %>% arrange(desc(freq)) %>% .[1:300,]

绘制词云图

library(wordcloud2)

# 去掉长度为 1 的词汇
comments_freq <- comments_freq[map_lgl(comments_freq$char,function(x) nchar(x) != 1),]
wordcloud2(comments_freq,color = "random-light",size = 1,shape = 'star')