R语言初学者爬虫简单模板
习惯使用python做爬虫的,反过来使用R语言可能有点不太习惯,正常来说R语言好不好学完全取决于你的学习背景以及任务复杂情况。对于入门学者来说,R语言使用rvest
+httr
组合,几行代码就能完成简单爬取(比Python的Scrapy简单得多),R语言数据处理优势明显,爬取后可直接用dplyr/tidyr清洗,小打小闹用R语言完全没问题,如果是企业级大型项目还是有限考虑python,综合成本还是python占优势。
以下是一个适合初学者的R语言爬虫通用模板,使用rvest
和httr
包实现。此模板包含基本错误处理、随机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-Agentua <- sample(user_agents, 1)# 发送HTTP请求(带重试机制)response <- NULLfor (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) breakSys.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使用CSSxpath_selectors = selectors["rating"], # rating使用XPathdelay_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并调用本函数