Web :: Crawling & LRU Cash

안준성·2022년 8월 22일
0

Web

목록 보기
4/6

Web Crawling

웹 페이지를 수집하고 데이터를 추출하는 작업.
Swift에서는 Selenops, SwiftSoup 등의 패키지를 활용해 구현할 수 있다.

크롤링 전에 먼저 웹 사이트 url 마지막에 /robots.txt을 입력하여 크롤링 가능 여부를 확인한다. (아직은 권고 사항이다.)

robots.txt는 웹 사이트 루트 디렉토리에 존재한다.

ex) https://www.naver.com/robots.txt

  • robots.txt 예)

    User-agent: *
    Disallow: /
    Allow : /$

    User-agent는 제어할 로봇을 뜻하고 /는 모든 페이지(디렉토리), /$는 첫 페이지를 뜻한다.

    따라서 위 예는 모든 유저에 대하여, 첫 페이지에 대한 접근만 허용하고 나머지는 허용하지 않는다는 뜻이다.

참고할만한 자료
What is a web crawler? | How web spiders work
What is the differences between web crawling and web scraping?


SwiftSoup

설치하기에 앞서 SwiftSoup를 사용하기 위해선 CocoaPods이나 Carthage 같은 패키지 의존성 관리 도구를 설정해서 사용해야 한다.

Cocoapods

먼저 cocoapods을 install 해준다.
https://cocoapods.org/ 에 접속해서 따라해보자.


과거는 잊고 Carthage로 새출발을 해보자.
먼저 brew install carthage 를 해준 뒤
Xcode project 폴더에 Cartfile을 만들어주고
파일을 열어 github "scinfu/SwiftSoup" 을 추가해준다.
이후 터미널에 carthage update --use-xcframeworks 입력.

image

그러면 이와 같이 Cartfile.resolved 파일과
Carthage 디렉토리가 생겼을 것이다.
이제 Xcode 프로젝트의 Frameworks & Librarys에
Carthage/Build 안에 있는 .xcframework를 추가해준다.
(IDE 에 있음)
이 때, 어플 개발용이면 Embed & Sign을, 아니라면 Do Not Embed를 선택 하라는데 사실 난 그런거 안 떴다.

image

드디어 import에 성공했다.
간단해보이지만 무려 1시간이 넘게 걸렸다.(아련히 보이는 pod의 흔적)


참고 : https://github.com/scinfu/SwiftSoup


import가 잘 된줄 알았는데
프로젝트를 빌드하니 이상한 에러가 떠서
한참 헤매다 m1 mac 문제인거 같아
지금 블로그 따라 해보고 있는데
안되면 Swift package manager를 써봐야겠다.


결국 안돼서 SPM으로 갈아탔다.

Xcode에서 프로젝트 누르고 Package dependencies 탭에서 +를 누른다. 그리고 나오는 창 우측 상단에 SwiftSoup의 github 주소를 넣어 add package를 하면 끝!

image

제발 한국인이면 SPM 씁시다.


참고 : https://tech.kakao.com/2022/06/02/swift-package-manager


크롤링 단계

  1. 먼저 크롤링할 웹 페이지의 url주소를 구한다.
    • 네이버 검색 쿼리 : https://search.naver.com/search.naver?query=%s
    • 구글 검색 쿼리 : https://www.google.com/search?q=%s
	let myUrl = URL(string: "https://search.naver.com/search.naver?query=apple")
  1. 구한 url 주소로 해당 웹 페이지를 문자열 형태(html 코드)로 가져온다.
	let html = try String(contentsOf: myUrl, encoding: .utf8)
  1. 가져온 html 코드를 parsing하여 DOM 형태(tree 구조)로 반환한다.
	let doc: Document = try SwiftSoup.parse(html)
  1. DOM 객체의 select 메소드를 통해 원하는 데이터를 추출하고 하위 요소들을 다룬다.
	let title:Elements = try doc.select("a.tit")

	let preview:Elements = try doc.select("div.brand_wrap")

	let myTitle = try title.text()

	let myPreview = try preview.text()

	let myLink = try title.attr("href")
  1. 추출한 데이터는 좋은 곳에 쓴다.

  2. 결과
    image

참고할만한 자료 : DOM 소개


쿼리문 : https://pivox.tistory.com/38
정적 웹 크롤링 : https://github.com/JunsangKwon, https://wikidocs.net/142389


Cache

웹이나 모바일 앱 등의 성능 개선에서 가장 많이 사용되는 방법

  • ex) 클라이언트의 http요청, 백엔드의 DB 요청 등

캐시의 용량은 정해져 있으므로 시간적, 물리적 제약사항을 두어 관리한다.

LRU Cache

  • LRU Cache
    image

  • 일반적으로 많이 사용하는 cache 정책

  • 검색 쿼리를 key, 검색 결과 노드를 value로 해서 hash table로 저장하여, O(1)의 데이터 접근을 보장한다.

  • 검색 결과 노드를 double linked list로 저장하여 삽입과 삭제를 O(1)로 보장한다.


profile
안녕하세요

0개의 댓글