티스토리 뷰

  • 크롤링이란

크롤링이란, 타 사이트에 있는 자료를 수집하는것을 뜻합니다.

예를들면 카카오 뉴스 사이트에 있는 데이터를 그대로 가져온다거나, 네이버 중고나라에 올려진 데이터를 그대로 스크랩핑을 할 수 있습니다.

 

라즈베리파이에서 네이버 중고나라 데이터를 긁어온 모습

하지만 기본적인 크롤링에 있어서도, 만약 홈페이지가 iframe 기반 혹은 javascript 기반의 사이트(동적 사이트)일 경우, 크롤링이 안되는 경우가 있습니다. 대표적인 예시로서는 인스타그램, 에브리타임, 네이버 카페 등이 되겠습니다.

위와같이 크롤링이 안되는 이유는 Python의 beautiful soup, Ruby의 Nokiri 같은 경우, 순수 HTML 태그를 파싱을 해오기 때문입니다. 그렇다보니 이러한 방식의 크롤링은 한계가 올 수 있습니다.

 

크롤링 기술에 있어선 기존의 HTML 태그 파싱이 아닌 아예 진짜 (가상의) 웹브라우저를 띄어서 보여지는 화면을 통해 데이터를 긁어올 수 있도록 하는 기술이 각광받고 있는데, 대표적인 기술 중 하나가 Selenium 입니다.

Selenium의 장점은 위에 언급된 javascript/ifarme 기반 사이트의 크롤링이 된다는 장점이 있으나 대신 기존의 HTML 태그 파싱에 비해 많은 메모리가 사용된다는것이 단점이 되겠습니다.

 

최근에는 Selenium의 단점인 많은 메모리 사용의 문제점을 극복해낸 Puppeteer 이 있습니다. 하지만 Puppeteer은 Nodejs 기반에서만 돌아간다는 아쉬움이 남아있습니다.

 부록  Puppeteer vs. Selenium

 

해당 글에서는 Ruby on Rails를 기반으로 Selenium을 통해 크롤링을 하겠으나, 사실 Ruby on Rails 뿐만 아니더라도 Python 기술 등을 통해서도 할 수 있습니다.

 

 

  • 주의사항

크롤링 시 저작권을 잘 따져가면서 하세요!

웹툰, 구직사이트 등의 크롤링은 특히나 주의하셔야 합니다.

 사례  사람인에서 잡코리아 크롤링 하다 소송걸린 사례

 

크롤링에 있어 최소 홈페이지별로 웹수집 봇에게 정보수집을 명시하는 robots.txt에 명시된 규칙을 지켜가며 할 것을 추천드립니다.

 예시  티몬의 robots.txt

 

 

  • Ruby on Rails에서 Selenium 크롤링 실습

Ruby on Rails + Selenium을 활용한 크롤링에 앞서 Chromedriver을 설치해보겠습니다.

 

1. Ubuntu 내에서 간단한 Rails Project를 만듭니다.

# rails new [프로젝트 이름]

rails new kcm

 

2. 라즈베리 환경에서 Selenium을 돌릴 chromium을 설치합니다.

sudo apt -y install chromium-browser
sudo apt-get install chromium-chromedriver

 

3. Rails 프로젝트 메인에 있는  Gemfile  파일을 열람 후, 아래 두 Gem을 입력합니다.

gem 'selenium-webdriver'
gem 'chromedriver-helper'

그리고 터미널에 아래 명령어를 입력해서 Gem을 설치합니다.

bundle install

 

4. Rails 콘솔을 킵니다.

rails c

 

5. 콘솔에 다음 명령어를 입력해서 간단히 크롤링을 시도해봅니다.

require "selenium-webdriver"
Selenium::WebDriver::Chrome.driver_path = "/usr/lib/chromium-browser/chromedriver"
    
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument("--headless")
options.add_argument("--disable-gpu")
options.add_argument("--window-size=1280x1696")
options.add_argument("--disable-application-cache")
options.add_argument("--disable-infobars")
options.add_argument("--no-sandbox")
options.add_argument('--disable-dev-shm-usage')
options.add_argument("--hide-scrollbars")
options.add_argument("--enable-logging")
options.add_argument("--log-level=0")
options.add_argument("--single-process")
options.add_argument("--ignore-certificate-errors")
options.add_argument("--homedir=/tmp")
    
# 셀레니움 + 크롬 + 헤드리스 옵션으로 브라우저 실행
@browser = Selenium::WebDriver.for(:chrome, options: options)
    
# 다음 페이지로 이동
@browser.navigate().to "https://cafe.naver.com/joonggonara?iframe_url=/ArticleList.nhn%3Fsearch.clubid=10050146%26search.menuid=334%26search.boardtype=L"
    
# iframe에서 frame 형으로 전환
@browser.switch_to.frame("cafe_main")
    
## find_element랑 find_elements의 차이를 꼭 알아두자.
# https://stackoverflow.com/a/14425080
@content = @browser.find_elements(css: "#main-area > div > table > tbody > tr")
    
@productList = Array.new
puts "- Naver 중고나라 -"
@content.each do |t|
  @title = t.find_element(css: "a.article").text
  @nickname = t.find_element(css: "a.m-tcol-c").text
  @date = t.find_element(css: "td.td_date").text
  @url = t.find_element(tag_name: "a").attribute("href")
      
  @productList << [@title, @nickname, @date, @url]
      
  ## 서버 로그 확인용
  puts @productList
end
    
@browser.quit

 

위 코드를 통해 크롤링 시 아래와 같은 크롤링 결과를 얻어낼 수 있습니다.

 

 

  • 자료 참고

1. selenium 내용정리

 

댓글
댓글쓰기 폼
공지사항
Total
37,630
Today
22
Yesterday
231
링크
«   2020/08   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함