R语言初学者爬虫简单模板

0 阅读3分钟

习惯使用python做爬虫的,反过来使用R语言可能有点不太习惯,正常来说R语言好不好学完全取决于你的学习背景以及任务复杂情况。对于入门学者来说,R语言使用rvest+httr组合,几行代码就能完成简单爬取(比Python的Scrapy简单得多),R语言数据处理优势明显,爬取后可直接用dplyr/tidyr清洗,小打小闹用R语言完全没问题,如果是企业级大型项目还是有限考虑python,综合成本还是python占优势。

a6.png

以下是一个适合初学者的R语言爬虫通用模板,使用rvesthttr包实现。此模板包含基本错误处理、随机User-Agent轮换和延时机制:

# 安装必要包(首次使用前运行)
# install.packages(c("rvest", "httr", "dplyr", "stringr", "xml2"))# 加载包
library(httr)
library(rvest)
library(dplyr)
library(stringr)
​
# 设置随机User-Agent列表(模拟不同浏览器)
user_agents <- c(
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15",
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0"
)
​
# ======================
# 核心爬虫函数
# ======================
simple_crawler <- function(url, 
                           css_selectors = NULL, 
                           xpath_selectors = NULL,
                           delay_sec = 1,   # 默认延时1秒防封
                           max_retry = 2) {  # 失败重试次数
  
  tryCatch({
    # 随机延时(0.5~1.5倍设定值)
    Sys.sleep(delay_sec * runif(1, 0.5, 1.5))
    
    # 随机选择User-Agent
    ua <- sample(user_agents, 1)
    
    # 发送HTTP请求(带重试机制)
    response <- NULL
    for (i in 1:max_retry) {
      response <- try(GET(url, add_headers("User-Agent" = ua)), silent = TRUE)
      if (!inherits(response, "try-error") && status_code(response) == 200) break
      Sys.sleep(2^i)  # 指数退避策略
    }
    
    # 检查请求是否成功
    if (status_code(response) != 200) {
      warning(paste("请求失败:", url, "状态码:", status_code(response)))
      return(NULL)
    }
    
    # 解析HTML内容
    page_content <- read_html(response)
    
    # 结果存储列表
    extracted_data <- list()
    
    # CSS选择器提取
    if (!is.null(css_selectors)) {
      for (name in names(css_selectors)) {
        elements <- html_elements(page_content, css = css_selectors[[name]])
        extracted_data[[name]] <- if (length(elements) > 0) {
          html_text2(elements) %>% str_trim()
        } else NA
      }
    }
    
    # XPath选择器提取
    if (!is.null(xpath_selectors)) {
      for (name in names(xpath_selectors)) {
        elements <- html_elements(page_content, xpath = xpath_selectors[[name]])
        extracted_data[[name]] <- if (length(elements) > 0) {
          html_text2(elements) %>% str_trim()
        } else NA
      }
    }
    
    # 返回数据框
    return(as.data.frame(extracted_data, stringsAsFactors = FALSE))
    
  }, error = function(e) {
    message(paste("抓取过程中出错:", e$message))
    return(NULL)
  })
}
​
# ======================
# 使用示例
# ======================
if (FALSE) {  # 将此改为TRUE运行示例
  # 目标网址(示例:豆瓣电影Top250)
  url <- "https://movie.douban.com/top250"
  
  # 定义选择器(CSS或XPath)
  selectors <- list(
    title = "span.title:nth-child(1)",  # CSS选择器
    rating = "//div[@class='star']/span[2]",  # XPath选择器
    quote = "span.inq"
  )
  
  # 执行爬取
  result <- simple_crawler(
    url = url,
    css_selectors = selectors[names(selectors) != "rating"],  # 非rating使用CSS
    xpath_selectors = selectors["rating"],  # rating使用XPath
    delay_sec = 2,   # 每次请求间隔
    max_retry = 3    # 最大重试次数
  )
  
  # 查看结果
  if (!is.null(result)) {
    print(head(result, 3))
    # 保存结果(可选)
    # write.csv(result, "douban_movies.csv", row.names = FALSE)
  }
}
​
# ======================
# 重要注意事项
# ======================
# 1. 遵守robots.txt:在目标网站根目录后加/robots.txt查看(如:https://example.com/robots.txt)
# 2. 控制请求频率:避免对服务器造成压力
# 3. 法律合规性:确保遵守网站条款和当地法律法规
# 4. 动态内容处理:此模板仅适用于静态页面,动态加载内容需用RSelenium

模板特点:

1、智能防封机制

  • 随机User-Agent轮换
  • 请求随机延时(可配置)
  • 指数退避重试策略

2、灵活选择器

  • 同时支持CSS选择器和XPath
  • 自动处理元素缺失情况(返回NA)

3、健壮性设计

  • 多层错误处理(网络错误/解析错误)
  • HTTP状态码检查
  • 空结果保护

4、易用性

  • 返回整洁数据框
  • 参数注释清晰
  • 包含完整使用示例

R语言用的人相对比较少,常见的还是python爬虫,因为起特性可能经常遇到一些问题,例如:乱码问题、动态内容、登录验证、分页爬取,分别总结了对应的处理方法,如有更多问题可以留言咨询我。

1、乱码问题:在read_html()后添加content(response, encoding = "UTF-8")

2、动态内容:使用RSelenium包处理JavaScript渲染

3、登录验证:添加set_cookies()或使用webdriver模拟登录

4、分页爬取:在循环中拼接URL并调用本函数