Categories: R

R에서 웹 페이지 크롤링 (rvest 패키지 활용)

안녕하세요! 요즘 데이터 분석에 대한 관심이 뜨겁죠? 저도 그 열기에 푹 빠져있는 사람 중 하나인데요. 특히 웹에 흩어져있는 다양한 정보들을 내 손안에 쏙 담아 분석하고 싶다는 생각, 많이들 하시잖아요? 그래서 오늘은 R을 활용해서 웹 페이지 크롤링하는 방법을 같이 알아보려고 해요. R의 강력한 `rvest` 패키지를 이용하면 마치 마법처럼 원하는 데이터만 쏙쏙 뽑아낼 수 있답니다. 웹 페이지 분석부터 데이터 추출, 정제까지, 차근차근 배워볼 거예요. 어렵게만 느껴지던 웹 크롤링, 이제 쉽고 재미있게 시작해 보자구요!

 

 

쉬운 목차

rvest 패키지 설치 및 로드

R에서 웹 크롤링을 시작하려면 먼저 강력한 도구인 rvest 패키지를 설치해야겠죠? 마치 탐험을 떠나기 전에 튼튼한 배를 준비하는 것과 같아요! 설치는 아주 간단해요. R 콘솔 창에 install.packages("rvest")라고 입력하고 엔터 키를 꾹~ 눌러주면 돼요. 생각보다 쉽죠?! 벌써 설렘이 막 솟아나지 않나요?

rvest 패키지와 xml2 패키지의 관계

rvest 패키지는 xml2 패키지 위에 구축되어 있어요. HTML과 XML 문서를 파싱하는 데 사용되는 xml2rvest의 든든한 기반이라고 할 수 있죠. 마치 땅속 깊이 뿌리내린 나무처럼 rvest를 지탱해 준답니다. rvest를 설치하면 자동으로 xml2도 설치되니 걱정 마세요! 이 두 패키지의 환상적인 협업 덕분에 우리는 더욱 효율적으로 웹 페이지를 다룰 수 있게 된답니다.

rvest 패키지 로드

패키지 설치가 완료되면 이제 library() 함수를 사용해서 불러와야 해요. library(rvest)라고 입력하고 엔터! 이렇게 하면 rvest 패키지에 있는 모든 함수와 기능을 사용할 준비가 완료된 거예요. 마치 보물 상자를 여는 주문 같지 않나요?

rvest 패키지의 주요 함수

자, 이제 좀 더 자세히 알아볼까요? rvest 패키지는 웹 페이지를 읽어오는 read_html() 함수, HTML 요소를 선택하는 html_nodes() 함수, 그리고 선택한 요소에서 텍스트나 속성 값을 추출하는 html_text()html_attr() 함수 등 다양한 함수를 제공해요. 이 함수들은 각각 특별한 역할을 수행하며, 마치 오케스트라의 악기들처럼 조화롭게 연주되어 웹 크롤링이라는 아름다운 음악을 만들어낸답니다!

read_html() 함수

read_html() 함수는 URL을 입력받아 웹 페이지의 HTML 소스 코드를 가져와요. 마치 웹 페이지의 DNA를 추출하는 것 같아요! 가져온 HTML 소스 코드는 xml2 패키지의 xml_document 객체로 저장되는데, 이 객체는 HTML 구조를 트리 형태로 표현해준답니다. 복잡한 웹 페이지 구조를 한눈에 파악하기 쉽게 해주는 고마운 존재예요! read_html() 함수는 로컬 HTML 파일도 읽어올 수 있다는 사실! 알고 계셨나요? 정말 다재다능한 함수죠?!

html_nodes() 함수

html_nodes() 함수는 CSS 선택자 또는 XPath 표현식을 사용하여 HTML 문서에서 특정 요소들을 선택해요. 마치 현미경으로 원하는 세포를 찾아내는 것과 같아요! 예를 들어, 모든 <p> 태그를 선택하려면 html_nodes(doc, "p")라고 입력하면 돼요. 참 쉽죠? html_nodes() 함수는 웹 페이지에서 원하는 정보를 정확하게 추출하는 데 필수적인 도구랍니다!

html_text() 함수와 html_attr() 함수

html_text() 함수는 선택한 HTML 요소에서 텍스트 내용을 추출해요. 마치 과일 껍질을 벗겨내고 달콤한 과육만 쏙 빼먹는 것 같아요! html_attr() 함수는 선택한 HTML 요소의 속성 값을 추출해요. 예를 들어, 이미지 태그의 src 속성 값을 추출하면 이미지의 URL을 얻을 수 있답니다. html_text()html_attr() 함수는 웹 페이지에서 원하는 정보를 추출하는 데 꼭 필요한 두 개의 날개와 같아요!

rvest 패키지의 기능

rvest 패키지는 웹 크롤링에 필요한 거의 모든 기능을 제공해요. HTML 파싱, CSS 선택자, XPath, HTTP 요청 처리 등… 정말 없는 게 없죠?! rvest 패키지 하나면 웹 크롤링의 달인이 될 수 있을 것 같아요! 자, 이제 rvest 패키지와 함께 신나는 웹 크롤링 여정을 시작해 볼까요? 어떤 보물들을 발견하게 될지 정말 기대되네요!

 

크롤링할 웹 페이지 분석

자, 이제 본격적으로 크롤링할 웹 페이지를 분석해 볼까요? 마치 탐정이 된 기분으로 🕵️‍♀️ 웹 페이지의 구조를 파헤쳐 봐야 해요! 이 단계가 제대로 되어야 우리가 원하는 데이터를 쏙쏙! 뽑아낼 수 있답니다. R과 rvest 패키지를 이용해서 크롤링을 하려면, 먼저 우리가 탐험할 웹 페이지의 HTML 구조를 제대로 이해해야 해요. 마치 보물 지도🗺️ 를 읽는 것과 같다고 할까요?

웹 페이지 분석은 크게 두 가지 관점에서 접근할 수 있어요. 첫 번째는 HTML 태그 분석이고, 두 번째는 CSS 선택자 활용이에요. 이 두 가지가 핵심이니, 집중! 또 집중! 해주세요!🧐

1. HTML 태그 분석

HTML은 웹 페이지의 뼈대를 이루는 언어예요. 우리가 눈으로 보는 웹 페이지의 모든 요소들은 각각의 HTML 태그로 구성되어 있죠. 예를 들어, 제목은 `

`, `

` 등의 태그로, 단락은 `

` 태그로, 표는 `

` 태그로 표현돼요. 각 태그들은 속성(attribute)을 가지고 있는데, 이 속성들을 이용해서 특정 요소를 구분할 수 있어요. idclass 속성이 가장 대표적이죠. id는 페이지 내에서 유일한 값을 가지는 속성이고, class는 여러 요소들이 공유할 수 있는 속성이에요. 이러한 태그와 속성들을 잘 파악하면 원하는 데이터를 정확하게 추출할 수 있답니다. 마치 현미경으로 세포를 관찰🔬하는 것처럼 말이죠! HTML 태그의 계층 구조를 파악하는 것도 중요해요! 부모-자식 관계를 이해하면 더욱 효율적으로 데이터를 추출할 수 있거든요. 개발자 도구(F12)를 이용하면 웹 페이지의 HTML 구조를 직접 확인할 수 있어요. 어떤 태그가 어떤 데이터를 감싸고 있는지 꼼꼼하게 살펴보세요!🔍

예를 들어, 상품 정보를 크롤링한다고 가정해 봅시다. 상품명은 <h2> 태그 안에, 가격은 <span class="price"> 태그 안에 있다면, rvest 패키지를 이용해서 이러한 태그들을 기준으로 데이터를 추출할 수 있어요. 정말 신기하지 않나요? ✨

2. CSS 선택자 활용

CSS 선택자는 마치 마법의 주문🪄 같아요. 특정 HTML 요소를 정확하게 선택할 수 있게 해주는 강력한 도구죠. CSS 선택자를 이용하면 id, class, 태그 이름뿐만 아니라, 요소의 계층 구조, 속성 값 등 다양한 조건을 조합해서 원하는 요소만 콕! 집어낼 수 있어요. 예를 들어, #product-titleid가 “product-title”인 요소를 선택하고, .priceclass가 “price”인 모든 요소를 선택해요. div > pdiv 태그의 직계 자식인 p 태그를 선택하고, a[href^="https://"]href 속성 값이 “https://”로 시작하는 모든 a 태그를 선택하죠. CSS 선택자를 잘 활용하면 복잡한 웹 페이지 구조에서도 원하는 데이터만 정확하게 추출할 수 있답니다. 마치 족집게처럼 말이죠! 🤏

CSS 선택자에는 정말 다양한 종류가 있어요. * (모든 요소 선택), > (직계 자식 선택), + (바로 다음 형제 요소 선택), ~ (모든 형제 요소 선택) 등등… 이러한 선택자들을 적절히 조합하면 마치 레고 블록🧱을 쌓듯이 원하는 요소를 정확하게 선택할 수 있답니다. CSS 선택자를 배우는 것은 처음에는 조금 어려울 수 있지만, 익숙해지면 정말 강력한 무기⚔️가 될 거예요!

자, 이제 실제 웹 페이지를 예시로 들어볼게요. 만약 우리가 크롤링하려는 웹 페이지의 상품 목록이 <ul class="product-list"> 태그 안에 있고, 각 상품 정보는 <li class="product-item"> 태그 안에 있다고 가정해 봅시다. 그렇다면 CSS 선택자 ul.product-list > li.product-item을 이용해서 모든 상품 정보를 담고 있는 <li> 태그들을 선택할 수 있어요. 이렇게 선택된 <li> 태그들을 rvest 패키지의 함수들과 함께 사용하면 각 상품의 정보를 추출할 수 있겠죠? 참 쉽죠? 😊

웹 페이지 분석은 크롤링의 핵심이라고 할 수 있어요. HTML 태그 분석과 CSS 선택자 활용을 통해 웹 페이지의 구조를 정확하게 파악하고, 원하는 데이터를 효율적으로 추출하는 방법을 익혀두면 어떤 웹 페이지든 자유자재로 크롤링할 수 있을 거예요! 다음 단계에서는 이렇게 분석한 웹 페이지 구조를 바탕으로 실제로 데이터를 추출하는 방법을 알아볼 거예요. 기대되시죠?! 😉

 

데이터 추출 및 정제

자, 이제 드디어! 우리가 원하는 데이터를 뽑아낼 시간이에요! 마치 탐험가가 보물 상자를 여는 기분이랄까요? rvest 패키지를 활용하면 HTML 구조 안에 숨겨진 데이터들을 마법처럼 쏙쏙 뽑아낼 수 있답니다. XPath와 CSS Selector라는 두 가지 강력한 도구를 사용할 건데, 걱정 마세요! 생각보다 어렵지 않아요~?

XPath

XPath는 XML 문서에서 특정 요소나 속성을 찾아내는 경로 표현식이에요. 마치 지도에서 목적지를 찾아가는 길을 알려주는 것처럼, XPath는 HTML 문서에서 우리가 원하는 데이터의 위치를 정확하게 알려준답니다. 예를 들어, //div[@class="title"]/a 라는 XPath는 “title” 이라는 클래스를 가진 모든 div 태그 안에 있는 a 태그를 가리켜요. 어때요? 흥미롭지 않나요?!

CSS Selector

CSS Selector는 CSS 스타일을 적용할 때 사용하는 문법인데, rvest 패키지에서는 이를 활용해서 HTML 요소를 선택할 수 있도록 지원해요. XPath보다 간결하고 직관적인 경우가 많아서 저는 개인적으로 CSS Selector를 더 자주 사용한답니다! 예를 들어, .title a 는 “title” 이라는 클래스를 가진 요소 안에 있는 모든 a 태그를 선택해요. XPath와 비교해보면 훨씬 간단하죠?

rvest 패키지의 핵심 함수

rvest 패키지html_nodes() 함수와 html_text() 함수, html_attr() 함수는 데이터 추출의 핵심이에요! html_nodes() 함수는 우리가 지정한 XPath 또는 CSS Selector에 해당하는 모든 HTML 요소를 가져오고, html_text() 함수는 요소 내부의 텍스트를 추출하며, html_attr() 함수는 요소의 속성 값을 추출해요. 이 세 가지 함수만 잘 활용하면 웹 페이지에서 원하는 데이터는 거의 다 뽑아낼 수 있다고 봐도 무방해요!

데이터 정제

하지만! 데이터를 추출했다고 끝이 아니죠~ 원석을 캐냈다고 해서 바로 보석이 되는 건 아니잖아요? 추출한 데이터는 대부분 정제 과정을 거쳐야 비로소 우리가 원하는 형태로 사용할 수 있어요. 가끔은 정말… 지저분한 데이터를 만나게 될 수도 있어요.

웹 페이지의 HTML 구조가 복잡하거나, 데이터가 일관성 없이 저장되어 있는 경우, 추출한 데이터에 불필요한 공백, 특수 문자, HTML 태그 등이 섞여 있을 수 있어요. 이런 경우 gsub() 함수, trimws() 함수, stringr 패키지 등을 활용해서 데이터를 깨끗하게 정제해야 한답니다. 데이터 정제는 마치 조각가가 돌덩이를 다듬어 작품을 만드는 것과 같아요. 시간과 노력이 필요하지만, 그만큼 가치 있는 결과물을 얻을 수 있죠!

데이터 정제 예시

예를 들어, 제품 가격 정보를 추출했는데 “₩10,000″과 같이 통화 기호와 쉼표가 포함되어 있다면, 이를 숫자 형태인 10000으로 변환해야 분석에 활용할 수 있겠죠? gsub() 함수를 사용하면 특정 문자열을 다른 문자열로 바꿀 수 있어요. trimws() 함수는 문자열 앞뒤의 공백을 제거해주고요. stringr 패키지는 문자열 처리에 특화된 다양한 함수들을 제공해서 데이터 정제 작업을 훨씬 효율적으로 할 수 있게 도와준답니다!

데이터 정제는 상황에 따라 다양한 기법을 적용해야 하는 만큼, 처음에는 어렵게 느껴질 수도 있어요. 하지만 걱정 마세요! 꾸준히 연습하고 다양한 사례를 접하다 보면 어느새 데이터 정제 전문가가 되어 있을 거예요! 저도 처음엔 엄청 헤맸었는데… 지금은 눈 감고도 할 수 있을 정도라니까요!

영화 정보 추출 예시

자, 이제 몇 가지 구체적인 예시를 통해 데이터 추출 및 정제 과정을 더 자세히 살펴볼까요? 웹 페이지에서 영화 제목, 평점, 감독 정보를 추출한다고 가정해 봅시다. 먼저 html_nodes() 함수를 사용해서 각 정보가 담겨 있는 HTML 요소를 선택하고, html_text() 함수로 텍스트를 추출해요. 만약 평점 정보에 별 이미지가 함께 표시되어 있다면, html_attr() 함수를 사용해서 별 이미지의 alt 속성 값을 추출해야 정확한 평점을 얻을 수 있겠죠? 그리고 추출한 텍스트에 불필요한 공백이나 특수 문자가 포함되어 있다면 gsub() 함수와 trimws() 함수를 사용해서 깨끗하게 정제해주면 된답니다!

어때요? 이제 데이터 추출 및 정제 과정이 조금 더 명확하게 이해되시나요? 처음에는 복잡해 보일 수 있지만, 차근차근 따라 해 보면 생각보다 어렵지 않다는 걸 알게 될 거예요! 혹시라도 궁금한 점이 있다면 언제든지 질문해주세요!

 

실제 활용 예시

자, 이제 드디어!! rvest 패키지를 활용해서 실제로 웹 데이터를 휘리릭~ 가져오는 마법 같은 시간이에요! 두근두근~? 여기서는 온라인 서점의 베스트셀러 목록을 가져오는 예시를 살펴볼 거예요. 웹 크롤링의 세계에 풍덩~ 빠져볼 준비되셨나요?!

데이터 가져오기

가져올 데이터는 A라는 대형 온라인 서점의 베스트셀러 top 100이에요. 이 서점은 매 시간 베스트셀러 순위를 갱신하는데, 이걸 매번 직접 확인하려면…으으… 생각만 해도 귀찮죠? ㅠㅠ 그래서! 우리는 rvest의 강력한 기능을 활용해서 이 데이터를 자동으로 가져오는 시스템을 만들어 볼 겁니다! 어때요, 멋지지 않나요? ^^

HTML 구조 분석

먼저, 목표 웹 페이지의 HTML 구조를 분석해야 해요. 크롬 개발자 도구(F12)를 사용하면 편리하게 분석할 수 있죠! 개발자 도구를 열고 ‘Elements’ 탭에서 베스트셀러 목록 부분의 HTML 코드를 샅샅이 살펴봐요. 책 제목, 저자, 출판사, 가격 등 원하는 정보가 어떤 태그 안에 들어있는지, 어떤 class나 id로 구분되는지 확인하는 게 중요해요! 마치 보물찾기 같지 않나요? 😉

이 온라인 서점의 베스트셀러 목록은 <div class="book_list_item"> 이라는 태그 안에 각각의 책 정보가 들어있다고 가정해 볼게요. 책 제목은 <a class="book_title"> 태그, 저자는 <span class="book_author"> 태그, 가격은 <span class="book_price"> 태그 안에 들어있어요. (실제 웹사이트 구조와 다를 수 있으니 꼭! 직접 확인해보셔야 해요~!)

코드 작성

자, 이제 코드를 작성해볼까요?

library(rvest)
library(stringr)

# 크롤링할 웹 페이지 URL
url <- "https://www.example-bookstore.com/bestseller"  # 예시 URL입니다. 실제 URL로 변경해야 해요!

# 웹 페이지 읽어오기
webpage <- read_html(url)

# 책 제목 추출
book_titles <- webpage %>%
  html_nodes(".book_title") %>%  # CSS 선택자를 사용해서 원하는 요소 추출!
  html_text() %>%               # 텍스트만 뽑아내기!
  str_trim()                   # 앞뒤 공백 제거! 깔끔하게~

# 저자 추출
book_authors <- webpage %>%
  html_nodes(".book_author") %>%
  html_text() %>%
  str_trim()

# 가격 추출
book_prices <- webpage %>%
  html_nodes(".book_price") %>%
  html_text() %>%
  str_trim() %>%
  str_replace_all("[^0-9]", "") %>% # 숫자 이외의 문자 제거 (예: "원", ",") - 정규표현식 활용!
  as.numeric()                   # 숫자형으로 변환! 분석하기 편하게~

# 데이터 프레임으로 만들기
bestseller_df <- data.frame(
  제목 = book_titles,
  저자 = book_authors,
  가격 = book_prices
)

# 결과 출력!
print(bestseller_df)

# CSV 파일로 저장하기
write.csv(bestseller_df, "bestseller.csv", row.names = FALSE)

결과 및 활용

이 코드를 실행하면 베스트셀러 top 100 목록이 깔끔한 데이터 프레임 형태로 저장되고, csv 파일로도 저장돼요! 이제 이 데이터를 활용해서 다양한 분석을 할 수 있겠죠? 예를 들어, 가장 많이 등장하는 저자는 누구인지, 평균 책 가격은 얼마인지, 특정 키워드가 포함된 책은 몇 권인지 등등… 상상만 해도 흥미진진하지 않나요?! 🤩

주의 사항

하지만! 웹 크롤링은 강력한 도구인 만큼 책임감을 가지고 사용해야 해요. 너무 많은 요청을 보내면 서버에 부담을 줄 수 있으니, Sys.sleep() 함수를 사용해서 적절한 간격을 두고 크롤링하는 것이 좋습니다. 그리고 robots.txt 파일을 확인해서 크롤링이 허용된 페이지인지 확인하는 것도 잊지 마세요! 😊

자, 이제 여러분은 rvest 패키지를 활용하여 웹 데이터를 자유자재로 다룰 수 있는 능력을 갖추게 되었어요! 🎉 웹 크롤링의 세계는 무궁무진하니, 다양한 웹사이트를 탐험하며 여러분만의 데이터 분석 프로젝트를 시작해보세요! 화이팅! 💪

 

자, 이렇게 rvest 패키지를 활용해서 웹 페이지 크롤링하는 방법을 차근차근 알아봤어요. 어때요, 생각보다 어렵지 않았죠? 처음엔 낯설 수 있지만, 몇 번 연습하다 보면 금방 손에 익을 거예요. 마치 새로운 레시피를 배우는 것처럼 말이죠! 이제 여러분도 원하는 데이터를 직접 수집하고 분석해서, 흥미로운 인사이트를 발견할 수 있답니다. 웹 세상에는 무궁무진한 데이터가 숨겨져 있으니까요. rvest가 여러분의 데이터 분석 여정에 좋은 친구가 되어줄 거예요. 호기심을 갖고 다양하게 활용해보면서 데이터 분석의 재미를 맘껏 느껴보세요! 앞으로도 더 재미있고 유익한 정보들을 가지고 찾아올게요. 기대해주세요!

 

Itlearner

Share
Published by
Itlearner

Recent Posts

SQL에서 DELETE로 특정 행 삭제하기

데이터베이스 다루다 보면, 원치 않는 데이터를 삭제해야 할 때가 종종 있죠? 마치 옷장 정리하듯이 말이에요!…

3시간 ago

SQL에서 여러 개의 행을 한 번에 INSERT하는 방법

안녕하세요, 여러분! 데이터베이스 다루다 보면 은근히 자주 만나는 상황, 바로 여러 데이터를 한 번에 입력해야…

13시간 ago

SQL에서 INSERT INTO로 데이터 추가하기

안녕하세요! 데이터베이스에 정보를 넣는 작업, 생각보다 자주 하게 되죠? 특히 SQL을 사용할 때 INSERT INTO…

18시간 ago

SQL에서 INDEX(인덱스) 생성 및 활용법

데이터베이스를 다루다 보면, 쿼리 속도 때문에 답답했던 적 있지 않으세요? 마치 거북이처럼 느릿느릿 데이터를 가져오는…

22시간 ago

SQL에서 AUTO_INCREMENT를 활용한 자동 증가 컬럼 만들기

안녕하세요, 여러분! 데이터베이스 만지다 보면 은근히 신경 쓰이는 부분, 바로 ID 값 관리죠? 일일이 값을…

1일 ago

SQL에서 외래 키(FOREIGN KEY) 설정하는 방법

데이터베이스 공부, 어렵게 느껴지시죠? 괜찮아요! 오늘은 같이 복잡한 관계 속에서 길을 잃지 않도록 도와주는 든든한…

1일 ago