習慣使用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并調用本函數