본문 바로가기
IT 개발/JAVA

JAVA 크롤링 - jsoup 사용

by Love of fate 2024. 5. 1.
728x90
반응형

크롤링 이미지

JAVA 크롤링 - jsoup 사용

 

근로자의 날 간만에 쉬면서 코딩을 해봤다.

전부터 해보고싶었던 크롤링인데 이번에 공부할 겸 간단한 예제를 만들었다.

크롤링은 정적 페이지 크롤링이 있고 동적 페이지 크롤링있는데 분류는 다음과 같다

 

정적 : jsoup

동적 : selenium 

 

올리브영 페이지에서 랭킹에 들어가있는 이미지만 따로 추출해서 로컬에 저장하는 로직을 짰다. 

크롤링으로 더 많은 데이터를 추출해 올 수 있는데 마음대로 추출해서 사용하는 것은 조심해야한다. 

개인적으로 테스트하거나 또는 회사 프로젝트로 진행하는 것이 아니면 권장하지 않는다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package test;
import org.apache.commons.codec.binary.Base64;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.jupiter.api.Test;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Paths;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class JUnitTest {
 
 
    /**
     * 크롤링 테스트
     * jsoub과 Selenium
     * jsoub은
     * 특정 페이지에서 document는 잘 받아오지만
     * element를 제대로 받아오지 못한다고한다.
     *
     * Selenium은 동적 페이지도 크롤링이 가능하다고 한다.
     *
     * 크롤링(crawling)
     * 컴퓨터 소프트웨어 기술로 웹 사이트들에서 원하는 정보를 추출하는 것
     */
    @Test
    public void test() throws IOException {
        System.out.println("Test성공");
 
        String url = "https://www.oliveyoung.co.kr/store/main/getBestList.do?dispCatNo=900000100100001&utm_source=google&utm_medium=shopping_search&utm_campaign=onpro_emnet_googlepmax_0101_1231&utm_content=pc_rankingtotal&utm_source=google&utm_medium=pmax&utm_campaign=onpro_emnet_googlepmax_0101_1231&utm_term=&_CAD=google_pmax&gad_source=1&gclid=Cj0KCQjw0MexBhD3ARIsAEI3WHL7lOq7ZI5UHu5EseZ_yO1-mR6IFO4P3yWettQ1mlrd0xoqCGe0-dkaAn16EALw_wcB";
 
        Document doc = Jsoup.connect(url).get();
        Elements imgs = doc.select("img");
 
        for (Element img : imgs) {
 
            Pattern pattern = Pattern.compile("<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>"); //img 태그 src 추출 정규표현식
            Matcher matcher = pattern.matcher(img.toString());
 
            while(matcher.find()){
                System.out.println();
 
                String fileUrl = matcher.group(1);
 
                URL url1 = new URL(fileUrl);
 
                HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
 
                int responseCode = conn.getResponseCode();
                if(responseCode == HttpURLConnection.HTTP_OK){
 
                    // 데이터를 읽기위한 입력 스트림
                    InputStream is = null;
                    // 데이터를 쓰기위한 출력스트림
                    // file이기 때문에 FileOutputStream 사용
                    FileOutputStream os = null;
 
                    is = conn.getInputStream();
 
                    // outputDir : 다운로드 받을 경로
                    // outputFileName : 다운로드 받은 파일 이름
                    os = new FileOutputStream(new File("경로"String.valueOf(img.attributesSize() + is.hashCode()  + ".jpg")));
 
                    final int BUFFER_SIZE = 4096;
                    int bytesRead;
                    byte[] buffer = new byte[BUFFER_SIZE];
 
                    // 입력스트림에 값이 없을때까지 모두 읽기
                    while((bytesRead = is.read(buffer)) != -1){
                        os.write(buffer, 0, bytesRead);
                    }
 
                    // 스트림 닫기
                    os.close();
                    is.close();
                }
            }
        }
    }
}
cs

 

 

 * 한줄평

selenium은 다음에 사용해서 다시 올려야겠다.

이렇게 혼자서 코딩해보는거 너무 재미있다. ㅋㅋㅋㅋ   

728x90
반응형