💡 크롤링(crawling) 혹은 스크레이핑(scraping)은 웹 페이지를 그대로 가져와서 거기서 데이터를 추출해 내는 행위. 크롤링하는 소프트웨어는 크롤러(crawler)라고 부름.
웹 상에는 데이터가 점점 많아지면서 필요한 데이터를 추출하는 것이 매우 힘들다. 하지만, 크롤링을 이용하면 필요한 데이터를 빠르게 뽑아낼 수 있다. 이러한 크롤링 방식에도 두 가지 방식이 존재한다.
spider
라고 불림크롤링을 무작정하면 어떻게 될까? 크롤링해서는 안되는 데이터가 있을 수도 있고, 수많은 크롤링 봇들이 웹 사이트에 접속하게 되면 과도한 트래픽 또한 발생할 수 있다. 이러한 규제를 만들기 위해서는 robots.txt
파일을 이용한다.
💡 서버에 엑세스하는 봇에 대한 규칙을 입력해 놓은 웹 서버 파일
robots.txt
파일을 확인하도록 프로그래밍 해야함.robots.txt
의 규칙을 확인하고 이를 따라야함.https://naver.com/robots.txt
와 같이 주소창 뒤에 robots.txt
를 입력하면 다운받아 확인할 수 있다.
User-agent: * -> 모든 크롤링 봇
Disallow: /m
Disallow: /login
Disallow: /gateway
Allow: / -> 사이트의 모든 페이지를 제한 없이 탐색 가능
Disallow 페이지는 탐색하지 말란 뜻
robots.txt
가 없으면 어떤 문제가 발생할까?robots.txt
규칙을 지키지 않으면 어떻게 될까?사용자 신분을 대신할 수 있는 소프트웨어이기 때문에, 웹과 관련된 맥락에서는 일반적으로 브라우저 종류나 버전 번호, 호스트 운영체제 등의 정보를 의미한다.
navigator.userAgent
를 입력해 실행하면 user-Agent 값을 확인할 수 있다.'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36’
웹에서는 특정 사이트에 접속하면 불러온 페이지를 캐시에 저장한다. 그렇다면 왜 저장을 하는 것이고 어떤 알고리즘이 사용되는 것일까?
=> 따라서, 캐시는 CPU에서 참조하는 시간을 줄여 성능을 높일 수 있는 임시 메모리를 의미한다.
Doubly Linked List
와 HashMap
으로 구현할 수 있다.Doubly Linked List
와 HashMap
을 결합한 LinkedHashMap
을 이용하여 LRU 알고리즘을 구현할 수 있다.LinkedHashMap
을 사용해야 하는 것일까?⇒ 결과적으로 시간복잡도는 O(1)
이 된다.
⇒ 데이터들의 순서를 기억하는 메모리가 필요하기 때문에 기존의 HashMap보다 메모리 사용량이 더 높다.
LinkedHashMap 을 사용하고 초기 용량을 5로 지정해주었다. 근데 초기용량을 셋팅해놔도 다른 배열의 초기 용량을 셋팅해놓는 것과 다르게 오류가 나지 않았다. 어떤 식으로 동작하는 것인가?
val map = LinkedHashMap<String, Int>(5)
map["김일이"] = 26
map["김이삼"] = 24
map["김삼사"] = 21
map["김사오"] = 20
map["김오육"] = 18
map["김육칠"] = 18
println(map.toString())
그 이유는 HashMap에 데이터를 추가하게 되면 일정 시점에서 해시 테이블이 꽉찬다. 그러면 새로운 해시테이블을 생성하고 기존에 있던 데이터들을 옮긴다. 그렇게 되면 불필요한 데이터 복사를 발생시키므로 성능이 저하되기 때문에 초기 용량을 설정하여 큰 해시테이블을 미리 생성하여 불필요한 복사를 피할 수 있다.
그러므로, 이 경우에도 5의 용량을 지정하였지만 6개의 데이터가 들어가여도 다른 해시테이블이 생성되어 데이터 복사가 된다. 그러므로 오류가 발생하지 않는 것이다.
참고로 해시맵의 기본 초기 용량은 16이다.