习惯使用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.pswp.cn/pingmian/87593.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87593.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/87593.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何决定idea项目中使用的是哪个版本的jdk?是idea中配置决定的?还是maven中配置决定的

✅ IDEA 项目中使用哪个 JDK&#xff0c;是由以下几部分共同决定的&#xff1a; 阶段决定因素举例项目编译&#xff08;编译器&#xff09;IDEA 设置的 Project SDK 和模块 SDKProject Structure → Project / Modules 中配置的 JDKMaven 构建Maven 使用的 JDK&#xff08;即 …

Docker拉取bladex 、 sentinel-dashboard

docker pull bladex/sentinel-dashboard 是用于从 Docker Hub 拉取 Alibaba Cloud Sentinel Dashboard 镜像的命令&#xff0c;默认会拉取最新版本。以下是详细的操作步骤及注意事项&#xff1a; 操作步骤 1. 拉取镜像 &#xff1a;在终端输入 docker pull bladex/sentinel-…

从零开始理解 JavaScript 中的 `window.parent`、`top` 和 `self`

从零开始理解 JavaScript 中的 window.parent、top 和 self 在 JavaScript 开发中&#xff0c;window 对象是浏览器环境中最重要的全局对象之一。它不仅代表了浏览器窗口本身&#xff0c;还提供了对窗口层级关系的访问能力。对于处理嵌套框架&#xff08;iframe&#xff09;或…

vue3引入海康监控视频组件并实现非分屏需求一个页面同时预览多个监控视频;

海康监控视频非分屏需求&#xff0c;一个页面引用多个视频组件; js文件位置index.html 引入js文件//根据自己路径引入哈<script src"static/haiKangWeb3.0/jquery-1.7.1.min.js"></script><script type"text/javascript" id"videonode…

Policy Gradient【强化学习的数学原理】

目录 policy 与表格方式的区别&#xff1a; metric to define optimal policies 1. weighted averge 2. the average reward 问题&#xff1a; 梯度计算 如何理解policy-gradient&#xff1f; policy gradient与表格方式(value based)的区别&#xff1a; policy 通过参…

【深圳大学机器学习】实验一:PCA算法

实验目的 1、实现PCA算法的人脸重构&#xff0c;即用20,40,60,80,...,160个投影来重构图像的效果。 2、实现PCA算法的人脸识别&#xff0c;给出不少于三个人脸数据库上 10,20,30,...,160维的人脸识别识别率&#xff0c;并打印出识别率变化曲线图。 3、用PCA用来进行人脸图像…

编程中的英语

case this are mixed case version case在这里表示大小写&#xff1f;为什么case可以表示大小写的含义&#xff1f; “case”在这里的含义 在句子“This are mixed case version”中&#xff0c;“case”确实表示“大小写”&#xff0c;用于描述字母的形式&#xff08;大写字母…

LabVIEW开发关节轴承试验机

LabVIEW通过NI硬件&#xff08;CompactRIO 实时控制器、FPGA 模块等&#xff09;与模块化软件设计的结合&#xff0c;实现试验参数采集、多工况控制、数据存储的并行处理&#xff0c;体现LabVIEW 在工业自动化中对多任务并发场景的高效支持能力。 ​ 应用场景 关节轴承试验机…

【Linux庖丁解牛】— 动静态库的制作和使用!

1. 什么是库库是写好的现有的&#xff0c;成熟的&#xff0c;可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能 每个⼈的代码都从零开始&#xff0c;因此库的存在意义⾮同寻常。 本质上来说库是⼀种可执⾏代码的⼆进制形式&#xff0c;可以被操作系统…

Hadoop集群启动 (ZooKeeper、HDFS、YARN、Hbase)

一、启动ZooKeeper集群 sh /opt/modules/zookeeper-3.4.14/bin/zkServer.sh start[hadoopcentos01 ~]$ sh /opt/modules/zookeeper-3.4.14/bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /opt/modules/zookeeper-3.4.14/bin/../conf/zoo.cfg Startin…

React Hooks全面解析:从基础到高级的实用指南

React Hooks全面解析&#xff1a;从基础到高级的实用指南 React Hooks自2018年16.8版本引入以来&#xff0c;彻底改变了React组件的开发方式。** Hooks使函数组件获得了与类组件同等的表达能力&#xff0c;同时简化了代码结构&#xff0c;提升了可维护性**。本文将系统介绍Rea…

LINUX75 LAMP

LAMP 环境 yum NetworkManager systemctl status firewalld setenforce 0 Last login: Fri Jul 4 19:21:47 2025 from 192.168.235.1 [rootweb ~]# cd /usr/local/apache2/conf/ [rootweb conf]# ls extra httpd.conf httpd.conf.bak magic mime.types original [root…

cloudflare配合github搭建免费开源影视LibreTV一个独享视频网站 详细教程

一、项目简介 LibreTV 是一个开源的 IPTV/影视聚合前端项目&#xff0c;支持 M3U 播放列表、EPG 电子节目单等。它本身是纯前端项目&#xff0c;非常适合用 GitHub Pages Cloudflare 免费托管。 二、准备工作 GitHub 账号 注册并登录 GitHub Cloudflare 账号 注册并登录 …

Linux/Unix进程概念及基本操作(PID、内存布局、虚拟内存、环境变量、fork、exit、wait、exec、system)

进程 文章目录 进程I 进程基本概念1、进程和程序2、进程号和父进程号3、进程内存布局4、虚拟内存管理&#xff08;1&#xff09;程序的两种局部性&#xff08;2&#xff09;虚拟内存的规划&#xff08;3&#xff09;虚拟内存的优点 5、栈和栈帧6、命令行参数argc和argv7、环境变…

0基础学Python系列【25】 单元测试入门教程

大家好,欢迎来到Python学习的第三站!🎉 这部分会涉及一些Python的进阶技术,虽然不一定是必需的,但学会这些,你会觉得编程更得心应手。 本章要学什么? Python调试器(pdb)装饰器lambda函数代码性能分析单元测试入门 —— 今天讲这里听起来有点多?别担心,我们慢慢来,…

iOS常见内存错误码

一、经典十六进制错误码0xDEADBEEF&#xff08;EXC_BAD_ACCESS&#xff09; 含义&#xff1a;野指针访问&#xff08;访问已释放的内存地址&#xff09;。 记忆点&#xff1a;“DEAD BEEF” 可理解为 “死亡牛肉”&#xff0c;象征指针指向的内存已 “死亡”。 触发场景&#x…

CSS01:CSS的快速入门及优势

CSS快速入门 style 练习格式&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS</title><!-- 规范,<style>可以编写css代码,每一个声明最好用分号结尾语法&#xff1a;…

springsecurity5配置之后启动项目报错:authenticationManager cannot be null

目录 配置代码 报错信息 解决办法 配置代码 下面的配置为响应式的配置方式 //这个配置只是配置springboot admin的一个例子,具体的配置可能比较复杂 @EnableWebFluxSecurity public class SecurityConfig {private final AdminServerProperties adminServer;public Securi…

攻防世界-Rerverse-game

知识点 1.ida逆向 2.函数分析逆向 步骤 用Exeinfo打开&#xff0c;为32位exe文件。 方法一&#xff1a; 玩游戏通关&#xff0c;根据游戏规则&#xff0c;m1&#xff0c;n依次为1到8即可得到flag。 方法二&#xff1a; 用32位IDA打开 ctrlF搜索main&#xff0c;点击_main,…

openEuler 24.03 全流程实战:用 Ansible 5 分钟部署分布式 MinIO 高可用集群

目录 0 | 为什么要写这篇教程&#xff1f; 1 | 准备工作 1.1 控制节点手工下载 MinIO 1.2 SSH 互信&#xff08;可跳过&#xff0c;本教程已有互信&#xff09; 1.3 安装 Ansible & SELinux 依赖 2 | 项目目录 3 | Inventory hosts.ini 4 | 变量文件 group_vars/al…