两种网页爬取方法结果数量不符,如何对齐数据并处理缺失值?
爬取数据量不一致问题排查与合并方案
一、数据量差异原因分析
- 爬取对象不匹配: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
相关产品推荐
相关产品推荐

