티스토리 뷰

반응형
SMALL

 

JavaScript 개발자라면 누구나 한 번쯤은 웹 스크랩핑과 데이터 파싱에 대해 고민해본 적이 있을 것입니다. 그런 개발자들에게 Deno는 새로운 대안이 될 수 있습니다. Node.js를 만든 Ryan dahl이 개발한 새로운 JavaScript 및 TypeScript 런타임인 Deno는, 보안 및 모듈 시스템을 개선하고 웹 표준을 적극적으로 수용하였습니다.

 

공식 홈페이지 : https://deno.land/

이 글에서는 Deno를 이용하여 웹 스크랩핑을 진행하는 방법과, XML 데이터를 파싱하는 방법을 살펴보도록 하겠습니다. 각각 다양한 라이브러리를 활용하여 '위키피디아'에서 특정 정보를 추출하거나, '기상청'의 일기 예보를 가져오는 등의 예제로 살펴보도록 하겠습니다.

 

먼저, Deno 프로젝트를 생성하는 방법을 알아보겠습니다. 터미널에서 아래와 같이 입력하면 Deno 프로젝트를 생성할 수 있습니다.

(임의이 디렉토리 deno를 생성하고, 디렉토리를 이동해 init 명령으로 프로젝트를 생성합니다.)

$ mkdir deno
$ cd deno
$ deno init

 

이번 포스트를 시작으로, 앞으로의 글에서는 특별히 다른 방법이 필요하지 않으면 프로젝트 생성에 대한 부분은 생략하겠습니다.

프로젝트 생성이 완료되었다면, 이제 Deno를 활용해 웹 스크랩핑과 XML 파싱을 어떻게 진행하는지 알아보도록 하겠습니다.

 

 

Deno를 활용한 웹 스크랩핑 이해하기


웹 스크랩핑은 웹 사이트에서 원하는 정보를 추출하는 과정입니다. 이는 웹 사이트의 HTML을 가져오고(크롤링), 그 다음에 HTML에서 원하는 데이터를 선택하여 추출하는(파싱) 단계로 이루어집니다.

웹 스크랩핑을 위해 Cheerio라는 라이브러리를 활용할 수 있습니다. Cheerio는 jQuery와 유사한 API를 제공하여 HTML 문서를 쉽게 탐색하고, 필요한 정보를 추출할 수 있게 해줍니다. Cheerio는 Node.js 환경에서 널리 사용되는 라이브러리지만, Deno에서도 사용이 가능합니다.

다음은 Cheerio를 이용하여 '위키피디아' 대한민국 페이지에서 주요 정보를 추출하는 Deno 스크립트의 예입니다.

 

import * as cheerio from "https://esm.sh/cheerio";

const url = 'https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD';

try {
  const res = await fetch(url);
  const html = await res.text();
  const $ = cheerio.load(html);

  const countryInfo = $('.infobox.geography.vcard').text().trim();

  console.log(countryInfo);
} catch(error) {
  console.log(error);
}

위 코드는 Deno와 cheerio 라이브러리를 이용하여 위키백과의 대한민국 페이지에서 주요 정보를 스크랩핑하는 예제입니다. 실행은 아래와 같이 deno run --allow-net --allow-read main.ts 명령어로 진행하실 수 있습니다.

 

코드를 실행하면 아래와 같이 대한민국의 주요 정보를 가져와 출력하게 됩니다.

 

 

 

--allow-net --allow-read 등의 보안명령

 

Deno는 기본적으로 보안에 중점을 둔 런타임입니다. 따라서 기본적으로 모든 코드는 안전하게 실행되며, 파일 시스템이나 네트워크에 접근하려는 시도는 허용되지 않습니다. 이런 권한을 부여하기 위해 다음과 같은 플래그를 사용합니다.

--allow-net: 이 플래그는 네트워크 액세스를 허용합니다. 이는 URL을 가져오거나, 외부 API와 통신하거나, 원격 데이터베이스에 연결할 때 필요합니다. --allow-net 옆에 특정 도메인 또는 IP 주소를 넣어 그 위치에 대한 네트워크 액세스만 허용할 수도 있습니다. 예: --allow-net=tonitech.tistory.com

--allow-read: 이 플래그는 파일 읽기 권한을 부여합니다. 파일 읽기 권한이 필요한 경우, 예를 들어 로컬 파일을 읽거나 데이터를 로드할 때 이 권한이 필요합니다. --allow-read 옆에 파일 또는 디렉토리의 경로를 넣어 해당 위치에 대한 읽기 권한만 허용할 수도 있습니다.

기타 Deno의 권한 플래그로는 --allow-write(파일 쓰기), --allow-run(외부 프로세스 실행), --allow-plugin(플러그인 로드), --allow-env(환경 변수 액세스), --allow-all 또는 -A(모든 권한 허용) 등이 있습니다. 이러한 플래그를 사용함으로써, Deno는 작성한 코드가 시스템의 어느 부분에 접근할 수 있는지 명확하게 통제할 수 있게 해줍니다.

 

 

Deno로 XML 파싱하기


이어서, Deno를 활용한 XML 파싱에 대해 알아보겠습니다. 우선, 대한민국 기상청에서 제공하는 XML 형식의 데이터를 가져와 파싱해보도록 하겠습니다.

 

웹 스크랩핑에서 HTML 데이터를 파싱하는 것과 비슷하게, XML 데이터도 파싱해야 할 필요가 있습니다. 파싱은 일련의 문자열을 의미있는 토큰으로 분리하는 과정입니다. 이후 이 토큰들을 이용하여 원하는 데이터를 추출하게 됩니다.

Deno에서는 deno-xml-parser라는 라이브러리를 이용하여 XML 데이터를 파싱할 수 있습니다. 이 라이브러리는 XML 문자열을 JavaScript 객체로 변환해주는 기능을 제공합니다.

다음은 기상청의 일기 예보 RSS를 파싱하는 Deno 코드입니다.

import { parse } from "https://deno.land/x/xml/mod.ts";

const url = 'http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109';

const res = await fetch(url);
const xml = await res.text();

const parsedXml = parse(xml);

const cityName = parsedXml.rss.channel.item.description.body.location[0].city;
const data = parsedXml.rss.channel.item.description.body.location[0].data;

console.log(`도시: ${cityName}`);
console.log('예보:');
for (let i = 0; i < data.length; i++) {
  console.log(`${data[i].tmEf}: ${data[i].wf}`);
}

 

이 코드는 Deno와 xml 라이브러리를 사용하여 기상청의 중기예보 RSS에서 데이터를 가져와 파싱하는 예제입니다. 해당 코드의 실행은 deno run --allow-net --allow-read main.ts 명령어로 진행하실 수 있습니다.

 

 

이 스크립트는 기상청의 RSS 서비스에서 XML 데이터를 가져온 다음, 'deno-xml-parser'를 이용하여 파싱합니다. 그리고 파싱된 결과에서 서울의 일기 예보를 가져와 콘솔에 출력합니다.

 

 

Deno를 이용한 웹 스크래핑 가능성과 주의점


Deno를 이용하면 간단하게 웹 스크랩핑과 XML 파싱을 할 수 있습니다. 이 외에도 Deno는 TypeScript를 기본 지원하고, 보안에 좀 더 집중한 런타임 등의 이점을 가지고 있어 많은 개발자들이 주목하고 있습니다.

하지만, Deno는 아직 초기 단계이기 때문에, 라이브러리나 도구의 지원이 미흡한 경우가 있습니다. 따라서 실제 프로젝트에 적용하기 전에는 충분한 테스트와 검토가 필요합니다.

또한, 웹 스크랩핑은 법적인 이슈가 될 수 있으므로, 반드시 웹사이트의 사용 약관을 확인하고 법적인 문제가 없는 범위에서 사용해야 합니다. 그럼에도 불구하고, 적절하게 사용한다면 Deno를 통한 웹 스크랩핑과 XML 파싱은 매우 유용한 도구가 될 수 있습니다.

이 글을 통해 Deno의 기능과 웹 스크랩핑, XML 파싱에 대한 이해가 깊어졌기를 바랍니다. 다음 번에는 다른 흥미로운 주제로 다시 찾아뵙겠습니다. 그럼, 행복한 코딩 시간 되세요!

 

반응형
LIST
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함