如何通过rvest和purrr抓取ICObench中ICO链接的详情数据?
嘿,看来你已经迈出了爬取ICObench数据的第一步,拿到了91页的ICO名称链接,接下来要抓取每个链接背后的详情数据其实挺清晰的!我来给你一步步拆解解决方案:
第一步:先完善ICO链接的提取(确保拿到完整URL)
首先,你之前的代码应该已经能提取ICO名称,但别忘了同时抓取每个名称对应的href属性——这是详情页的相对路径,我们需要把它拼接成完整的URL才能访问详情页。这里给你补全这部分的代码:
library(rvest) library(purrr) library(dplyr) # 补全你的基础分页URL(你原来的url_base有截断,这里用完整的格式) url_base <- "https://icobench.com/icos?page=%d&filterBonus=&filterBounty=&filterTeam=&filterExpert=&filterSort=&filterCategory=all&filterRating=any&filterStatus=ended" # 生成1到91页的完整URL列表 page_urls <- sprintf(url_base, 1:91) # 爬取每一页的ICO名称和对应的详情页完整链接 ico_links <- map_dfr(page_urls, function(page_url) { # 读取单页HTML page <- read_html(page_url) # 提取名称+相对链接,再拼接成完整URL tibble( ico_name = page %>% html_elements(".ico-name a") %>% html_text(), ico_full_url = page %>% html_elements(".ico-name a") %>% html_attr("href") %>% paste0("https://icobench.com", .) ) })
第二步:编写单个详情页的爬取函数
接下来,我们需要一个函数来处理单个详情页的数据提取——把你需要的字段(比如评分、众筹金额、团队信息等)都定义好。这里给你一个示例函数,你可以根据自己的需求调整提取的字段:
# 定义抓取单个ICO详情页数据的函数 scrape_ico_details <- function(ico_url) { # 加入随机延迟(1-3秒),避免触发网站反爬机制 Sys.sleep(runif(1, 1, 3)) # 用tryCatch捕获错误,防止单个页面爬取失败导致整个程序中断 tryCatch({ page <- read_html(ico_url) # 提取你需要的字段,示例字段包括名称、评分、分类、众筹金额、团队规模 tibble( url = ico_url, ico_name = page %>% html_element(".profile-name h1") %>% html_text(), rating = page %>% html_element(".rating .value") %>% html_text() %>% as.numeric(), category = page %>% html_element(".category a") %>% html_text(), total_raised = page %>% html_element(".money .raised") %>% html_text(), team_size = page %>% html_element(".team .number") %>% html_text() %>% as.integer() ) }, error = function(e) { # 如果页面爬取失败,返回NA值的行,保证数据完整性 tibble( url = ico_url, ico_name = NA_character_, rating = NA_real_, category = NA_character_, total_raised = NA_character_, team_size = NA_integer_ ) }) }
第三步:批量遍历所有链接抓取数据
有了上面的函数,我们就可以用purrr的map_dfr来批量处理所有ICO链接,把结果自动合并成一个数据框:
# 遍历所有ICO详情页链接,抓取数据 ico_full_data <- map_dfr(ico_links$ico_full_url, scrape_ico_details) # 如果需要,可以把原始的名称数据和详情数据合并(避免重复) final_dataset <- left_join(ico_links, ico_full_data, by = c("ico_full_url" = "url", "ico_name" = "ico_name"))
一些关键注意事项
- 反爬机制:一定要加随机延迟,不要快速连续请求,否则很容易被网站封禁IP。也可以设置自定义的User-Agent来模拟浏览器请求。
- 字段调整:上面的示例字段只是参考,你可以打开ICObench的详情页,用浏览器的开发者工具(F12)查看你需要的元素选择器,替换到函数里。
- 错误处理:
tryCatch非常重要,能避免某个页面加载失败导致整个爬取任务中断,保证最终数据的完整性。
内容的提问来源于stack exchange,提问作者Doggo
相关产品推荐
相关产品推荐

