爬取豆瓣网上关于《大唐荣耀》的讨论帖

上半年有两部古装剧火了:《大唐荣耀》(以下简称大唐),《三生三世十里桃花》(以下简称三生)。这两部剧我都看过,^_^。《大唐》个人觉得还是演的不错,但是《三生》就呵呵哒了。当然,《三生》我只是断断续续看了一点,这样评价可能太武断。好吧,那就看看网友是如何评价这两部电视剧的。我在豆瓣上找了二者的评分,发现到目前(2017-06-02)为止,《大唐》的分数是6.9,比之前的要低,可能是《大唐2》的口碑不如《大唐1》所造成的。《三生》的分数是6.4,这可比之前高多了,有没有水军那就母鸡啦。从分数上来看,《大唐》显然是略胜《三生》的。

接下来利用Hadley大神开发的rvest包,在豆瓣网上抓取网友们对《大唐》的讨论帖。

1. 加载包

1
2
3
4
library(rvest)
library(stringr)
library(dplyr)
library(progress)

2. 抓取网页的信息

1
2
webpage1 <- "https://movie.douban.com/subject/24827545/discussion/?start=0&sort_by=time"
html_session(webpage1)
1
2
3
4
#> <session> https://movie.douban.com/subject/24827545/discussion/?start=0&sort_by=time
#> Status: 200
#> Type: text/html; charset=utf-8
#> Size: 29647

可以看到,网页的编码为utf-8。

3. 抓取讨论帖信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 对第2页进行抓取
webs <- "https://movie.douban.com/subject/24827545/discussion/?start=20&sort_by=time"
web_content <- read_html(webs, encoding = "UTF-8")
titles <- web_content %>%
# 这里css = "td:nth-child(1)"表明帖子名称存在于表格之中,td表示table data(表格的列)
# nth-child(1)表示第一列,tr:nth-child(9)表示第9行
html_nodes(css = "td:nth-child(1)") %>%
html_text() %>%
str_replace_all(pattern = "[[:space:]]", replacement = "")
# 对所有帖子进行抓取
webSpyder_datang <- function(page) {
# 网址
baseUrl <- "https://movie.douban.com/subject/24827545/discussion/?start="
web <- str_c(baseUrl, 20*(page - 1), "&sort_by=time")
# 抓取贴名
titles <- web_content %>%
html_nodes(css = "td:nth-child(1)") %>%
html_text() %>%
str_replace_all(pattern = "[[:space:]]", replacement = "")
titles <- titles[!(titles %in% c("一刻", "豆瓣摄影", "最近更新/热门话题"))]
# 抓取发帖人
authors <- web_content %>%
html_nodes(css = "td:nth-child(2)") %>%
html_text() %>%
str_replace_all(pattern = "[[:space:]]", replacement = "")
authors <- authors[authors != "作者"]
# 抓取回应数
responses <- web_content %>%
html_nodes(css = "td:nth-child(3)") %>%
html_text() %>%
str_replace_all(pattern = "[[:space:]]", replacement = "")
responses <- responses[responses != "回应" ]
# 抓取更新时间
update_time <- web_content %>%
html_nodes(css = "td:nth-child(4)") %>%
html_text()
update_time <- update_time[update_time != "更新时间"]
data.frame(titles = titles, authors = authors,
responses = responses, update_time = update_time,
stringsAsFactors = FALSE)
}
# 循环抓取
pb <- progress_bar$new(
format = " progress [:bar] :percent in :elapsed",
total = 21, clear = FALSE) # 加入进度条
datang <- vector(mode = "list", length = 21L)
for (i in seq_along(datang)) {
tryCatch(
{datang[[i]] <- webSpyder_datang(i)},
error = function(e){cat("ERROR :",conditionMessage(e),"\n")})
pb$tick()
Sys.sleep(0.5) # 增加了Sys.sleep(seconds)函数,让每一步循环都暂停一段时间。
}
str(datang, max.level = 1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#> List of 21
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
#> $ :'data.frame': 20 obs. of 4 variables:
1
2
datang_douban <- purrr::map_df(datang, rbind)
head(datang_douban, 20)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#> titles authors
#> 1 真不懂这剧也能打7分是怎么打出来的,说这部剧怎么...[图] 夏至未
#> 2 大唐荣耀2 加油站
#> 3 【剧情讨论】请点进来帮忙解惑一下,防止剧透,标... 观鱼
#> 4 豆瓣之耻,80集的裹脚布 小爱的爸
#> 5 [第37集]相怜相念倍相亲,一生一代一双人 宇皇宙帝
#> 6 [第55集]55集李倓戴上着面具微红的眼睛,好心疼 agean潇
#> 7 说是拿去重修,修了什么? 绦生
#> 8 大唐旧版本 情谊丶莫相弃
#> 9 说到大唐荣耀你们先想到什么 氵
#> 10 这个剧有90集??!! 芝加鸽
#> 11 这部剧应该叫《打死我也不说》 牙
#> 12 看这部剧就像大便黏连 乱室佳人
#> 13 看了这部剧真心感觉挺好 轮回
#> 14 老嫌人家是玛丽苏傻白甜,真来个腹黑的,又受不了 狄云
#> 15 广平王眼神里的戏 曲奇饼
#> 16 不觉得片头曲和片尾曲都很好听吗? crystalgazer
#> 17 low瑞又作死 akino
#> 18 [第33集]大boss 或许未来很美丽
#> 19 大唐毒药啊 未央、
#> 20 为什么这部剧要叫大唐荣耀? 醉剑踏红尘
#> responses update_time
#> 1 11 2017-04-04 14:10
#> 2 1 2017-04-04 12:48
#> 3 1 2017-04-01 17:14
#> 4 89 2017-04-01 01:23
#> 5 7 2017-03-27 11:43
#> 6 2 2017-03-26 19:43
#> 7 2 2017-03-26 14:30
#> 8 2017-03-23 22:44
#> 9 6 2017-03-23 14:14
#> 10 34 2017-03-23 11:38
#> 11 25 2017-03-23 11:07
#> 12 14 2017-03-23 11:05
#> 13 2 2017-03-23 10:47
#> 14 12 2017-03-23 10:37
#> 15 13 2017-03-23 10:22
#> 16 16 2017-03-23 10:19
#> 17 12 2017-03-23 10:15
#> 18 2017-03-22 22:33
#> 19 2017-03-21 15:49
#> 20 28 2017-03-21 10:16