TL;DR: 이 튜토리얼은 Ruby로 사이트에서 데이터를 추출하는 방법과 웹 스크래핑에 가장 효과적인 언어 중 하나인 이유를 알려줍니다.
이 가이드에서는 다음을 다룹니다:
- 루비는 웹 스크래핑에 적합한가요?
- 최고의 루비 웹 스크래핑 젬
- Ruby로 웹 스크레이퍼 구축하기
루비는 웹 스크래핑에 적합한가요?
루비는 해석형, 오픈소스, 동적 타입 프로그래밍 언어로 함수형, 객체 지향, 절차적 개발을 지원합니다. 간결함을 목표로 설계되어 우아한 구문으로 작성하기 쉽고 자연스럽게 읽힙니다. 생산성에 중점을 둔 덕분에 웹 스크래핑을 포함한 여러 분야에서 널리 사용됩니다.
특히 루비는 다양한 서드파티 라이브러리(보석)를 활용할 수 있어 스크래핑에 탁월한 선택입니다. 거의 모든 작업에 해당하는 보석이 존재합니다. 웹에서 정보를 프로그래밍 방식으로 추출할 때, 페이지 다운로드, HTML 콘텐츠 분석, 데이터 추출을 위한 보석들이 마련되어 있습니다.
요약하자면, 루비에서의 웹 스크래핑은 가능할 뿐만 아니라 다양한 라이브러리 덕분에 쉽습니다. 가장 인기 있는 것들을 알아봅시다!
최고의 루비 웹 스크래핑 젬
루비용 최고의 웹 스크래핑 라이브러리 세 가지는 다음과 같습니다:
- Nokogiri(톱): HTML/XML 문서 탐색 및 조작을 위한 완벽한 API를 갖춘 강력하고 유연한 HTML/XML 파싱 라이브러리로, 관련 데이터 추출을 용이하게 합니다.
- Mechanize: 웹사이트와의 상호작용을 자동화하는 고수준 API를 제공하는 헤드리스 브라우저 기능 라이브러리입니다. 쿠키 저장 및 전송, 리디렉션 처리, 링크 추적, 양식 제출이 가능합니다. 또한 방문한 사이트를 추적할 수 있는 기록 기능을 제공합니다.
- Selenium: 웹 페이지에서 자동화된 테스트를 실행하는 가장 널리 사용되는 프레임워크의 Ruby 바인딩입니다. 브라우저가 실제 사용자와 동일하게 웹사이트와 상호작용하도록 지시할 수 있습니다. 이 기술은 안티봇(anti-bot) 솔루션을 우회하고, 데이터 렌더링이나 검색에 자바스크립트에 의존하는 사이트를 스크래핑하는 데 핵심적인 역할을 합니다.
필수 조건
코드를 작성하기 전에 컴퓨터에 Ruby를 설치해야 합니다. 운영 체제에 따라 아래 가이드를 따르세요.
macOS에 Ruby 설치하기
기본적으로 Ruby는 2015년 출시된 macOS 10.11(El Capitan) 버전부터 포함되어 있습니다. macOS가 일부 기능을 제공하기 위해 기본적으로 Ruby에 의존한다는 점을 고려할 때, 이를 건드리지 않는 것이 좋습니다. 내장된 Ruby 버전을 brew install ruby 또는 update ruby mac으로 업데이트하는 것은 일부 내장 기능을 손상시킬 수 있으므로 권장하지 않습니다.
Windows에 Ruby 설치하기
RubyInstaller 패키지를 다운로드한 후 실행하고 설치 마법사를 따라 Ruby를 설정하세요. 시스템 재시작이 필요할 수 있습니다. Windows 10부터는 Windows Subsystem for Linux (WSL)를 사용하여 아래 지침에 따라 Ruby를 설치할 수도 있습니다.
Linux에서 Ruby 설치하기
리눅스에서 Ruby 환경을 설정하는 가장 좋은 방법은 패키지 관리자를 통해 설치하는 것입니다.
Debian 및 Ubuntu에서는 다음 명령을 실행하세요:
sudo apt-get install ruby-full
다른 배포판에서는 실행해야 할 터미널 명령어가 다릅니다. 공식 사이트의 가이드를 참조하여 지원되는 모든 패키지 관리 시스템을 확인하세요.
사용 중인 OS에 관계없이 다음 명령어로 Ruby가 정상 작동하는지 확인할 수 있습니다:
ruby -v
다음과 같은 결과가 출력됩니다:
ruby 3.2.2 (2023-03-30 revision e51014f9c0)
좋습니다! 이제 루비 웹 스크래핑을 시작할 준비가 되었습니다!
Ruby로 웹 스크레이퍼 구축하기
이 섹션에서는 Ruby 웹 스크레이퍼를 만드는 방법을 살펴보겠습니다. 이 자동화된 스크립트는 Bright Data 홈페이지에서 데이터를 가져옵니다. 구체적으로 다음과 같은 작업을 수행합니다:
- 대상 사이트에 연결하기
- DOM에서 관심 있는 HTML 요소 선택
- 해당 요소에서 데이터 추출
- 스크래핑된 데이터를 CSV, JSON 등 탐색하기 쉬운 형식으로 변환
이 글을 작성하는 시점에서 사용자가 대상 웹페이지를 방문하면 다음과 같은 화면을 보게 됩니다:

BrightData 홈페이지가 자주 변경되므로 본 문서를 읽을 시점에는 다를 수 있음을 유의하십시오.
구체적인 스크래핑 목표는 다음 카드에 포함된 사용 사례 정보를 얻는 것입니다:

아래 단계별 튜토리얼을 따라 Ruby로 웹 스크래핑하는 방법을 배워보세요!
1단계: Ruby 프로젝트 초기화
시작하기 전에 Ruby 프로젝트를 설정해야 합니다. 터미널을 실행하고 프로젝트 폴더를 생성한 후 다음 명령어로 진입하세요:
mkdir ruby-web-scraper
cd ruby-web-scraper
ruby-web-scraper 디렉터리에 스크레이퍼가 포함됩니다.
다음으로 프로젝트 폴더 내에 scraper.rb 파일을 생성하고 다음 내용을 입력하세요:
puts "Hello, World!"
위 코드 조각은 가능한 가장 간단한 Ruby 스크립트입니다.
터미널에서 실행하여 작동하는지 확인하세요:
ruby scraper.rb
그러면 다음과 같은 메시지가 출력됩니다:
Hello, World!
이제 IDE에 프로젝트를 가져와 고급 루비 스크래핑 로직을 정의해 볼 시간입니다! 이 가이드에서는 Visual Studio Code (VS Code)를 루비 개발 환경으로 설정하는 방법을 살펴보겠습니다. 물론 다른 루비 IDE도 사용 가능합니다.
VS Code는 기본적으로 Ruby를 지원하지 않으므로 먼저 Ruby 확장 프로그램을 추가해야 합니다. Visual Studio Code를 실행하고 왼쪽 바의 “확장 프로그램” 아이콘을 클릭한 후 상단 검색창에 “Ruby”를입력하세요.

첫 번째 항목의 “설치” 버튼을 클릭하여 VS Code에 Ruby 하이라이트 기능을 추가하세요. 플러그인이 IDE에 추가될 때까지 기다립니다. 그런 다음 “파일“, “폴더 열기…”를 통해 ruby-web-scraper 폴더를 엽니다.
“EXPLORER” 바 아래의 scraper.rb 파일을 클릭하여 파일 편집을 시작하세요:

2단계: 스크래핑 라이브러리 선택
적합한 라이브러리를 사용하면 Ruby로 웹 스크레이퍼를 구축하는 것이 더 쉬워집니다. 따라서 앞서 소개된 젬 중 하나를 채택해야 합니다. 목표에 가장 적합한 웹 스크래핑 Ruby 라이브러리를 파악하려면 대상 사이트를 분석하는 데 시간을 투자해야 합니다.
이를 위해 브라우저에서 대상 페이지를 방문한 후 배경의 빈 공간을 마우스 오른쪽 버튼으로 클릭하고 “검사” 옵션을 선택하세요. 이렇게 하면 브라우저의 개발자 도구가 실행됩니다. Chrome의 경우 “네트워크” 탭으로 이동하여 “Fetch/XHR”섹션을 살펴보세요.

위 스크린샷에서 확인할 수 있듯이, 단 7개의 AJAX 요청만 존재합니다. 각 XHR 호출을 자세히 살펴보면 의미 있는 데이터를 포함하지 않음을 알 수 있습니다. 이는 대상 페이지가 렌더링 시점에 콘텐츠를 가져오지 않음을 의미합니다. 따라서 서버가 반환하는 HTML 문서에는 이미 사용자에게 표시할 모든 데이터가 포함되어 있습니다.
이는 대상 웹페이지가 데이터 검색이나 렌더링 목적으로 자바스크립트를 사용하지 않음을 증명합니다. 즉, 웹 스크래핑을 수행하기 위해 헤드리스 브라우저 기능을 가진 젬이 필요하지 않습니다. Mechanize나 Selenium을 사용할 수는 있지만, 이는 성능 오버헤드만 추가할 뿐입니다. 결국 이 도구들은 백그라운드에서 브라우저 인스턴스를 실행하므로 자원을 소모합니다.
요약하자면, Nokogiri와 같은 간단한 HTML/XML 파서를 선택해야 합니다. nokogiri gem을 통해 설치하려면 다음 명령어를 사용하세요:
gem install nokogiri
그런 다음 scraper.rb 파일 상단에 다음 줄을 추가하여 라이브러리를 임포트하세요:
require "nokogiri"
Ruby IDE에서 오류가 발생하지 않는지 확인한 후, 이제 Ruby로 데이터를 스크래핑할 수 있습니다!
3단계: HTTParty를 사용하여 대상 페이지 가져오기
대상 페이지의 HTML 문서를 파싱하려면 먼저 HTTP GET 요청을 통해 해당 페이지를 다운로드해야 합니다. Ruby에는 Net::HTTP라는 내장 HTTP 클라이언트가 있지만, 그 구문은 다소 번거롭고 직관적이지 않습니다. 대신 HTTP 요청을 수행하는 가장 인기 있는 Ruby 라이브러리인 HTTParty를 사용해야 합니다.
httparty gem을 통해 설치하세요:
gem install httparty
그런 다음 scraper.rb 파일에 임포트하세요:
require "httparty"
HTTParty를 사용하여 대상 페이지에 연결합니다:
response = HTTParty.get("https://brightdata.com/")
get() 메서드는 매개변수로 전달된 URL에 대한 GET 요청을 수행합니다. response.body 필드에는 서버에서 반환된 HTML 문서가 포함됩니다.
get()을 통한 HTTP 요청이 실패할 수 있습니다. 이 경우 HTTParty는 예외를 발생시키고 스크립트 실행을 중단합니다. 실패 원인은 다양할 수 있으나, 일반적으로 대상 사이트가 채택한 봇 방지 기술이 자동화된 요청을 차단한 경우입니다. 가장 기본적인 스크래핑 방지 시스템은 유효한 User-Agent HTTP 헤더가 없는 요청을 걸러내는 경향이 있습니다. 웹 스크래핑용 User-Agent에 대해 알아보려면 관련 문서를 참고하세요.
다른 HTTP 클라이언트와 마찬가지로 HTTParty는 기본값 User-Agent를 사용합니다. 이는 일반적으로 대중적인 브라우저에서 사용하는 에이전트와 매우 다르기 때문에, 반봇 솔루션에 의해 요청이 쉽게 탐지될 수 있습니다. 이를 방지하려면 다음과 같이 HTTParty에 유효한 User-Agent를 지정할 수 있습니다:
response = HTTParty.get("https://brightdata.com/", {
headers: { "User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"},
})
이 get()을 통해 수행된 요청은 이제 서버에 Google Chrome 112에서 온 것처럼 표시됩니다.
scraper.rb 파일의 현재 내용은 다음과 같습니다:
require "nokogiri"
require "httparty"
# 대상 페이지 가져오기
response = HTTParty.get("https://brightdata.com/", {
headers: {
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
},
})
# 스크래핑 로직...
4단계: Nokogiri로 HTML 문서 파싱
대상 웹페이지와 연관된 HTML 문서를 파싱하려면 해당 콘텐츠를 Nokogiri HTML() 함수에 전달하세요:
doc = Nokogiri::HTML(response.body)
이제 doc 변수를 통해 제공되는 DOM 조작 및 탐색 API를 활용할 수 있습니다. 특히 HTML 요소를 선택하는 데 가장 중요한 두 가지 메서드는 다음과 같습니다:
두 방법 모두 작동하지만, 일반적으로 CSS 쿼리가 원하는 요소를 표현하는 가장 쉬운 방법입니다.
5단계: 관심 HTML 요소에 대한 CSS 선택자 정의
대상 페이지에서 원하는 HTML 요소를 선택하는 방법을 이해하려면 DOM을 분석해야 합니다. 브라우저에서 Bright Data 홈페이지로 이동하여 관심 있는 카드 중 하나를 마우스 오른쪽 버튼으로 클릭한 후 “검사“를 선택하세요:

개발자 도구(DevTools) 섹션에서 HTML 코드를 살펴보세요. 각 사용 사례 카드는 다음을 포함하는 <div>입니다:
- 해당 산업과 관련된 이미지를 표시하는 <img> HTML 요소를 가진 <figure>와 산업 페이지 URL을 포함하는 <a> 요소.
- <a> 태그에 업종명을 저장하는 <div> HTML 요소.
Ruby 스크레이퍼의 데이터 추출 목표는 각 카드에서 이미지 URL, 페이지 URL, 산업명을 추출하는 것입니다.
효과적인 CSS 선택자를 정의하려면 관심 DOM 노드에 할당된 CSS 클래스에 주목하세요. 다음 CSS 선택자로 모든 사용 사례 카드를 가져올 수 있음을 확인할 수 있습니다:
.section_cases_row_col_item
카드를 대상으로 할 때, 관련 데이터를 저장하는 노드를 선택하려면 해당 카드의 <figure> 및 <div> 자식 요소에서 다음과 같이 선택할 수 있습니다:
- figure img
- figure a
- .elementor-image-box-content a
6단계: Nokogiri를 사용하여 웹페이지에서 데이터 추출
이제 Nokogiri를 사용하여 대상 HTML 웹페이지에서 원하는 데이터를 추출해야 합니다.
데이터 스크래핑 로직을 시작하기 전에, 수집된 데이터를 저장할 데이터 구조가 필요하다는 점을 잊지 마십시오. 이를 위해 Struct를 사용하여 한 줄로 UseCase 클래스를 정의할 수 있습니다:
UseCase = Struct.new(:image, :url, :name)
루비에서 Struct는 하나 이상의 속성을 동일한 데이터 클래스에 묶을 수 있게 합니다. 위 구조체는 각 사용 사례 카드에서 가져올 정보에 해당하는 세 가지 속성을 가지고 있습니다.
UseCase의 빈 배열을 초기화하고 스크래핑 로직을 구현하여 데이터를 채웁니다:
# 검색된 모든 데이터를 저장할 객체 목록 초기화
use_cases = []
# 모든 사용 사례 HTML 요소 선택
use_case_cards = doc.css(".section_cases_row_col_item")
# HTML 카드 반복 처리
use_case_cards.each do |use_case_card|
# 관심 데이터 추출
image = use_case_card.at_css("figure img").attribute("data-lazy-src").value
url = use_case_card.at_css("figure a").attribute("href").value
name = use_case_card.at_css(".elementor-image-box-content a").text
# 수집된 데이터로 UseCase 객체 생성
use_case = UseCase.new(url, image, name)
# 스크랩된 객체 배열에 UseCase 인스턴스 추가
use_cases.push(use_case)
end
위의 코드 조각은 모든 사용 사례 카드를 선택하고 반복합니다. 그런 다음 각 카드에서 at_css()를 사용하여 이미지 URL, 업계 페이지 URL 및 이름을 스크랩합니다. 이는 CSS 쿼리와 일치하는 첫 번째 요소를 반환하는 Nokogiri 함수로, 다음의 단축 형태입니다:
image = use_case_card.css("figure img").first.attribute("data-lazy-src").value
마지막으로, 추출된 데이터를 사용하여 새로운 UseCase 객체를 생성하고 목록에 추가합니다.
Nokogiri를 활용한 Ruby 웹 스크래핑은 상당히 간단합니다. attribute()를 사용하면 현재 HTML 요소에서 특정 속성을 선택할 수 있습니다. 이후 value 필드를 통해 해당 속성의 값을 얻을 수 있습니다. 마찬가지로 text 필드는 현재 HTML 노드에 포함된 모든 텍스트를 일반 문자열로 직접 반환합니다.
이제 한 걸음 더 나아가 사용 사례 산업 페이지도 스크래핑할 수 있습니다. 여기서 발견한 링크를 따라가며 해당 페이지에 맞춤화된 새로운 스크래핑 로직을 구현해 보세요. 웹 크롤링과 웹 스크래핑의 세계에 오신 것을 환영합니다!
훌륭합니다! 이제 루비로 스크래핑 목표를 달성하는 방법을 배웠습니다. 하지만 아직 배울 점이 남아 있습니다.
7단계: 스크래핑된 데이터 내보내기
each() 루프 이후 use_cases에는 스크래핑된 데이터가 루비 객체 형태로 저장됩니다. 이는 다른 팀에 데이터를 제공하기에 최적의 형식이 아닙니다. 다행히 루비는 CSV 및 JSON 변환 기능을 기본 제공합니다. 추출한 데이터를 CSV와 JSON으로 내보내는 방법을 배워보세요.
CSV 내보내기를 위해 다음 gem을 임포트하세요:
import "csv"
이는 Ruby 표준 API의 일부로, CSV 파일 및 데이터 처리를 위한 완벽한 인터페이스를 제공합니다.
이를 활용하여 use_cases 배열을 아래와 같이 output.csv 파일로 내보낼 수 있습니다:
# CSV 출력 파일 생성
CSV.open("output.csv", "wb") do |csv|
# CSV 헤더 작성
csv << ["url", "image", "name"]
# 각 사용 사례 스크랩 정보를
# CSV 레코드로 변환
use_cases.each do |use_case|
csv << use_case
end
end
위 코드 조각은 output.csv 파일을 생성합니다. 그런 다음 파일을 열고 헤더 레코드로 초기화합니다. 다음으로 use_cases 배열을 반복하며 CSV 파일에 추가합니다. << 연산자를 사용할 때 Ruby는 내장 CSV 클래스의 요구 사항에 따라 각 use_case 인스턴스를 문자열 배열로 자동 변환합니다.
다음 명령어로 스크립트를 실행해 보세요:
ruby scraper.rb
프로젝트 루트 디렉터리에 아래 데이터가 포함된 output.csv 파일이 생성됩니다:

마찬가지로 use_cases를 output.json으로 내보낼 수 있습니다:
# JSON 출력 파일 생성
File.open("output.json", "wb") do |json|
json << JSON.pretty_generate(use_cases.map { |u| Hash[u.each_pair.to_a] })
end
다음과 같은 JSON 파일이 생성됩니다:
[
{
"image": "https://brightdata.com/use-cases/ecommerce",
"url": "https://media.brightdata.com/2022/07/E_commerce.svg",
"name": "eCommerce "
},
// ...
{
"image": "https://brightdata.com/use-cases/data-for-good",
"url": "https://media.brightdata.com/2022/07/Data_for_Good_N.svg",
"name": "Data for Good"
}
]
자, 이제 루비에서 구조체 배열을 CSV와 JSON으로 변환하는 방법을 알게 되었습니다!
8단계: 모든 것을 합치기
다음은 루비 스크레이퍼의 전체 코드입니다:
# scraper.rb
require "nokogiri"
require "httparty"
require "csv"
# 대상 페이지 가져오기
response = HTTParty.get("https://brightdata.com/", {
headers: {
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
},
})
# GET 요청으로 가져온 HTML 문서 파싱
doc = Nokogiri::HTML(response.body)
# 스크랩된 데이터를 저장할 클래스 정의
UseCase = Struct.new(:image, :url, :name)
# 가져온 모든 데이터를 저장할 객체 목록 초기화
use_cases = []
# 모든 사용 사례 HTML 요소 선택
use_case_cards = doc.css(".section_cases_row_col_item")
# HTML 카드 반복 처리
use_case_cards.each do |use_case_card|
# 관심 데이터 추출
image = use_case_card.at_css("figure img").attribute("data-lazy-src").value
url = use_case_card.at_css("figure a").attribute("href").value
name = use_case_card.at_css(".elementor-image-box-content a").text
# 수집된 데이터로 UseCase 객체 생성
use_case = UseCase.new(url, image, name)
# 스크랩된 객체 배열에 UseCase 인스턴스 추가
use_cases.push(use_case)
end
# CSV 출력 파일 생성
CSV.open("output.csv", "wb") do |csv|
# CSV 헤더 작성
csv << ["url", "image", "name"]
# 각 UseCase 스크랩 정보를 CSV 레코드로 변환
use_cases.each do |use_case|
csv << use_case
end
end
# JSON 출력 파일 생성
File.open("output.json", "wb") do |json|
json << JSON.pretty_generate(use_cases.map { |u| Hash[u.each_pair.to_a] })
end
약 50줄의 코드로 Ruby에서 데이터 추출 스크립트를 만들 수 있습니다!
결론
이 튜토리얼을 통해 인터넷 스크래핑에 Ruby가 훌륭한 언어인 이유를 이해하셨을 것입니다. 또한 최고의 웹 스크래핑 Ruby gem 라이브러리가 무엇인지, 그 이유와 제공하는 기능을 살펴보셨습니다. 이후 Nokogiri와 Ruby의 표준 API를 활용해 실제 대상 데이터를 추출하는 Ruby 스크래퍼를 구축하는 방법을 깊이 있게 다뤘습니다. 보셨듯이 Ruby로 데이터 스크래핑을 구현하는 데는 극소량의 코드만 필요합니다.
그러나 웹 페이지에서 데이터를 추출할 때 직면하는 기존 과제들을 과소평가해서는 안 됩니다. 바로 이 때문에 점점 더 많은 사이트들이 데이터를 보호하기 위해 봇 방지 및 스크래핑 방지 시스템을 구현하고 있습니다. 이러한 기술들은 여러분의 스크래핑 루비 스크립트가 수행하는 요청을 감지하고 사이트 접근을 차단할 수 있습니다. 다행히도, Bright Data의 차세대 웹 스크래퍼 API를 사용하면 이러한 차단들을 우회할 수 있는 웹 스크래퍼를 구축할 수 있습니다.
웹 스크래핑 자체는 다루고 싶지 않지만 웹 데이터에는 관심이 있으신가요? 바로 사용 가능한 데이터 세트를 살펴보세요.