티스토리 뷰
Ruby on Rails : 세션이 유지된 로그인 [Gem : Mechanize]
나른한 하루 2019. 12. 16. 17:48해당 글은 https://blog.naver.com/kbs4674/221457563580 로 부터 게시글이 이전되었습니다.
-
크롤링 자료 연결고리
1. Nokogiri를 활용한 크롤링 [클릭]
-
iframe/javascript 기반 사이트에 대해선 크롤링 지원이 안됩니다.
-
selenium에 비해 크롤러가 가볍습니다.
2. Selenium을 활용한 크롤링 [클릭]
-
iframe/javascript 기반 사이트에 대해선 크롤링 지원이 됩니다.
-
Nokogiri에 비해 크롤러가 무겁습니다.
-
크롬 브라우저에 의존합니다. (크롬 브라우저 버전에 신경써야 합니다.)
3. Mechanize를 활용한 크롤링 (Nokogiri + 로그인 기능) [클릭]
- Nokogiri에 로그인 기능이 더해진 크롤러 입니다.
- 개인적으로 대체수단(Selenium)이 있는 만큼, 추천드리진 않습니다.
크롤링을 할 때 때로는 사전에 로그인이 진행된 상태에서 크롤링을 해야하는 경우가 있습니다.
단순히 저희 컴퓨터에서 로그인이 되었다고 해서 수용이 없는게, 크롤링을 하는 서버는 애초에 기본 초반에는 로그인이란 개념 없이 무작정 크롤링을 하는 개념입니다.
이번에는 크롤링 전, 사전에 로그인이 유지된 세션을 하는 방법을 다뤄보고자 합니다.
-
로그인이 유지된 세션 : Mechanize
실습 전 참고
1. 저는 Everytime 홈페이지를 기준으로 설명하겠습니다.
1. Gemfile 을 열람해서 다음 내용을 입력해주세요
gem 'mechanize'
그리고 터미널에 아래 명령어를 입력해서 Gem을 설치해주세요.
bundle instlall
2. 터미널에
rails c
명령어를 입력해서 잠깐 레일즈 콘솔을 활성화 시키고, 다음 코드들을 입력해주세요.
require 'nokogiri'
require 'open-uri'
require 'mechanize'
agent = Mechanize.new
# page = agent.get("[로그인 페이지 URL]")
page = agent.get("https://everytime.kr/login")
저 같은 경우, 로그인 페이지 URL로서 https://everytime.kr/login 을 입력한 결과, 다음과 같은 결과가 나왔습니다.
위 사진 속에서 얻어낸 결과 요소에 대해 다음 과정에 입력하게 될 것입니다.
3. 크롤링 코드(Nokogiri)를 넣고자 하는 lib/tasks 내의 파일 혹은 Controller 에 다음 내용을 입력해주세요.
참고 코드 입력 전 꼭 보세요!
1) 9번 째 줄 같은 경우 2번 과정의 사진 속 빨간 네모의 요소 중 하나를 입력한겁니다.
2) 10번, 11번 째 줄 같은 경우 노란 네모의 특정 값을 입력한 겁니다. (이름은 반드시 유일성을 띄어야 함.)
require 'nokogiri'
require 'open-uri'
require 'mechanize'
# step 1, login:
agent = Mechanize.new
page = agent.get("https://everytime.kr/login")
login = page.form_with(:action => "/user/login")
login.field_with(:name => "userid").value="[아이디]"
login.field_with(:name => "password").value="[암호]"
login_result = agent.submit login
3. 위 과정을 끝으로, 결과를 보면 로그인세션이 적용된 것을 확인하실 수 있습니다.
-
참고 몇 가지 함수
1. link_with(...).click : 클릭 이벤트 발동 혹은 이를 이용하여 페이지 이동을 합니다.
page = agent.get("https:/everytime.kr/login")
... (로그인 ID 및 PASSWORD 입력) ...
login_result = agent.submit login # 로그인 처리
everytime_move = login_result.link_with(:text => "새내기게시판").click # 페이지 이동
2. post : Post 방식으로 데이터를 넘깁니다.
참고 아래 코드 예시에서 Post 방식으로 넘기는 데이터 속성은 에브리타임에 정의된 속성값을 기준으로 합니다.
## ~5번 쨰 줄 : 세션 로그인 처리
page = agent.get("https://everytime.kr/login?redirect=/385899/v/62719719")
... (로그인 ID 및 PASSWORD 입력) ...
login_result = agent.submit login
## 6번 쨰 줄 아래 : Post 방식 데이터 넘김 처리 (게시글 열람)
everytime = agent.post("/find/board/comment/list", {
id: "62719719" # 에브리타임 게시글 ID값
})
3. Nokogiri::HTML((...).body) : 해당 페이지의 내용을 크롤링 합니다.
... (로그인 ID 및 PASSWORD 입력) ...
everytime = agent.get("https://kangwon.everytime.kr/find/community/web")
html = Nokogiri::HTML(everytime.body)
-
자료 참고
1. Youtube 동영상 [클릭]
2. Mechinize 각종 예제 [클릭]
3. Mechinize Click 메소드 사용법 [클릭]
'프로그래밍 공부 > Ruby on Rails : Gem' 카테고리의 다른 글
Ruby on Rails : 구글 Vision API 연동 (0) | 2020.01.02 |
---|---|
Ruby on Rails : 공공 데이터(예시 : 코레일) API 연동하기 (1) | 2019.12.26 |
Ruby on Rails : JWT with devise [gem : jwt] (0) | 2019.12.06 |
Ruby on Rails : 가상 브라우저를 활용한 크롤링 [Gem : selenium-webdriver] (4) | 2019.12.05 |
Ruby on Rails : Nokogiri 크롤링 [Gem : nokogiri] (0) | 2019.12.05 |