일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- DjangoModel
- CRUD
- 파이썬
- 템플릿상속
- 웹페이지제작
- 랜덤번호
- DjangoUsers
- django
- 템플릿태그
- queryset
- 쿼리셋
- 장고모델
- 장고수정기능
- namespace
- 장고유저모델
- path converter
- 모델폼
- 장고어드민
- 장고
- modelform
- 템플릿필터
- 검색기능
- 글쓰기기능
- get object or 404
- extends
- 장고로그인회원가입
- DjangoAdmin
- 템플릿변수
- detail page 만들기
- Python
- Today
- Total
하루에는
ruby on rails 웹 크롤링 Web Scrapping 본문
아래에 보이는 지식인 질문 제목들을 긁어오는 크롤러를 만들어 보겠습니다.
프로젝트를 하나 생성해주세요. 배쉬창에 $ rails new 프로젝트명 을 입력합니다.
1 | $ rails new crawling |
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 |
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 |
끝. 완성입니다.