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

如何为两个爬虫结果DataFrame创建通用Merge Key以实现合并?

解决方案:添加唯一标识作为合并键

要解决两个数据框无法合并的问题,核心是给每个条目生成唯一的合并键——也就是每个记录对应的详情页URL,因为这个URL在Part A和Part B中是一一对应的。下面是具体的代码修改步骤:

1. 修改Part A代码,提取详情页URL作为合并键

在爬取title和address时,同时提取每个条目对应的详情页链接(.title a标签的href属性),作为唯一标识。如果是相对路径,需要转为绝对路径确保一致性:

# part A 修改版
library(tidyverse)
library(rvest)
library(httr)
library(XML)

# Define function to scrape 1 page
get_info <- function(page_n) {
  cat("Scraping page ", page_n, "\n")
  base_url <- "https://www.mywebsite/"
  page <- paste0(base_url, page_n, "?extension") %>% read_html
  
  # 提取详情页链接(转为绝对路径)
  detail_urls <- page %>% 
    html_elements(".title a") %>% 
    html_attr("href") %>% 
    url_absolute(base_url)
  
  tibble(
    title = page %>% html_elements(".title a") %>% html_text2(),
    address = page %>% html_elements(".marker") %>% html_text2(), # 修正原拼写adress为address
    detail_url = detail_urls, # 添加唯一合并键:详情页URL
    page = page_n
  )
}

# Apply function to pages 1:10
df_1 <- map_dfr(1:10, get_info)

# 检查结果:现在df_1包含detail_url列
dim(df_1)

这样df_1新增了detail_url列,每个条目对应唯一的详情页地址,这就是我们需要的合并键。

2. 修改Part B代码,基于df_1的detail_url爬取经纬度

不再手动构造URL列表,直接使用df_1里的detail_url来爬取对应条目的经纬度,确保每个URL和经纬度一一对应:

# part B 修改版
# 定义函数:从单个详情页URL提取经纬度
get_lat_lng <- function(url) {
  tryCatch({
    page <- read_html(url)
    head_text <- page %>% html_nodes("head") %>% html_text()
    # 匹配LatLng格式内容
    lat_long_match <- str_match(head_text, "LatLng\\(\\s*(.*?)\\s*\\);")
    if (!is.na(lat_long_match[1,2])) {
      # 拆分纬度和经度
      coords <- str_split(lat_long_match[1,2], ",") %>% unlist() %>% trimws()
      tibble(
        detail_url = url,
        latitude = as.numeric(coords[1]),
        longitude = as.numeric(coords[2])
      )
    } else {
      # 无有效经纬度时返回NA
      tibble(detail_url = url, latitude = NA, longitude = NA)
    }
  }, error = function(e) {
    # 爬取失败时返回NA
    tibble(detail_url = url, latitude = NA, longitude = NA)
  })
}

# 批量爬取df_1中所有detail_url的经纬度
df_2 <- map_dfr(df_1$detail_url, get_lat_lng)

# 检查结果:df_2的行数和df_1一致(90行),且包含detail_url作为合并键
dim(df_2)

3. 合并两个数据框

现在两个数据框都有detail_url作为共同键,直接使用inner_join保留双方都有记录的条目,或者left_join保留df_1的所有条目:

# 合并数据(保留共同记录)
merged_df <- inner_join(df_1, df_2, by = "detail_url")

# 或者保留df_1全部条目,缺失经纬度的补NA
# merged_df <- left_join(df_1, df_2, by = "detail_url")

# 查看合并结果
dim(merged_df)

关键说明

  • 原Part B手动构造URL的方式容易出现不匹配(比如URL规则和实际详情页不符),直接复用Part A的详情页URL能确保一一对应。
  • 新增的detail_url是天然的唯一标识,避免了用title/address作为合并键可能出现的重复问题(比如不同条目有相同名称/地址)。

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:36:22