오늘은 자바 스크래핑을 해보겠다.
작업환경은 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으로 만들어서 넘겨줬고 확인해보면
잘 확인이 됩니다.