개요
경기도 장애인 특별공급 알리미는 기존까지는 경기도청의 웹페이지만을 긁어와 여기에서 정보를 뽑아 웹 푸시 알림을 제공하였기 때문에 JavaScript를 이용해 모든 것을 처리하였지만, 첨부파일(엑셀 파일)의 처리도 필요하게 되어 해당 부분은 파이썬을 이용하는 것으로 추가 작성하였습니다.
그리고 이 스크립트를 기존에 동작중인 Node.js 에서 호출하여 실행하도록 할 계획입니다.
Node.js App 작성
여느 스크래핑 서비스와 마찬가지로 주기적으로 웹 페이지를 읽어오도록 하였습니다. (실시간성이 중요한 서비스는 아니기 때문에 꽤나 듬성듬성 작업을 수행합니다.)
기본적인 express 앱을 사용하여 외부 접속을 동작 수행의 트리거로 하였습니다.
파일명은 index.js
로 하여 다음과 같이 작성하였습니다.
const express = require('express');
const {spawn} = require('child_process');
const app = express()
const port = process.env.PORT || 5000
app.get('/', (req, res) => {
// 스크래핑 작업 수행
res.send('OK');
}
app.listen(PORT, () => console.log(`Listening on ${PORT}`))
Python Script 작성
호출할 스크립트를 파이썬으로 index.py
파일에 작성하였습니다.
print("Hello World")
Nodejs에서 호출하기
이제 파이썬 스크립트를 호출하도록 코드를 추가합니다.
const express = require('express');
const {spawn} = require('child_process');
const app = express()
const port = process.env.PORT || 5000
app.get('/', (req, res) => {
let dataToSend;
const python = spawn('python3', ['index.py']);
python.stdout.on('data', (data) => {
dataToSend = data.toString();
})
python.on('close', (code) => {
res.send(dataToSend);
})
}
app.listen(PORT, () => console.log(`Listening on ${PORT}`))
추가한 코드의 내용은 다음과 같습니다.
spawn('python3', \['index.py'\]);
를 이용하여 새로운 child process를 생성하였습니다. 첫 번째 인자는 실행할 명령어이며 두 번째는 python 프로그램으로 실행할 스크립트의 이름입니다.
python.stdout.on('data', (data) => { ... }
와 같이 스크래핑한 데이터를 확인할 수 있도록 stdout
의 출력은 문자열로 변환하여 변수에 저장하였습니다.
마지막으로 python.on('close', (code) => { ... }
와 같이 스크립트의 실행이 종료되는 이벤트에 응답(res
)을 제공하도록 하였습니다.
이제 Node.js 서버를 실행한 후, 웹브라우저에서 localhost:5000에 접속하면 파이썬 스크립트가 호출되는 것을 확인할 수 있다.
$ node index.js
Listening on 5000
참고
'개발도구 > 기타' 카테고리의 다른 글
[Makefile] Warning: File 'FileName' has modification time 47475481 s in the future (0) | 2021.04.17 |
---|---|
[Heroku] 두 가지 이상의 언어로 작성된 App 배포하기 (0) | 2020.12.02 |
[ESLint] 시작하기 (0) | 2020.11.15 |
[Vim] 사용 예시 (0) | 2020.11.12 |
[Godot] Scene 실행(F6)시 오류 (0) | 2020.11.04 |