심심한잉여의 잡동사니

[JAVA/크롤링]Jsoup을 이용한 Java 크롤링 본문

코딩일기/Java

[JAVA/크롤링]Jsoup을 이용한 Java 크롤링

심심한잉여 2022. 11. 15. 10:48
반응형

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.15.3. What's new See the 1.15.3 release announcement for the latest changes, or the changelog for the full history. Previous releases of jso

jsoup.org

라이브러리 다운로드는 위 링크를 통해 받아 라이브러리에 등록

private static testDao dao = new testDao();
	
	public static int insert() {
		List<testAddrModel> list = new ArrayList<>();
		int page = 1;
		int perPage = 100;
        String query = "서울+쑥고개로";
		String url1 = "https://www.juso.go.kr/support/AddressMainSearch.do?currentPage="; 
		String url2 = "&countPerPage=";
		String url3 = "&searchType=HSTRY&searchKeyword="+query+"&firstSort=none&ablYn=N&synnYn=null";
        
		// 도로명 주소 링크 조합 토탈 값을 크롤링하기 위해 최소 값으로 입력
        String totalUrl = url1+1+url2+1+url3;
		String allUrl = null;
		int total = 0;
		
		try {
        	//url을 조합하여 connection
			Connection conn = Jsoup.connect(totalUrl);
			
            // connection 된 페이지의 코드 가져오기
			Document html = conn.get();
            
            // 가져온 코드에서 토탈이 있는 class 찾기
			Elements totalEls = html.getElementsByClass("count");
            
            // 해당 클래스는 1개이기에 0번째 인덱스 값에 있는 객체 가져오기
			Element el = totalEls.get(0);
            
            // 가져온 값을 .text() 메소드를 통해 값 추출 및 ,를 replace 및 parseInt해주어 int로 변환
			total = Integer.parseInt(el.text().replaceAll("\\,",""));
            
            // 총 페이지 구하기
			page = total/perPage;
			if(total%perPage != 0) {
				page += 1;
			}
			
            //구한 총 페이지 갯수에 맞춰 url를 수정해 모든 페이지 조회하는 for문 돌리기
			for(int i = 0; i<page; i++) {
				allUrl = url1 +(i+1)+ url2 + perPage + url3;
				Connection connAll = Jsoup.connect(allUrl);
				Document htmlAll = connAll.get();
                
                // 값이 있는 클래스 가져오기
				Elements elsAll = htmlAll.getElementsByClass("row");
                
                // 가져온 클래스를 순회하여 모든 row값 조회하기
				for(Element elAll : elsAll) {
                
                	// id값 크롤링
					String docId = elAll.getElementsByClass("num").get(0).text();
                    
                    // 도로명주소 값 크롤링
					String addr1 = elAll.getElementsByClass("roadNameText").get(0).text();
					
                    // 값을 담을 모델 생성
					testAddrModel model = new testAddrModel();
					
                    //set을 통해 값 넣기
					model.setDocId(docId);
					model.setAddr1(addr1);
					
                    //리스트에 담기
					list.add(model);
				}
			
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		// 리스트 반환
		return dao.insert(list);
		
	}

위 코드와 같이 도로명 주소를 가져오는 예제를 작성해보았다.

해당 페이지는 class로만 이뤄져있고 id값은 없어 다소 귀찮은 부분이 있었으나 그럼에도 불구하고 위 코드와 같이 간단히 작성이 가능하다.

jsoup 라이브러리를 사용하면 간단하게 사용이 가능 할 것으로 보인다.

반응형