웹 페이지를 수집하고 데이터를 추출하는 작업.
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를 사용하기 위해선 CocoaPods이나 Carthage 같은 패키지 의존성 관리 도구를 설정해서 사용해야 한다.
먼저 cocoapods을 install 해준다.
https://cocoapods.org/ 에 접속해서 따라해보자.
과거는 잊고 Carthage로 새출발을 해보자.
먼저 brew install carthage 를 해준 뒤
Xcode project 폴더에 Cartfile을 만들어주고
파일을 열어 github "scinfu/SwiftSoup" 을 추가해준다.
이후 터미널에 carthage update --use-xcframeworks 입력.
그러면 이와 같이 Cartfile.resolved 파일과
Carthage 디렉토리가 생겼을 것이다.
이제 Xcode 프로젝트의 Frameworks & Librarys에
Carthage/Build 안에 있는 .xcframework를 추가해준다.
(IDE 에 있음)
이 때, 어플 개발용이면 Embed & Sign을, 아니라면 Do Not Embed를 선택 하라는데 사실 난 그런거 안 떴다.
드디어 import에 성공했다.
간단해보이지만 무려 1시간이 넘게 걸렸다.(아련히 보이는 pod의 흔적)
참고 : https://github.com/scinfu/SwiftSoup
import가 잘 된줄 알았는데
프로젝트를 빌드하니 이상한 에러가 떠서
한참 헤매다 m1 mac 문제인거 같아
지금 블로그 따라 해보고 있는데
안되면 Swift package manager를 써봐야겠다.
결국 안돼서 SPM으로 갈아탔다.
Xcode에서 프로젝트 누르고 Package dependencies 탭에서 +를 누른다. 그리고 나오는 창 우측 상단에 SwiftSoup의 github 주소를 넣어 add package를 하면 끝!
제발 한국인이면 SPM 씁시다.
참고 : https://tech.kakao.com/2022/06/02/swift-package-manager
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")
let html = try String(contentsOf: myUrl, encoding: .utf8)
let doc: Document = try SwiftSoup.parse(html)
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")
추출한 데이터는 좋은 곳에 쓴다.
냠
결과
참고할만한 자료 : DOM 소개
- DOM-model
쿼리문 : https://pivox.tistory.com/38
정적 웹 크롤링 : https://github.com/JunsangKwon, https://wikidocs.net/142389
웹이나 모바일 앱 등의 성능 개선에서 가장 많이 사용되는 방법
캐시의 용량은 정해져 있으므로 시간적, 물리적 제약사항을 두어 관리한다.
LRU Cache
일반적으로 많이 사용하는 cache 정책
검색 쿼리를 key, 검색 결과 노드를 value로 해서 hash table로 저장하여, O(1)의 데이터 접근을 보장한다.
검색 결과 노드를 double linked list로 저장하여 삽입과 삭제를 O(1)로 보장한다.