[swift] Swift 웹 크롤링 방법

크롤링은 웹 사이트에서 데이터를 수집하는 프로세스를 의미하며, Swift 언어를 사용하여 웹 크롤링을 할 수 있습니다. 이 글에서는 Swift를 사용하여 웹 사이트에서 데이터를 크롤링하는 방법을 살펴보겠습니다.

1. 웹 페이지에 접속하기

Swift에서는 URLSession을 사용하여 웹 페이지에 접속할 수 있습니다. 다음은 예시입니다.

if let url = URL(string: "https://www.example.com") {
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let error = error {
            print("Error: \(error)")
        } else {
            if let data = data {
                let htmlString = String(data: data, encoding: .utf8)
                print(htmlString)
            }
        }
    }.resume()
}

위의 코드는 URL을 생성하고 URLSession.shared.dataTask(with:completionHandler:) 메서드를 사용하여 데이터를 가져오는 간단한 예제입니다. 데이터는 Data 형식으로 반환되며, 이를 String 으로 변환하여 화면에 출력합니다.

2. HTML 파싱하기

크롤링한 웹 페이지의 데이터를 파싱하여 원하는 정보를 추출해야 합니다. Swift에서는 WebKit을 사용하여 HTML을 파싱할 수 있습니다. 다음은 예시입니다.

import WebKit

let webView = WKWebView()
if let htmlString = htmlString {
    webView.loadHTMLString(htmlString, baseURL: nil)
}

webView.evaluateJavaScript("document.documentElement.outerHTML.toString()", completionHandler: { (html, error) in
    if let error = error {
        print("Error: \(error)")
    } else {
        if let html = html as? String {
            // HTML 파싱 및 데이터 추출
        }
    }
})

위의 코드는 WKWebView를 사용하여 HTML을 로드하고, evaluateJavaScript(_:completionHandler:) 메서드를 사용하여 JavaScript로 DOM 접근하여 HTML을 가져옵니다. 이를 이용하여 필요한 데이터를 추출할 수 있습니다.

3. 데이터 추출하기

HTML 파싱 후, 데이터를 추출하여 사용할 수 있습니다. 이를 위해 Swift에서는 String의 다양한 메서드 및 정규 표현식을 사용할 수 있습니다. 예를 들면, components(separatedBy:) 메서드를 사용하여 문자열을 구분할 수 있습니다.

if let html = html {
    let lines = html.components(separatedBy: "\n")
    for line in lines {
        // 데이터 추출
    }
}

정규 표현식을 사용하여 특정 패턴을 가진 데이터를 찾을 수도 있습니다. Swift에서는 NSRegularExpression을 사용하여 정규 표현식을 처리할 수 있습니다.

let pattern = "<h1>(.*?)</h1>"
let regex = try NSRegularExpression(pattern: pattern, options: [])
let matches = regex.matches(in: html, options: [], range: NSRange(location: 0, length: html.utf16.count))
for match in matches {
    if let range = Range(match.range(at: 1), in: html) {
        let capturedString = html[range]
        // 데이터 추출
    }
}

위의 코드는 <h1> 태그로 둘러싸인 텍스트를 추출하는 간단한 예제입니다.

4. 참고 자료

웹 크롤링에는 서버 측의 허락이 필요한 경우가 있습니다. 합법적으로 데이터를 크롤링하는지 꼭 확인하고, 합법적인 수단으로 크롤링을 진행하는 것이 중요합니다.