반응형
매번 하나 하나 할 때마다 새롭다. ^^; 좋은건가?
특정 URL을 크롤링하기 위해서 파라미터를 생성하는 작업만 하는데 수십분이 소요되고 있어서 시간을 줄여보고자 최초 1회에 한하여 수집되는 파라미터 정보를 csv파일에 적재시키고 그 다음부터는 csv파일을 읽어서 처리를 할려고 한다.
csv파일 생성/읽기는 메이븐 의존성을 추가해서 해결을 했다.
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>4.1</version>
</dependency>
다음은 Map<String, String>으로 만들어진 ArrayList에 있는 정보를 JSON스트링으로 변환을 해서 저장을 하려고 한다.
try
{
ArrayList<Map<String, String>> parameters = data.getParameterList();
ObjectMapper mapper = new ObjectMapper(); String json = "";
StringBuffer buffer = new StringBuffer();
for (int i =0; i < parameters.size();i++) {
Map<String, String> map = parameters.get(i);
json = mapper.writeValueAsString(map);
json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map);
json = json.replace("\n", "|");
json = json.replace("\"","\'");
buffer.append(json);
if (i < parameters.size()-1) {
buffer.append("\n");
}
}
CsvUtils.createCsvFile(FILE_PATH,FILE_NAME, buffer.toString());
}catch (JsonGenerationException e) {
logger.info(" >> error : "+ e.getMessage());
return false;
} catch (JsonMappingException e) {
logger.info(" >> error : "+ e.getMessage());
return false;
} catch (IOException e) {
logger.info(" >> error : "+ e.getMessage());
return false;
}
ObjectMapper를 이용해서 JSON문자열로 변경을 했다. json.replace하는 곳에서 보면 더블쿼터(")의 경우 싱글쿼터(') 로 치환하는 부분이 있는데 이상하게도 저장된 JSON문자열을 읽어 들일때 더블쿼터(")가 짤리는 현상이 발생하여 혹시나 하고 싱글쿼터로 변경을 해서 저장했더니 이상없이 잘 되었다. 왜 그런지는 찾아보지 못했다.
저장된 파일을 읽어 들이는 예제.
/**
* 저장되어 있는 파라미터 JSON을 Map으로 변경해서 배열에 추가
* 이후 기존 로직타고 내려가도록 처리 / add by yh.min 20.02.26
*/
for (int i = 0; i < parameters.size(); i++) {
try {
ObjectMapper mapper = new ObjectMapper();
String json = parameters.get(i).replace("|", "\n").replace("\'","\"");
HashMap<String, String> map = new HashMap<String, String>();
map = mapper.readValue(json, new TypeReference<Map<String, String>>(){});
parameterList.add(map);
} catch (JsonGenerationException e) {
logger.info(">> JsonGenerationException : "+ e.getMessage());
} catch (JsonMappingException e) {
logger.info(">> JsonMappingException : "+ e.getMessage());
} catch (JsonParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
다수 좀 복잡스럽긴 한데 처음 JSON으로 만들 때 그대로의 문자열로 복원(JSON)하고 HashMap으로 다시 만들고 파라미터로 사용할 수 있도록 조처를 취했다.
파라미터 만드는 시간을 단축하고 크롤링이 빨리 끝날 수 있도록 조금이나마 개선이 된 것 같다.
반응형
'프로그래밍 > Spring' 카테고리의 다른 글
스프링 웹 플로의 데이터 범위의 유형 (0) | 2020.09.24 |
---|---|
스프링 웹 플로의 상태 유형 (0) | 2020.09.24 |
ClassPathResource를 이용한 file 생성 (0) | 2020.02.26 |
Failed to complete request: org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.AbstractMethodError: Method (0) | 2020.02.10 |
Mybatis & maridb log4jdbc설정 예. (0) | 2020.02.05 |