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
반응형
'IT 개발 > JAVA' 카테고리의 다른 글
카카오 로그인 API 사용기 - (1) (0) | 2024.05.06 |
---|---|
[JAVA] DTO to DTO / modelMapper Bean 등록 사용 (0) | 2023.11.24 |
[JAVA] 향상된 for 순환문 (for in) (0) | 2023.09.21 |
주석은 이렇게 다는 거다 (0) | 2023.07.19 |
[JAVA] XML 파싱하기 - Document Class 사용 / 마샬, 언먀샬 (0) | 2023.04.23 |