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
相关产品推荐
相关产品推荐

