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

R语言多页面爬取问题:重复抓取第一页数据如何修复?

解决重复抓取第一页数据的问题

嘿,我懂你现在遇到的困扰——这其实是个容易忽略的小细节,咱们马上来搞定它:

问题根源

你用paste()拼接URL的时候,这个函数会自动在参数之间插入空格,导致生成的链接里page/和页码之间多了个空格,比如实际生成的是http://www.espn.com/nba/salaries/_/year/2019/page/ 1/seasontype/3。ESPN的服务器识别不了这个错误的分页参数,所以每次都返回第一页的数据,最后就出现了重复13次第一页内容的情况。

修正后的代码

我们可以用paste0()代替paste()(paste0()不会自动添加空格),或者给paste()指定sep=""参数,就能生成正确的URL了。另外我也优化了代码结构,用purrr::map_dfr替代循环+rbind的写法,效率会更高:

library(tidyverse)
library(rvest)

# 定义抓取单页数据的函数
scrape_single_page <- function(page_num) {
  # 用paste0拼接无空格的正确URL
  link <- paste0("http://www.espn.com/nba/salaries/_/year/2019/page/", page_num, "/seasontype/3")
  page <- read_html(link)
  
  name <- page %>% html_nodes("td:nth-child(2) a") %>% html_text()
  salary <- page %>% html_nodes(".oddrow td:nth-child(4), .evenrow td:nth-child(4)") %>% html_text()
  
  # 返回整洁的tibble格式
  tibble(name = name, salary = salary)
}

# 批量抓取1-13页并合并数据
salary_by_player <- map_dfr(1:13, scrape_single_page)

# 查看前几行结果验证
head(salary_by_player)

额外优化建议

  • 清理重复加载的包:你的代码里重复加载了readxl,可以删掉多余的加载语句
  • 添加请求延迟:频繁请求可能触发ESPN的反爬机制,建议在scrape_single_page函数里加一行Sys.sleep(1),每次请求后暂停1秒,降低被封禁的风险
  • 薪资格式转换:抓取到的薪资是带$和逗号的字符串,可以转换成数值方便后续分析:
    salary_by_player <- salary_by_player %>%
      mutate(salary = str_remove_all(salary, "\\$|,") %>% as.numeric())
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:12:36