JAVA Scraping

초보자·2022년 12월 19일
0

JAVA

목록 보기
1/1

오늘은 자바 스크래핑을 해보겠다.
작업환경은 Spring Boot 이고 라이브러리는 Jsoup을 사용한다

우선 Maven에 Jsoup를 추가해주자

<dependency>
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.14.2</version>
</dependency>

스크래핑할 화면은 네이버 시가총액 순위 1~50위까지 입니다.

F12눌러 개발자 도구를 이용해 스크래핑할 HTML구성을 확인해보면 위와 같이 .type_2 에 thead, tbody 입니다
그리고 스크래핑한 값들을 print해서 확인해보면

잘 나오는 것을 확인할 수 있습니다 해당 코드는

@Override
	public List<Object> getStockPriceList() {
	    final String stockList = "https://finance.naver.com/sise/sise_market_sum.nhn?&page=1";
	    Connection conn = Jsoup.connect(stockList); 
	    List<Object> arr = new ArrayList<>();
	     Map<String,String> map = new HashMap<String,String>(); 

	    try {
	      Document document = conn.get();
	      ArrayList<String> arrthead = getStockHeader(document); // 칼럼명
	      ArrayList<ArrayList<String>> arrtbody = getStockList(document);   // 데이터 리스트
	      System.out.println(arrthead);
	      System.out.println(arrtbody);
	      for (int i =0; i < arrtbody.size(); i++) {
	    	  map.put(arrthead.get(0), arrtbody.get(i).get(0));
	    	  map.put(arrthead.get(1), arrtbody.get(i).get(1));
	    	  map.put(arrthead.get(2), arrtbody.get(i).get(2));
	    	  map.put(arrthead.get(3), arrtbody.get(i).get(3));
	    	  map.put(arrthead.get(4), arrtbody.get(i).get(4));
	    	  map.put(arrthead.get(5), arrtbody.get(i).get(5));
	    	  map.put(arrthead.get(6), arrtbody.get(i).get(6));
	    	  map.put(arrthead.get(7), arrtbody.get(i).get(7));
	    	  map.put(arrthead.get(8), arrtbody.get(i).get(8));
	    	  map.put(arrthead.get(9), arrtbody.get(i).get(9));
	    	  map.put(arrthead.get(10), arrtbody.get(i).get(10));
	    	  map.put(arrthead.get(11), arrtbody.get(i).get(11));
	    	  map.put(arrthead.get(12), arrtbody.get(i).get(12));
	    	  // Map -> JSON
	    	  JSONObject jsonObject = new JSONObject(map);
	    	  arr.add(jsonObject);
	    	  System.out.println(arr);    
	      }
	  
	     
	    } catch (IOException ignored) {
	    }

		return arr;
	  }

	  public ArrayList<String> getStockHeader(Document document) {
	    Elements stockTableBody = document.select("table.type_2 thead tr");
	    StringBuilder sb = new StringBuilder();
	    ArrayList<String> arr = new ArrayList<String>();
	    for (Element element : stockTableBody) {
	      for (Element td : element.select("th")) {
	        sb.append(td.text());
	        sb.append("   ");	     
	        arr.add(td.text());
	      }
	      break;
	    }
	    //System.out.println(arr);
	    return arr;
	  }

	  public ArrayList<ArrayList<String>> getStockList(Document document) {
	    Elements stockTableBody = document.select("table.type_2 tbody tr");
	    StringBuilder sb = new StringBuilder();
	    ArrayList<ArrayList<String>> arr2 = new ArrayList<ArrayList<String>>();
	    for (Element element : stockTableBody) {
	      if (element.attr("onmouseover").isEmpty()) {
	        continue;
	      }

	      ArrayList<String> arr = new ArrayList<String>();
	      for (Element td : element.select("td")) {
	        String text;
	        if(td.select(".center a").attr("href").isEmpty()){
	          text = td.text();
	        }else{
	          text = "https://finance.naver.com"+td.select(".center a").attr("href");
	        }
	        sb.append(text);
	        sb.append("   ");
	        arr.add(text);
	      }
	      arr2.add(arr);
	      sb.append(System.getProperty("line.separator")); //줄바꿈
	    }
	    //System.out.println(arr2);
//	    return sb.toString();
	    return arr2;
	  }

위와 같고 Service와 Impl을 만들어서 구현했습니다.
데이터를 JSON으로 만들어서 넘겨줬고 확인해보면

잘 확인이 됩니다.

profile
까먹기전에 기록하자

0개의 댓글