일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- It
- 자원봉사
- 봉사활동
- Ruby
- Android
- 휘북이
- 이벤트
- c++
- rails
- 독후감
- 휘북이학교
- 루비온레일즈
- 휘파람부는거북이
- 친구초대
- 에뮬레이터
- 자원활동
- Ruby on Rails
- 레일즈
- MariaDB
- 성산2동
- 휘파람
- ror
- 마포구
- 프로그래밍
- 안드로이드
- 루비
- Visual Studio Emulator
- 크롤링
- 비주얼 스튜디오
- Visual Studio
- Today
- Total
DailyOscar
[Ruby on Rails] 네이버 실시간 급상승 검색어 크롤링 본문
Window의 Chrome브라우저로
c9.io에 접속하여 루비온레일즈 프로젝트로 진행하였음
-------------------------------------------------------------------
Nokogiri 젬을 사용한다.
설치과정은..
http://www.nokogiri.org/tutorials/installing_nokogiri.html
에 잘 나와있다.
gem install nokogiri
설치 완료 후..
긁어올 네이버 실시간 급상승 검색어 부분의 HTML 소스를 살펴보자
사용하는 브라우저의 개발자모드를 써도 되고
오른 마우스클릭 후 페이지소스보기 해도 된다
ah_roll 이란 클래스명을 가진 div 태그 의 자식으로 ah_roll_area div태그가 있고
그 자식으로 ul이 있고 그 밑에 li 태그들로 구성된다.
실제적으로 보여지는 것은 ah_r, ah_k 클래스명을 가진 span 태그들이다.
ah_r과 ah_k 클래스명을 가진 span의 text에 접근하기 위한 컨트롤러의 코드구성은 다음과 같다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
require 'nokogiri'
require 'open-uri'
class HomeController < ApplicationController
def index
@ranking = []
doc = Nokogiri::HTML(open("https://www.naver.com"))
doc.css('.ah_roll .ah_roll_area ul li').each do |element|
@ranking << {
rank: element.css('span.ah_r').text,
keyword: element.css('span.ah_k').text
}
end
end
end |
cs |
5. 컨트롤러와 연결될 뷰파일의 이름과 동일하게 지정
6. 크롤링 결과를 삽입할 배열
8. Nokogiri로 데이터를 수집할 URL 지정
10. 8번 라인의 실행결과로 반환된 객체에는 HTML이 파싱되어 있다.
파싱된 HTML에 대해 css 메소드를 수행하면 주어진 파라미터를 타고들어갈 수 있다
파라미터의 뜻은 다음과 같다.
ah_roll 클래스 밑에 ah_roll_area 클래스 밑에 ul 밑에 li
ㅋㅋ
10번 라인을 반복 수행하면 element에 들어있는 요소는 다음과 같다.
((((((실시간 검색어라 키워드가 바뀌어있음...)))))))
스크롤 올리고 내리기 귀찮으니... 이쯤에서 다시 소스를 보면
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
require 'nokogiri'
require 'open-uri'
class HomeController < ApplicationController
def index
@ranking = []
doc = Nokogiri::HTML(open("https://www.naver.com"))
doc.css('.ah_roll .ah_roll_area ul li').each do |element|
@ranking << {
rank: element.css('span.ah_r').text,
keyword: element.css('span.ah_k').text
}
end
end
end |
cs |
10번을 반복하면서 얻게 된 소스에 대해 원하는 정보를 위해 다시 한 번 가공한다
요소중에 span태그인데 ah_r을 클래스로 갖는 녀석의 text를 가져와서 rank에 넣어줘
요소중에 span태그인데 ah_k을 클래스로 갖는 녀석의 text를 가져와서 keyword에 넣어줘
그렇게 반복하면서 ranking 배열에 쌓는다.
cf) 다음과 같이 구성도 가능하다. 굳이 설명달지 않겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
require 'nokogiri'
require 'open-uri'
class HomeController < ApplicationController
def index
@ranking = []
doc = Nokogiri::HTML(open("https://www.naver.com"))
doc.css('.ah_roll .ah_roll_area ul li').each do |element|
@ranking << {
rank: element.css('span')[0].text,
keyword: element.css('span')[1].text
}
end
end
end |
cs |
cf2)
1 |
rank: element.css('span')[0]['class'], |
cs |
위와같이 조사하면 class에 지정된 문자열을 들고온다. (ah_r)
컨트롤러 끝.
(1). ((내가 원하는 태그의 내용을 가져오는 방법은 다양합니다. 하여튼간에 태그간 관계를 잘 파악하는 게 중요함.))
(2). ((다 필요없이 .ah_r, .ah_k 로 서칭해도 상관없지만.. 그러면 원치않는 결과가 나올 수 있음))
(3). ((내가 원하는 태그의 값을 정확하게 알려주는 게 중요하다))
================================================================================
이제 뷰를 살펴보자.
파일이름은 컨트롤러에서 def index로 지정하였기 때문에
index.html.erb가 되어야한다
1
2
3 |
<% for i in 0 ... @ranking.size %>
<%= @ranking[i][:rank] %> 위 : <%= @ranking[i][:keyword] %> <br>
<% end %> |
cs |
소스는 세상 간단하다.
컨트롤러에서 정의한 ranking 배열의 size만큼 반복하며
ranking[i]번째에 위치한 [:rank]와 [:keyword] 를 출력한다.
이제와 말이지만,
나는 사실 이 크롤링을 처음으로 루비온레일즈를 접했다.
그래서
[:rank]를 알아내는데 상당히 애먹었다..
.rank 안되고
:rank 안되고
['rank'] 안되고 막 다 안되서 짜증폭발할 때 쯤 알았다.
하여튼 코드작성 끝
런
저런 사람들, 저런 것들이 지금 이슈인가부다.
크롤링으로 특정 사이트를 긁어와 다른 서비스를 하려고 계획 중인 사람이 있다면..
불법인지 아닌지 잘 확인해보자.
끝.
'IT' 카테고리의 다른 글
Windows의 CMD로 드라이브 이동하기 (0) | 2018.04.20 |
---|---|
크롤링 해도 되는 사이트인가? (0) | 2017.11.30 |
IntelliJ에서 Visual Studio Emulator 사용하기 (0) | 2016.09.23 |
Visual Studio Emulator for Android 설치 및 사용하기 (0) | 2016.09.23 |
비주얼 스튜디오 코드 편집 창에 배경화면 넣기! [ClaudiaIDE] (0) | 2016.05.02 |