Rust와 PyO3를 이용한 웹 스크래핑 파이썬 모듈 개발하기

웹 스크래핑은 다양한 정보를 인터넷에서 수집하는 작업으로, 파이썬은 이를 위한 많은 도구와 라이브러리를 제공합니다. 그러나 때로는 파이썬만으로는 스크래핑 작업을 효과적으로 처리하기 어려울 수 있습니다. 이 때 PyO3를 이용하여 Rust로 작성된 웹 스크래핑 모듈을 개발해보는 것은 좋은 선택입니다.

Rust란?

Rust는 Mozilla가 개발한 시스템 프로그래밍 언어로, 안전성, 속도, 병렬 처리 등의 특징을 갖고 있습니다. 많은 사람들에게 선택되고 있는 이유는 메모리 안전성과 스레드 안정성을 보장한다는 점 때문입니다. Rust는 C나 C++과 같은 저수준 언어의 성능을 제공하면서도, 보다 안전하고 신뢰성 있는 코드 작성을 도와줍니다.

PyO3란?

PyO3는 Rust와 Python을 연결하는 외부 라이브러리입니다. 이를 통해 Rust로 작성된 모듈을 파이썬에서 사용할 수 있습니다. PyO3는 패키지 빌드, CPython 확장 모듈 개발 및 Rust와의 상호 운용성 등을 제공하며, CPython의 C API를 직접 사용하는 것보다 간편하고 안전합니다.

웹 스크래핑 파이썬 모듈 개발하기

다음은 Rust와 PyO3를 이용하여 웹 스크래핑 파이썬 모듈을 개발하는 예제입니다.

use pyo3::prelude::*;
use select::document::Document;
use select::predicate::Name;

#[pymodule]
fn scraping_module(_py: Python, m: &PyModule) -> PyResult<()> {
    #[pyfn(m, "scrape")]
    fn scrape(url: String) -> PyResult<String> {
        let res = reqwest::blocking::get(url)?;
        let body = res.text()?;
        let document = Document::from(body.as_str());

        let title = document
            .find(Name("title"))
            .next()
            .unwrap()
            .text();
        
        Ok(title)
    }
    
    Ok(())
}

#[pymodule]
fn my_module(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(scrape, m)?)?;

    Ok(())
}

#[pymodule]
fn my_package(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_submodule(my_module(py)?)?;

    Ok(())
}

#[pypackage]
fn main(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_submodule(my_package(py)?)?;

    Ok(())
}

위의 예제는 scrape 함수를 통해 주어진 URL에서 HTML 페이지를 가져와서 <title> 태그의 내용을 반환하는 간단한 Rust 모듈을 정의합니다.

모듈 사용 예제

다음은 개발한 웹 스크래핑 파이썬 모듈을 사용하는 예제입니다.

import my_package.my_module

url = "https://example.com"
title = my_package.my_module.scrape(url)
print(title)

실행 결과는 주어진 URL의 웹 페이지 제목이 출력됩니다.

위의 예제처럼 Rust와 PyO3를 이용하여 웹 스크래핑 파이썬 모듈을 개발하면 더욱 효율적이고 안정적인 스크래핑 작업을 수행할 수 있습니다.

결론

Rust와 PyO3를 이용하여 웹 스크래핑 파이썬 모듈을 개발하는 방법을 알아보았습니다. Rust는 안전성과 성능을 제공하며, PyO3는 Rust와 Python을 통합하여 사용하는 도구입니다. 이를 통해 웹 스크래핑 작업을 조금 더 효율적이고 안정적으로 처리할 수 있습니다.

#rust #pyo3