使用rvest递归爬取Subway门店地址时URL重复拼接问题排查
解决Subway门店地址爬取的URL重复拼接问题
你的核心问题是手动拼接URL时没处理相对路径的层级关系,递归过程中重复叠加路径,导致生成https://restaurants.subway.com/austria/austria/bu这类错误链接。
解决方案:用绝对URL转换函数替代手动拼接
用httr包的url_absolute()函数可以自动把页面里的相对路径转换成正确的绝对URL,彻底避免手动拼接的错误。
修正后的完整代码
library(dplyr) library(rvest) library(httr) # 用于url_absolute函数 subway_base <- "https://restaurants.subway.com" addressParser <- function(url) { # 读取页面并获取所有目录链接的相对路径 links <- read_html(url) %>% html_elements(".Directory-listLink") %>% html_attr("href") # 将相对路径转换为绝对URL,避免重复拼接 absolute_links <- url_absolute(links, url) # 没有目录链接时,说明进入单门店页面,提取地址 if (length(absolute_links) == 0) { read_html(url) %>% html_element("#address") %>% html_text2() } else { # 递归遍历所有子链接,收集地址 unlist(lapply(absolute_links, addressParser)) } } # 启动爬取 addresses <- addressParser(subway_base) head(addresses)
关键调整说明
- 替换URL拼接逻辑:
url_absolute(links, url)会根据当前页面URL自动解析相对路径,生成唯一正确的绝对URL,彻底解决路径重复问题,不用再手动拼接。 - 修正门店地址提取:原代码在无目录链接时错误用空的
link变量解析页面,现在改为用当前传入的url读取页面并提取地址。 - 移除无效判断:原代码中针对
index.html的判断完全多余,url_absolute会自动处理初始页面的相对路径。 - 简化结果扁平化:用
unlist替代c(..., recursive=TRUE),更简洁地把递归返回的列表转成地址向量。
内容的提问来源于stack exchange,提问作者Dawon Kim
相关产品推荐
相关产品推荐

