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

两种网页爬取方法结果数量不符,如何对齐数据并处理缺失值?

爬取数据量不一致问题排查与合并方案

一、数据量差异原因分析

  • 爬取对象不匹配:df_1是从列表页(前10页)提取每条记录的名称和地址,按列表条目计数;而df_2是从详情页提取LatLng标记的坐标,若单条详情页包含多个坐标(比如一个地点有多个点位),就会导致坐标数量多于列表记录数。
  • URL生成与爬取逻辑脱节:df_2的temp生成了56个URL(part2为0-55),但循环仅爬取前10个,且提取的是页面中所有LatLng标记,和列表页的单条记录没有一一对应关系,自然数量不匹配。
  • 选择器匹配差异:df_1中.title a和.marker的数量可能在部分页面不匹配(比如某页标题数和地址数不一致),导致总记录数为90;而df_2提取坐标不受列表条目限制,数量独立。
  • 异常处理的隐性影响:df_2使用tryCatch跳过错误页面,但未过滤空结果,可能混入无效或重复的坐标记录,进一步扩大数量差。

二、修正方法与合并步骤

步骤1:修改列表页爬取逻辑,关联详情页URL

先调整爬取名称地址的代码,同时获取每条记录对应的详情页链接,确保后续能精准匹配坐标:

library(tidyverse)
library(rvest)

# 定义爬取单页信息的函数,新增详情页URL字段
get_info <- function(page_n) {
  cat("Scraping page ", page_n, "\n")
  
  page_url <- paste0("https://www.mywebsite.com", page_n, "?extension")
  page <- read_html(page_url)
  
  tibble(
    title = page %>% html_elements(".title a") %>% html_text2(),
    address = page %>% html_elements(".marker") %>% html_text2(),
    detail_url = page %>% html_elements(".title a") %>% html_attr("href") %>% 
      paste0("https://www.mywebsite.com", .), # 补全相对URL为绝对路径
    page = page_n
  )
}

# 爬取前10页数据
df_1 <- map_dfr(1:10, get_info)

# 为每条记录生成唯一ID
df_1 <- df_1 %>% mutate(id = row_number())

步骤2:从详情页提取对应经纬度

基于详情页URL批量提取坐标,确保每条列表记录对应唯一的坐标(无坐标则填充NA):

# 定义提取单条详情页坐标的函数
get_latlong <- function(detail_url) {
  tryCatch({
    page <- read_html(detail_url)
    # 提取包含LatLng的文本行
    lat_long_text <- page %>% html_nodes("head") %>% html_text() %>% strsplit("\\n") %>% unlist()
    lat_long_line <- grep("LatLng", lat_long_text, value = TRUE)
    
    if(length(lat_long_line) == 0) {
      return(tibble(long = NA, lat = NA))
    }
    
    # 解析坐标(适配LatLng(经度, 纬度)格式)
    coords <- str_match(lat_long_line, "LatLng\\((\\d+\\.\\d+),\\s*(\\d+\\.\\d+)\\)") %>% 
      as_tibble() %>% 
      select(long = V2, lat = V3) %>% 
      mutate(across(c(long, lat), as.numeric))
    
    # 若单页有多条坐标,默认取第一条(可根据需求调整)
    coords %>% slice(1)
  }, error = function(e) {
    return(tibble(long = NA, lat = NA))
  })
}

# 批量提取所有详情页的坐标
df_latlong <- df_1 %>% 
  mutate(latlong = map(detail_url, get_latlong)) %>% 
  unnest(latlong)

步骤3:生成最终合并表格

整理字段得到符合要求的结果:

# 选择并重命名字段,生成最终表格
final_df <- df_latlong %>% 
  select(id, name = title, address, long, lat)

# 查看结果示例
head(final_df)

最终表格会保持90条记录,缺失经纬度的记录自动填充NA,完全匹配需求格式。

内容的提问来源于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 09:33:21