使用R的rvest包爬取网页时,能否忽略网址数字或使用通配符?
R爬取老兵企业网站问题解决方案
问题描述
我是网页爬取新手,正在使用R语言及rvest包帮朋友爬取信息。本次项目对我来说难度较大,希望有人能提供帮助或告知是否可行。
我尝试从网址https://www.veteranownedbusiness.com/mo爬取企业名称、地址、电话及描述等信息。我先获取了所有企业名称,打算循环进入每个企业页面提取信息,但遇到的问题是:每个企业的网址中带有专属数字,例如http://www.veteranownedbusiness.com/business/32216/accel-polymers-llc。
请问能否让R忽略该数字部分,或接受该位置的任意内容,以便我通过企业名称实现循环爬取?
以下是我目前用于获取并清洗企业名称的代码:
library(rvest) library(tibble) library(stringr) vet_name_list <- "https://www.veteranownedbusiness.com/mo" HTML <- read_html(vet_name_list) biz_names_html <- html_nodes(HTML, '.top_level_listing a') biz_names <- html_text(biz_names_html) biz_names <- biz_names[biz_names != ""] biz_names_lower <- tolower(biz_names) biz_names_sym <- gsub("[][!#$&%()*,.:;<=>@^_`|~.{}]", "", biz_names_lower) biz_names_dub <- str_squish(biz_names_sym) biz_name_clean <- chartr(" ", "-", biz_names_dub)
解决方案
核心结论
不能忽略URL中的数字部分——该数字是网站识别企业的唯一标识,仅靠清洗后的企业名称无法访问到对应详情页。正确的做法是直接从列表页的a标签中提取完整的详情页链接,而非自行拼接URL。
修改后的代码
library(rvest) library(tibble) library(stringr) library(dplyr) # 列表页URL vet_name_list <- "https://www.veteranownedbusiness.com/mo" # 读取页面 HTML <- read_html(vet_name_list) # 提取所有企业的a标签节点 biz_nodes <- html_nodes(HTML, '.top_level_listing a') # 同时提取企业名称和完整详情页链接 biz_data <- tibble( name = html_text(biz_nodes), url = html_attr(biz_nodes, "href") ) %>% # 过滤空名称的条目 filter(name != "") %>% # 补全相对链接为完整URL(如果href是相对路径的话) mutate(url = ifelse(str_detect(url, "^http"), url, paste0("https://www.veteranownedbusiness.com", url))) # 循环爬取每个企业的详情信息(添加延迟避免被封) biz_details <- lapply(biz_data$url, function(link) { # 随机延迟1-3秒 Sys.sleep(runif(1, 1, 3)) # 读取详情页 detail_page <- read_html(link) # 提取地址(根据实际页面结构调整选择器) address <- html_text(html_nodes(detail_page, ".address")) %>% str_squish() # 提取电话(根据实际页面结构调整选择器) phone <- html_text(html_nodes(detail_page, ".phone")) %>% str_squish() # 提取描述(根据实际页面结构调整选择器) description <- html_text(html_nodes(detail_page, ".description")) %>% str_squish() # 返回结果 tibble( name = biz_data$name[biz_data$url == link], address = address, phone = phone, description = description ) }) # 合并所有结果 final_data <- bind_rows(biz_details) # 保存结果到CSV write.csv(final_data, "veteran_businesses_mo.csv", row.names = FALSE)
关键说明
html_attr(biz_nodes, "href"):直接获取a标签中的链接属性,这是最可靠的方式,能拿到包含数字标识的完整相对/绝对路径。- 补全相对链接:如果网站返回的是相对路径(比如
/business/32216/accel-polymers-llc),需要拼接成完整URL才能访问。 - 页面选择器调整:代码中的
.address等选择器是示例,实际需要打开详情页,通过浏览器开发者工具查看对应元素的class或ID,替换为正确的选择器。 - 添加延迟:爬取时加入随机延迟,避免短时间内请求过多被网站封禁IP。
内容的提问来源于stack exchange,提问作者Trae
相关产品推荐
相关产品推荐

