习惯使用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-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并调用本函数