하루에는

ruby on rails 웹 크롤링 Web Scrapping 본문

Ruby on Rails

ruby on rails 웹 크롤링 Web Scrapping

에는 2018. 11. 2. 22:14

아래에 보이는 지식인 질문 제목들을 긁어오는 크롤러를 만들어 보겠습니다.



프로젝트를 하나 생성해주세요. 배쉬창에 $ rails new 프로젝트명 을 입력합니다.

1
$ rails new crawling


cs





1. bash 창에 출력하기


ruby파일을 하나 생성해줍니다. 저는 crawling.rb 파일을 하나 생성했습니다.





루비 파일에 다음과 같이 써줍니다.


doc = Nokogiri::HTML(open(주소))

주소에는 긁어올 사이트의 주소를 써주세요. 저는 말씀드린대로 지식인 Q&A 페이지를 가져왔습니다.


1
2
3
4
# crawling.rb

require 'open-uri'
require 'nokogiri'
 
doc = Nokogiri::HTML(open("https://kin.naver.com/qna/list.nhn?queryTime=2018-07-14%2002%3A07%3A35&page=1"))
cs




긁어올 페이지에서 개발자 도구(F12 또는 ⌥+⌘+I)를 켠 뒤 긁어올 텍스트를 찾고, 어떤 태그에 들어있는지를 확인합니다.

가능한 텍스트와 가장 가까운 태그를 찾습니다.





이 페이지의 경우 질문 텍스트가 담긴 가장 가까운 태그는 a, 가장 가까운 클래스는 title이네요.




루비파일에 추가로 doc.css 메서드를 작성합니다.

doc.css(tag) 메소드는 아래에 적혀있듯이 doc이 가리키는 페이지에서 괄호 안에 적힌 tag(태그, 클래스, 아이디)에 해당되는 것을 전부 가져옵니다.

태그는 '태그명', 클래스는 '.클래스명', 아이디는 '#아이디명' 같은 형식으로 가져옵니다.

아래의 경우는 'title' 클래스 안의 'a' 태그이므로 괄호 안에 ".title a"를 써줍니다.


아래의 each 반복문은

doc에 저장된 문서를 css형태로 파싱하여 하나씩 출력한다는 것을 의미합니다.

1
2
3
4
5
6
7
8
9
10
# crawling.rb

require 'open-uri'
require 'nokogiri'
 
doc = Nokogiri::HTML(open("https://kin.naver.com/qna/list.nhn?queryTime=2018-07-14%2002%3A07%3A35&page=1"))
 
# doc.css(tag) 메소드 : doc에 있는 것들 중 괄호에 해당되는 tag태그를 모두 가져온다.
doc.css(".title a").each do |x|
    puts x
 
end
cs





배쉬창에 크롤링 결과를 출력해보겠습니다.

프로젝트 배쉬창에 $ ruby 파일명.rb 를 입력합니다.

1
$ ruby crawling.rb
cs


결과값에서 지저분한 태그들을 지워주겠습니다.

puts x 뒤에 .inner_text를 추가합니다.

1
2
3
4
5
6
7
8
9
10
# crawling.rb

require 'open-uri'
require 'nokogiri'
 
doc = Nokogiri::HTML(open("https://kin.naver.com/qna/list.nhn?queryTime=2018-07-14%2002%3A07%3A35&page=1"))
 
# doc.css(tag) 메소드 : doc에 있는 것들 중 괄호에 해당되는 tag태그를 모두 가져온다.
doc.css(".title a").each do |x|
    puts x.inner_text
 
end
cs





다시 루비파일을 실행해봅시다.


1
$ ruby crawling.rb
cs


깔끔하게 제목들만 출력됩니다.





2. web에 출력하기


이제는 웹에 출력해보겠습니다.

컨트롤러, 메소드, 뷰파일 생성 후 라우팅 연결을 해줍니다.

bash창에 $ rails g controller 컨트롤러명 뷰파일명 을 입력합니다.

1
$ rails g controller crawler list
cs



컨트롤러에 다음과 같이 작성합니다.
nokogiri 젬이 없다면 설치해서 $ bundle install 후 진행해주세요.
doc.css(tag) tag안의 내용을 좀 더 자세하게 작성했습니다.

컨트롤러에 작성 시에는 변수를 이용해야 뷰에 출력할 수 있기 때문에, @list라는 새로운 array 변수를 생성했습니다.
그리고 each 반복문으로 x.inner_text의 값을 순서대로 @list에 하나씩 추가했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# crawler_controller.rb
 
require 'open-uri'
require 'nokogiri'
 
class CrawlerController < ApplicationController
  def list
      @list = Array.new
      doc = Nokogiri::HTML(open("https://kin.naver.com/qna/list.nhn?queryTime=2018-07-14%2002%3A07%3A35&page=1"))
      doc.css("tbody#au_board_list tr .title a").each do |x|
        @list << x.inner_text
    end
  end
end
 
cs




list.html.erb에 아래와 같이 작성합니다.

@list에 들어있는 값을 each 반복문으로 하나씩 출력해줍니다.

1
2
3
4
5
6
7
8
9
10
<!-- list.html.erb -->
 
<h1>result</h1>
 
<% @list.each do |list| %>
    <p>
        <%list %>
    </p>
<% end %>
 
cs



서버를 돌려서 확인해봅니다.
1
$ rails s
cs




끝. 완성입니다.



Comments