tibble 和传统数据框:哪个更适合网页爬取的数据存储

16yun代理

概述

在网页爬取过程中,选择合适的数据存储结构至关重要。R 语言中有两种常用的数据存储结构:传统数据框(data.frame)和现代的 tibble(来自 tibble 包)。两者在性能、灵活性和兼容性方面各有优劣。

同时,百度搜索作为中国最受欢迎的搜索引擎,其关键词排名数据可以精准反映用户的搜索意图和当前的网络热点。这些关键词排名数据在舆情监控、市场调研、用户需求分析等领域中具有重要价值。例如,通过采集百度搜索前十排名的链接,可以快速了解热门话题或特定关键词的受欢迎程度,从而为决策提供数据支持。

本文将探讨传统数据框与 tibble 的差异,并通过从百度搜索获取排名前十的关键词链接为例,分析两者在网页爬取数据存储中的表现。


数据框与 tibble 的对比
属性传统数据框tibble
性能操作速度较慢,特别是大规模数据处理时表现较差。优化性能,适合大数据集的存储与处理。
灵活性不支持嵌套列表或复杂结构,列名需遵循规则。支持复杂结构,如嵌套列表,列名可以包含特殊字符。
易用性在控制台打印时输出所有数据,易导致信息过载。更友好的打印方式,仅显示前几行,提高可读性。
兼容性与 R 的基础函数完全兼容。tidyverse 套件完美集成,但可能需要额外学习成本。

实现代码:采集百度搜索前十关键词

以下代码展示了如何结合代理 IP 和多线程技术,从百度搜索中爬取排名前十的关键词链接,并将数据存储为 tibble。

library(httr)
library(rvest)
library(tibble)
library(future)
library(furrr)

# 配置爬虫代理参数 亿牛云爬虫代理加强版 www.16yun.cn
proxy_ip <- "proxy.16yun.cn" # 替换为亿牛云提供的IP
proxy_port <- 12345         # 替换为亿牛云提供的端口
proxy_user <- "用户名"       # 替换为亿牛云用户名
proxy_pass <- "密码"         # 替换为亿牛云密码

# 自定义函数:从百度搜索获取前十排名链接
fetch_baidu_links <- function(keyword) {
  # 构建百度搜索 URL
  url <- paste0("https://www.baidu.com/s?wd=", URLencode(keyword))
  
  # 配置请求头信息
  headers <- add_headers(
    "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.1 Safari/537.36",
    "Cookie" = "your_cookie_here"
  )
  
  # 配置爬虫代理信息
  proxy <- use_proxy(
    url = paste0("http://", proxy_ip, ":", proxy_port),
    username = proxy_user,
    password = proxy_pass
  )
  
  # 发送请求
  response <- GET(url, headers, proxy)
  
  # 检查响应状态并解析 HTML
  if (status_code(response) == 200) {
    page <- read_html(content(response, "text", encoding = "UTF-8"))
    
    # 提取搜索结果链接
    links <- page %>%
      html_nodes(".t a") %>%  # 根据百度搜索的HTML结构定位
      html_attr("href") %>%
      head(10)  # 获取前10个链接
    
    return(links)
  } else {
    warning("Failed to fetch search results for keyword: ", keyword)
    return(NULL)
  }
}

# 目标关键词列表
keywords <- c("R语言爬虫", "数据分析工具", "Python与R比较")

# 使用多线程技术并行爬取关键词排名
plan(multisession)  # 设置多线程计划
results <- future_map(keywords, fetch_baidu_links)

# 转换为 tibble
data <- tibble(
  keyword = keywords,
  top_links = results
)

# 输出结果
print(data)

# 保存结果为 CSV
write.csv(data, "baidu_top_links.csv", row.names = FALSE)

总结

百度搜索的关键词排名数据能帮助开发者快速捕捉网络热点并获得用户行为洞察。在网页爬取数据存储方面,传统数据框和 tibble 各具优势:

  • 小型项目:传统数据框更适合简单的、无需复杂存储结构的任务。
  • 大型项目:对于包含嵌套数据或需要处理大规模数据集的爬取任务,tibble 是更优的选择。

通过结合代理 IP 和多线程技术,以上代码提供了一种高效采集百度搜索排名数据的解决方案,并展示了 tibble 的灵活性和性能优势。

# 加载所需的包 library(rvest) library(dplyr) douban_book_250 <- data.frame() for(i in 0:9){ url <- paste('https://book.douban.com/top250?start=',25*i,sep = "") # 爬多少篇,在这改就行 books_num <- 25 # 读取网页内容 webpage <- read_html(url) # 使用CSS选择器获取<div class="pl2"><p class="pl">中的文字 title <- webpage %>% html_nodes("div.pl2") %>% html_text() %>% .[1:books_num] other_information <- webpage %>% html_nodes("p.pl") %>% html_text() %>% .[1:books_num] score <- webpage %>% html_nodes("span.rating.nums") %>% html_text() %>% .[1:books_num] # 使用gsub函数删除div_pl2p_pl中的空格换行符 title_clean <- data.frame(gsub("\\s", "", title)) other_information_clean <- gsub("\\s", "", other_information) # 使用strsplit函数对列表中的每个元素进行分割 split_list <- strsplit(other_information_clean, "/") # 因为有的书有译者,所以得删掉 split_list <- lapply(split_list, function(x) { if(length(x) == 5) { x <- x[-2] } return(x) }) # 有的好像有多的,需要去掉 split_list <- lapply(split_list, function(x) { # 福尔摩斯有两个价格 # [1] "[英]阿·柯南道尔" "丁钟华等" "群众出版社" "1981-8" # [5] "53.00元" "68.00元" if(x[1]=='[英]阿·柯南道尔'){ x <- x[-c(2,6)] } if(length(x) == 6) { # print(x) x <- x[-c(2,3)] } return(x) }) # 有的没作者 split_list <- lapply(split_list, function(x) { if(length(x) == 3) { x <- append(x, "佚名", after = 0) # print(x) } return(x) }) # 使用do.callrbind函数将结果合并为一个数据框 other_information <- do.call(rbind, split_list) douban_book <- cbind(title_clean,other_information,score) colnames(douban_book) <- c("书名", "作者", "出版社", "时间", "价格","评分“) douban_book_250 <- rbind(douban_book_250, douban_book) } View(douban_book_250) library(tidyverse) write_excel_csv(douban_book_250,"D:/douban_book_250.csv")错在哪里
最新发布
03-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值