초급의 끄적거림

[크롤링] Crawling (크롤링) / robots.txt 본문

기타

[크롤링] Crawling (크롤링) / robots.txt

codingD 2019. 11. 12. 15:15

1. 주의해야할 점


: 저작권 문제에서 자유롭지 않음 → 신문기사, 책, 논문, 사진 등의 자료들은 저작권에 특별히 주의

  +) URL과 프런트단이 분석이 잘 되어야 써먹을 수가 있음

    : URL과 가져오려는 내용이 들어있는 태그를 지정해서 가져오는 것이 중요

 

2. 로봇 배제 표준(robots.txt)


- 웹 사이트에 로봇이 접근하는 것을 방지하기 위한 규약
- 크롤링(Crawling), 스크래핑(Scraping) : 웹페이지의 내용을 가져 오는 것
- 로봇이 수집을 못하게 막을 목적으로 로봇의 접근 관련 내용(크롤링 허가/불허의 여부)을 robots.txt에 적어두는 내용
- 강제성과 의무사항은 없으나 공지를 해놓았으니 법적으로 문제되지 않도록 주의할것
- 업로드 위치 : /WEB-INF/robots.txt

- 모든 로봇에게 문서 접근 허락

  User-agent: *
  Allow: /


- 모든 로봇을 차단

  User-agent: *  # 모든 로봇(robot)들에 적용합니다
  Disallow: /    # 모든 페이지들의 색인(indexing)을 금지합니다

daum의 robots
ytn의 robot.txt

 

3. jsoup 라이브러리 다운로드


  - Jsoup 자체가 HTTP Connection 을 기반으로 만들어졌기 때문에
    단독 라이브러리로도 웹 크롤링이 충분히 가능 합니다.

  - 다운로드
    https://jsoup.org/download -> jsoup-1.11.3.jar

  ① Java Project 추가
     기본 Java Project -> 수동 Build Path를 통해 Jar를 등록

  ② Dynamic Web Project 추가
     해당 프로젝트 -> /WebContent/WEB-INF/lib/jsoup-1.11.3.jar 복사

  ③ 스프링프로젝트 Maven 에서 추가
    <dependency>
      <groupId>org.jsoup</groupId>
      <artifactId>jsoup</artifactId>
      <version>1.11.2</version>
    </dependency>

 

Jsoup 자체가 HTTP Connection을 기반으로 민들어졌기 때문에 단독 라이브러리로 웹크롤링이 충분히 가능

다운로드 : https://jsoup.org/download

 

Download and install jsoup

Download and install jsoup jsoup is available as a downloadable .jar java library. The current release version is 1.12.1. What's new See the 1.12.1 release announcement for the latest changes, or the changelog for the full history. Previous releases of jso

jsoup.org

다운로드 받은 Jsoup의 .jar 를 라이브러리로 넣어줌

 

4. 핵심 클래스


  - Document 클래스 : 연결해서 얻어온 HTML전체 문서
  - Element  클래스 : Document의 HTML요소
  - Elements 클래스 : Element가 모인 자료형

 

 

package net.carwling;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class Test01_myweb {

	public static void main(String[] args) {
		// myweb 프로젝트 게시판 크롤링하기
		try{
			//1) URL 선언
			//URL을 정확히 넣어줘야 함
			String URL = "http://172.16.83.13:8090/myweb/index.jsp";
			
			//2) index.jsp의 HTML 문서 내용 가져오기
			//→ 웹브라우저의 페이지 소스보기와 동일
			Document doc=Jsoup.connect(URL).get();
			
			//3) 가져온 2)의 내용 (doc)을 출력하기
			//모든 내용이 다 나옴 System.out.println(doc.toString());
			System.out.println(doc.text());					//myweb의 텍스트
			System.out.println("---------------------");	
			System.out.println(doc.title());				//myweb의 타이틀
			System.out.println("---------------------");
			System.out.println(doc.body());					//myweb의 body 부분
		}catch(Exception e){
			System.out.println("크롤링 실패 : "+e);
		}//try end

	}//main() end
}//class end

doc.toString()
doc.text()

 

프론트단을 보고 어느정도 이해를 해야 크롤링해올 수가 있음

 - 원하는 글이 들어가 있는 class를 확인하고 가져오기 

package net.carwling;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Test02_soldesk {

	public static void main(String[] args) {
		// soldesk.com 공지사항 제목 크롤링 하기
		try{
			String URL = "http://soldesk.com/board/board_bagic/board_list.asp?";
			//공지사항이 총 3페이지가 존재하기 때문에 페이징이 들어가 있는 URL부터 반복을 돌림
			for(int page=1; page<=3; page++){
				String params="scrID=0000000173&pageNum=9&subNum=1&ssubNum=1";
				params +="&page="+page;
				params +="&bd_num=&act=list&s_string=";
				
				Document doc=Jsoup.connect(URL+params).get();
				//System.out.println(doc.toString());
				
				//공지사항 제목에 <td class="td_left"> 적용된 요소만 가져오기
				Elements elements=doc.select(".td_left");
				for(Element element : elements){
					System.out.println(element.text());
				}//for end
				}//for end
		}catch(Exception e){
			System.out.println("크롤링 실패 : "+e);
		}//try end
	}//main() end
}//class end

 

 

네이버 영화 평점 크롤링 연습

 - 네이버 평점 부분에서 F12 를 이용하여 개발자 모드로 평점부분을 지정하여 url에 복사붙여넣기 하면 나타나는 모습

package net.carwling;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class Test03_navermovie {

	public static void main(String[] args) {
		// 네이버 영화 평점
		try{			
			String URL="https://movie.naver.com/movie/bi/mi/point.nhn?";			
			String params="code=167605&type=after&isActualPointWriteExecute=false&isMileageSubscriptionAlready=false&isMileageSubscriptionReject=false&page=";
			int PAGE=1;
			
			for(PAGE=1; PAGE<=10; PAGE++){
				Document doc=Jsoup.connect(URL+params+PAGE).get();
				System.out.println(doc.toString());
			}//for end
		}catch(Exception e){
			System.out.println("크롤링 실패 : "+e);
		}//try end
	}//main() end
}//class end

1에서 10페이지까지 가져온 내용

 

 - 네이버 평점의 내용이 들어가있는 것이 score_reple 클래스의 p 태그

  : .score_reple p 라고 특정지어서 text를 불러오게 함

package net.carwling;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Test03_navermovie {

	public static void main(String[] args) {
		// 네이버 영화 평점
		try{			
			String URL="https://movie.naver.com/movie/bi/mi/pointWriteFormList.nhn?";			
			String params="code=167605&type=after&isActualPointWriteExecute=false&isMileageSubscriptionAlready=false&isMileageSubscriptionReject=false&page=";
			int PAGE=1;
			
			for(PAGE=1; PAGE<=10; PAGE++){
				Document doc=Jsoup.connect(URL+params+PAGE).get();
				//System.out.println(doc.toString());
				Elements elements=doc.select(".score_reple p"); //p태그로 시작하기 때문에 스페이스바 + p
				for(Element element : elements){
					System.out.println(element.text());
				}
			}//for end
		}catch(Exception e){
			System.out.println("크롤링 실패 : "+e);
		}//try end
	}//main() end
}//class end

Comments