使用R网页抓取:无法从目标网站获取规范表格格式CSV文件
解决R抓取Franchise Direct全球百强特许经营商表格的问题
嘿,我来帮你搞定这个网页抓取的麻烦!你现在没法从那个全球百强特许经营商页面导出规范的CSV,看了你的代码后,问题主要出在节点选择太混乱,把不同列的内容都堆到同一列里了,完全没对应上每行的结构。咱们一步步来修正:
原代码的核心问题
- 你把
Rank、Name、Industry、Country这些不同列的节点都塞进了同一个Rank数据框列,导致数据完全无序,没有行与列的对应关系 - 没有先定位表格的行结构,直接抓取零散的单元格,自然没法生成规范的表格
修正后的完整代码
我调整了节点选择逻辑,先抓表格的每一行,再从每行里精准提取对应列的内容,最后合并分页数据并导出CSV:
# 加载所需包 library(rvest) library(dplyr) # 定义分页URL模板 url_base <- "https://www.franchisedirect.com/top100globalfranchises/rankings?page=%d" # 循环处理1到5页的数据 full_data <- bind_rows(lapply(1:5, function(page_num) { # 读取页面 page <- read_html(sprintf(url_base, page_num)) # 定位表格的每一行(跳过表头行) table_rows <- page %>% html_nodes(".top500listingTable tr") %>% .[-1] # 从每行提取各列内容 row_data <- lapply(table_rows, function(row) { tibble( Rank = row %>% html_node(".top500listingTableRank") %>% html_text(trim = TRUE), Franchise_Name = row %>% html_node(".top500listingTableName") %>% html_text(trim = TRUE), Industry = row %>% html_node(".top500listingTableIndustry") %>% html_text(trim = TRUE), Country = row %>% html_node(".top500listingTableCountry") %>% html_text(trim = TRUE) # 如果还有其他需要的列,比如Year/Rank_Change,可按同样方式添加 ) }) # 绑定当前页面的所有行数据,同时加延迟避免反爬 bind_rows(row_data) %>% {Sys.sleep(1); .} })) # 导出为规范的CSV文件 write.csv(full_data, "global_top100_franchises.csv", row.names = FALSE)
关键说明
- 精准节点选择:用
table_rows <- page %>% html_nodes(".top500listingTable tr") %>% .[-1]定位表格的每一行,.[-1]是跳过第一行的表头 - 列对应提取:对每一行单独提取
Rank、Franchise_Name等列,确保每行的内容一一对应 - 反爬防护:加入
Sys.sleep(1)让程序在每页抓取后停顿1秒,避免被网站判定为爬虫而封禁IP - 数据清洗:用
html_text(trim = TRUE)去除文本前后的空格和换行符,让数据更整洁
如果后续页面结构有变化,你可以用浏览器的开发者工具(F12)重新查看元素的class名称,调整对应的html_node参数就行。
内容的提问来源于stack exchange,提问作者FaRz1 Ezpz
相关产品推荐
相关产品推荐

