- 검색 서비스에 검색 요청 보내기
- 검색 요청 데이터 받기
- 검색 데이터 파싱/처리 하기 (제목, 링크주소, 미리보기)
- 결과 보여주기
- 사용자 입력 받아서 출력하기
- 입력 값에 따라 검색 요청 보내기
- 크롤링 모듈을 사용하여 결과 출력하기
- 검색키워드, 데이터 개수 LRU 캐시 만들기
- 검색시, 결과 받았을 시 LRU 정책에 따라 캐시 수정하기
axios를 사용하여 요청을 보냈다.
const res = await axios.get("https://search.naver.com/search.naver?where=news&ie=UTF-8&query=" + encodeURI(text));
cheerio를 사용하여 데이터를 받았다 (html 포맷을 사용하기 위하여)
const data = cheerio.load(res.data);
위와 같이 네이버 기사를 중심으로 html 태그를 통하여 파싱하였다.
function ask(input) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
return new Promise(resolve => rl.question(input, ans => {
rl.close();
resolve(ans);
}))
}
사용자의 입력을 계속 받기 위하여 다음과 같이 Promise객체를 만들어서 사용하였다.
크롤링 모듈을 가져와 사용하였다.
class Cache {
constructor(size) {
this.cache = new Map();
this.time = 0;
this.len = size;
}
get(key) {
}
set(key) {
}
}
다음과 같은 캐시 구조를 만들었다. 데이터 캐시와 키워드 캐시는 위 구조로 기반으로 하지만,
set, get 함수가 약간 다르다 .
키워드 캐시의 경우는 get을 할때 캐쉬에 있으면 true를 리턴하고 캐쉬의 시간을 수정한다. 또한 set을 할떄 cache 데이터 구조 또한 cache['key'] = time 으로 간단하다.
하지만 데이터 캐시의 경우 get을 할때 있으면 [True, data] 없으면 [False, 0]을 리턴하고 cache 데이터 구조 또한 {data:[검색결과들], time:time} 으로 조금더 복잡하다.
데이터 캐쉬와 키워드 캐쉬의 수가 다르기 때문에 다음과 같은 상황을 고려해주었다.
- 키워드 캐시에 있고 데이터 캐쉬도 있을때
이 경우에는 캐쉬에 있는 데이터를 가져왔다. - 키워드 캐시에 없고 데이터 캐쉬에 있을때
이 경우네는 키워드 캐시에 set을 해주고 캐쉬에 있는 데이터를 가져왔다 (키워드 캐쉬보다 데이터 캐쉬의 크기가 크기 떄문에 가능할 듯?) - 그외 상황
서버에 접근해서 데이터와 키워드를 캐쉬에 등록했다.
캐쉬 데이터를 직접적으로 출력했다.