当前位置: 首页 > java >正文

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

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

在这里插入图片描述

以下是一个适合初学者的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-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并调用本函数

http://www.xdnf.cn/news/14769.html

相关文章:

  • 多种方法实现golang中实现对http的响应内容生成图片
  • Ubuntu20.04运DS-5
  • Lua 安装使用教程
  • docker-compose快速搭建redis集群
  • 容器基础5-Helm 与 K8s 的关系
  • 配置tcp的https协议证书
  • (第三篇)HMTL+CSS+JS-新手小白循序渐进案例入门
  • 【字节跳动】数据挖掘面试题0003:有一个文件,每一行是一个数字,如何用 MapReduce 进行排序和求每个用户每个页面停留时间
  • 《P4145 上帝造题的七分钟 2 / 花神游历各国》
  • Google Maps 安装使用教程
  • 客服机器人知识库怎么搭?智能客服机器人3种方案深度对比(含零售落地案例)
  • 【Linux】U-boot常用命令总结
  • 从UI设计到数字孪生实战部署:构建智慧农业的智能灌溉系统
  • 数学建模_图论
  • 桥岛隧大型工程 3D 可视化监测平台
  • 分布式定时任务:xxl-job
  • 洛谷刷题6
  • 拐点的可导性的图像区别
  • AlpineLinux安装部署zabbix
  • 【分明集合】特征函数、关系与运算
  • SpringBoot计时一次请求耗时
  • 应急响应类题练习——玄机第四章 windows实战-emlog
  • [创业之路-458]:企业经营层 - 蓝海战略 - 重构价值曲线、整合产业要素、创造新需求
  • Leetcode力扣解题记录--第49题(map)
  • [Python] -基础篇8-Python中的注释与代码风格PEP8指南
  • mac重复文件清理,摄影师同款清理方案
  • poi设置word表格边框
  • 修改Spatial-MLLM项目,使其专注于无人机航拍视频的空间理解
  • Flink Savepoints 总结
  • 一文详解Modbus协议原理、技术细节及软件辅助调试