如何为两个爬虫结果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
相关产品推荐
相关产品推荐

