웹 스크래핑 크롤링 봇을 설계하기 시작하면 초보자들은 금방 거대한 벽에 부딪힙니다. 원하는 정보가 첫 번째 페이지 보이지만 “1, 2, 3, 4 … 다음 페이지(Next)” 버튼을 누르며 수십/수백 개의 페이징네이션(Pagination) 구조에 걸쳐 방대한 파편으로 퍼져있기 때문입니다.
이럴 때 매 페이지마다 주소 번호를 수동으로 바꿔가며 코드를 10번, 100번 복사 붙여넣기 할 수는 없습니다. R에 내장된 강력한 문자열 결합 유틸리티 함수와 전설적인 반복문(lapply)을 영리하게 응용하여, 로봇 청소기 자율 주행 모드처럼 수십 개의 페이지를 미친 듯이 돌아다니며 데이터를 폭식(Scraping)하는 대량 자동화 크롤링 기법 플로우를 정리합니다.
1. 규칙적인 URL의 패턴 파악하고 무한 대량 생산하기
게시판이나 쇼핑몰 구매 리스트의 페이지 하단에서 고전적인 시퀀스(1, 2, 3 페이지) 버튼을 실제로 직접 마우스로 누르며, 상단 웹 브라우저의 URL 주소창 텍스트 구조가 어떻게 변하는지 매의 눈으로 관찰해야 합니다.
보통 https://example.com/books?page=1 과 같은 쿼리 형식으로 거의 99% 끝자리 숫자만 점진적으로 바뀌는 패턴을 띄게 됩니다.
library(stringr)
# 1. 절대 변하지 않고 고정되어 있는 기본 주소 뼈대(Base URL)를 준비합니다.
base_url <- "https://statisticsplaybook.com/go/soccer?page="
# 2. str_c(또는 베이스의 paste0) 결합 마법으로 1페이지부터 3페이지까지 URL 파생 주소 3개를 메모리상에 한방에 뚝딱 엮어 만들어냅니다!
urls <- str_c(base_url, 1:3)
# 결과물 스캔 확인
urls
> [1] "https://statisticsplaybook.com/go/soccer?page=1"
> [2] "https://statisticsplaybook.com/go/soccer?page=2"
> [3] "https://statisticsplaybook.com/go/soccer?page=3"
2. 나만의 1인분 단위 스크래핑 코드(함수 블록) 포장 조립하기
타겟 주소가 무한대로 양산될 준비가 되었으니, 이제 “단 1개의 페이지 주소”가 공장 레이블에 들어왔을 때 데이터를 스크랩하는 일련의 과정을 하나의 “나만의 커스텀 함수(UDF)” 구역으로 단단히 포장해 줍시다.
library(rvest)
# 나만의 크롤링 자동화 공장(Function) 모듈 선언!
my_scraping_bot <- function(target_url) {
# 💡 [필수 매너] 서버가 디도스 급 다운 방어가 되지 않도록 페이지를 넘길 때마다 달콤한 1초 휴식시간 텀
Sys.sleep(1)
# 해당 날아온 주소의 백엔드 HTML 긁어오기
web_page <- read_html(target_url)
# 미리 파악했던 선수 이름 태그 핀셋으로 도려내 끌어오기
player_names <- web_page |>
html_elements("#yw1 .inline-table a") |>
html_text()
# 빈 칸이 섞인 쓸데없는 특이 공백 쓰레기 찌꺼기는 미리 필터링 걸러냄
player_names <- player_names[player_names != ""]
# 깨끗해진 배열 결과물만 쏙 반환(Return)
return(player_names)
}
3. 대량 순환 스크랩 시작: lapply()로 자율주행 봇 출동!
드디어 대망의 마지막 합체 단계만 남았습니다. 아까 1단계에서 잔뜩 콤보로 만들어둔 urls 리스트(페이지 1~3 주소 배열)들을, 방금 만든 2단계의 크롤링 단일 처리 공장(my_scraping_bot) 투입구에 통째로 쏟아 던져 넣어 일괄 반복 기동시킬 차례입니다.
이럴 때 구식 for 반복문 보다 연산 메모리 속도가 빠르고 코드가 직관적인 진정한 프로용 lapply() 함수를 사용합니다. L(묶음 리스트 구조, urls)에 각각 뒷단 파라미터 함수(my_scraping_bot)를 Apply(강제 일괄 적용 구동) 하라는 강력한 구문입니다.
# 자율주행 스크래핑 봇, 1번부터 3번 주소로 차례대로 일괄 투하 출동!
raw_result <- lapply(urls, my_scraping_bot)
# 크롤링 결과물이 1페이지, 2페이지 덩어리별로 각각 리스트 서랍장에 나뉘어 묶음으로 반환되므로..
# unlist()를 써서 서랍장을 모조리 때려 부수고 하나의 긴 1차원 통합 벡터 배열로 쫘악- 풀어 합병해버립니다.
final_soccer_players <- unlist(raw_result)
# 최종 수집 길이나 상위 5명 데이터 파싱 관람
length(final_soccer_players)
> [1] 650
head(final_soccer_players, 5)
> [1] "손흥민" "이강인" "김민재" "황희찬" "조규성"
이 깔끔하고 강력한 플로우 아키텍처(① 패턴 URL 뭉탱이 조립하기 -> ② 단일 페이지 스크랩 처리 모델 커스텀 파라미터 짜기 -> ③ lapply로 대량 한방 밀어넣기)는 R을 이용한 크롤링의 불변하는 공식 아규먼트 구조 시스템과 같습니다. 이 스크립트 연결 논리만 완벽히 깨우친다면 수백만 단위의 방대하고 끝없는 부동산, 주식 종목, 뉴스 정보도 순식간에 내 로컬 피씨 안의 영구 소장용 무적 데이터 자본 자산으로 바뀔 것입니다!
당신이 좋아할 만한 콘텐츠
by Google Adsense