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]]
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()
分别表示提取、修改和提交表单
##
## 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㎡
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')