웹 페이지 분석은 크게 두 가지 관점에서 접근할 수 있어요. 첫 번째는 HTML 태그 분석이고, 두 번째는 CSS 선택자 활용이에요. 이 두 가지가 핵심이니, 집중! 또 집중! 해주세요!🧐
HTML은 웹 페이지의 뼈대를 이루는 언어예요. 우리가 눈으로 보는 웹 페이지의 모든 요소들은 각각의 HTML 태그로 구성되어 있죠. 예를 들어, 제목은 `
` 태그로 표현돼요. 각 태그들은 속성(attribute)을 가지고 있는데, 이 속성들을 이용해서 특정 요소를 구분할 수 있어요. id
와 class
속성이 가장 대표적이죠. id
는 페이지 내에서 유일한 값을 가지는 속성이고, class
는 여러 요소들이 공유할 수 있는 속성이에요. 이러한 태그와 속성들을 잘 파악하면 원하는 데이터를 정확하게 추출할 수 있답니다. 마치 현미경으로 세포를 관찰🔬하는 것처럼 말이죠! HTML 태그의 계층 구조를 파악하는 것도 중요해요! 부모-자식 관계를 이해하면 더욱 효율적으로 데이터를 추출할 수 있거든요. 개발자 도구(F12)를 이용하면 웹 페이지의 HTML 구조를 직접 확인할 수 있어요. 어떤 태그가 어떤 데이터를 감싸고 있는지 꼼꼼하게 살펴보세요!🔍 예를 들어, 상품 정보를 크롤링한다고 가정해 봅시다. 상품명은 <h2>
태그 안에, 가격은 <span class="price">
태그 안에 있다면, rvest 패키지를 이용해서 이러한 태그들을 기준으로 데이터를 추출할 수 있어요. 정말 신기하지 않나요? ✨
2. CSS 선택자 활용
CSS 선택자는 마치 마법의 주문🪄 같아요. 특정 HTML 요소를 정확하게 선택할 수 있게 해주는 강력한 도구죠. CSS 선택자를 이용하면 id
, class
, 태그 이름뿐만 아니라, 요소의 계층 구조, 속성 값 등 다양한 조건을 조합해서 원하는 요소만 콕! 집어낼 수 있어요. 예를 들어, #product-title
은 id
가 “product-title”인 요소를 선택하고, .price
는 class
가 “price”인 모든 요소를 선택해요. div > p
는 div
태그의 직계 자식인 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가 여러분의 데이터 분석 여정에 좋은 친구가 되어줄 거예요. 호기심을 갖고 다양하게 활용해보면서 데이터 분석의 재미를 맘껏 느껴보세요! 앞으로도 더 재미있고 유익한 정보들을 가지고 찾아올게요. 기대해주세요!