教材《R语言:统计分析与机器学习》薛震 孙玉林 著
2.1 网址:https://book.douban.com/top250?icn=index-book250-all,是豆瓣图书TOP250的网址,针对该网站列出的250本图书,尝试使用R中的爬虫包和字符串处理包,将这250本书的主要信息进行获取,并将获取的内容保存在数据表中。要求获取的信息至少要有书名、作者、价格、评分等信息。
完整代码加注释
library(rvest)
library(stringr)
# 初始化一个空的数据框,用于存储所有书籍信息
all_books <- data.frame()
# 循环请求多个页面
# 假设要获取前10页的数据
for (page in 1:10) {
# 构建每一页的网址
url <- paste0("https://book.douban.com/top250?start=", (page - 1) * 25)
# 发送HTTP请求并解析HTML内容
page_data <- read_html(url)
# 获取书名
book_names <- page_data %>% html_nodes("div.pl2 > a") %>% html_text()
# 获取作者和其他详细信息
detail_data <- page_data %>% html_nodes("p.pl") %>% html_text()
#获取评分
book_rating <- page_data %>% html_nodes("div.star > span.rating_nums") %>% html_text()
# 创建当前页面的数据框
page_books <- data.frame(
书籍名称 = book_names,
详细信息 = detail_data,
书籍评分 = book_rating
)
# 将当前页面的数据追加到all_books数据框中
all_books <- rbind(all_books, page_books)
}
# 打印所有书籍信息
print(all_books)
# 将数据保存到 CSV 文件
write.csv(all_books, "douban_top250_books.csv", row.names = FALSE)
# 获取当前工作目录
current_directory <- getwd()
# 检查文件是否存在
file_path <- file.path(current_directory, "douban_top250_books.csv")
if (file.exists(file_path)) {
print("文件已保存在以下位置:")
print(file_path)
} else {
print("文件不存在或保存失败。")
}
学习记录:
首先说一下本人情况,在这之前从来没有接触过R语言,其他计算机语言上课也没听讲,属于纯小白。把第一次做作业的过程分享出来,希望对其他同样是纯小白的同学有帮助。
首先把题目给chat,得到了如下代码:
library(rvest)
library(stringr)
# 定义目标网址
url <- "https://book.douban.com/top250?icn=index-book250-all"
# 发送HTTP请求并解析HTML内容
page <- read_html(url)
# 定义存储书籍信息的向量
book_names <- character()
book_authors <- character()
book_prices <- character()
book_ratings <- character()
# 提取书籍信息
for (i in 1:25) {
# 提取书名
book_name <- page %>%
html_nodes(paste("div#content h2:nth-child(", i, ") a")) %>%
html_text() %>%
str_trim()
book_names <- c(book_names, book_name)
# 提取作者
book_author <- page %>%
html_nodes(paste("div#content div:nth-child(", 3*i-1, ") .pl")) %>%
html_text() %>%
str_trim()
book_authors <- c(book_authors, book_author)
# 提取价格
book_price <- page %>%
html_nodes(paste("div#content div:nth-child(", 3*i, ") .p-price")) %>%
html_text() %>%
str_trim()
book_prices <- c(book_prices, book_price)
# 提取评分
book_rating <- page %>%
html_nodes(paste("div#content div:nth-child(", 3*i, ") .rating_nums")) %>%
html_text() %>%
str_trim()
book_ratings <- c(book_ratings, book_rating)
}
# 创建数据框
book_data <- data.frame(
Book_Name = book_names,
Author = book_authors,
Price = book_prices,
Rating = book_ratings,
stringsAsFactors = FALSE
)
# 打印数据框
print(book_data)
输出报错如下
R代码报错:Error in data.frame(Book_Name = book_names, Author = book_authors, Price = book_prices, : 参数值意味着不同的行数: 0, 51, 25。
分别打印 book_names, book_authors, book_prices。
行数不一样,而且价格是0,根本就没有获取到价格。
所以放弃使用chat,先试试课本上的参考代码,42页用电影举例的,试着把网址改变之后,发现还是无法准确获取作者和价格。
打开豆瓣网址,使用浏览器开发者工具,查看两个网页的构成。
电影是这样的
所以html_nodes("span.title")就可以提取电影名称,html_nodes("spa.rating_num")就可以获取电影评分,html_nodes("span.inq")就可以获取电影主题。
然后用浏览器开发者工具,我们看看书籍网页的构成。
我不是很懂,但是这个应该代表我们要提取的作者和价格信息在同一个变量里储存的,我没能力分别提取,就全部提取出来了。如果有人知道该怎么分别提取出来,并且愿意告诉我,那真是感激不尽。
# 获取作者和其他详细信息
detail_data <- page_data %>% html_nodes("p.pl") %>% html_text()
然后我把写好的代码给chat,询问如何获取前十页的数据,得到完整代码。
以及大家有什么值得推荐的R语言学习书籍或课程吗?