You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:48:21