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.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…