본문 바로가기

Parsing to BBC News

Python에서 리턴한 데이터를 node에서 받아와 GET 웹서비스로 만들기

728x90

오늘 해볼 것은 아래와 같다.

1. 외국 사이트에서 문장을 크롤링(사실 파싱이 맞다)하여 화면에 표시(파싱)
1.1 Python(BeautifulSoup)을 통해 외국사이트에서 특정 키워드를 추출하여 배열로 return 하기
1.2 Python에서 리턴한 데이터를 node에서 받아와 GET 웹서비스로 만들기 <- 이거
1.3 React 기반 웹에서 node 서비스를 호출하고, 화면에 '예쁘게' 표시하기

 

 

// express 모듈 가져옴.
const express = require('express')
// 미들웨어 선언
const app = express()

//크로스도메인 이슈 해결
const cors = require('cors');

//Python 파일 경로
const path = require('path')
const pyPath = path.join(__dirname, 'api\\python\\bbc.py')

app.listen(3000, function () {
    console.log(pyPath)
})

기본적인 서비스 구현이다.

 

1. express 모듈을 불러와서,
2. 미들웨어를 선언한다.

3. 크로스도메인 이슈를 해결하기 위해 추가적인 라이브러리를 불러온다.

4. 이전 글에서 작성한 파이썬 코드의 경로를 선언한다.

5. 지정한 경로에서 요청을 수신한다. (3000 포트)

 

이제 3000포트에서 연결을 수신할 수 있다.

 

node를 실행하면 위와같이 파이썬 파일의 경로가 나오는 것을 확인할 수 있다.

 

이제 서비스를 만들어보자.

app.get('/viewNews', function (req, res) {
    try{
        const spawn = require("child_process").spawn 
        const process = spawn('python',[pyPath] )
        process.stdout.on('data', function(data) { 
            res.send(convertWebToString(data))
            res.end()
            return
        }) 
        // process.stdout.pipe(res)
    } catch(error) {
        console.error(error)
        res.status(500).send({error: error.message})
        res.end()
        return
    }
})

app.get은 지정된 콜백 함수를 사용하여 http get 요청을 지정된 경로로 라우팅하는것이다.

 

/viewNews로 http get 요청을 라우팅한다.

요청은 자식프로세스에서 파일을 불러와 결과를 리턴하는 방식으로 처리한다.
const spawn = require("child_process").spawn
위 구문을 통해 자식 프로세스를 생성하고, 

const process = spawn('python',[pyPath] )
위 구문을 통해 파이썬 스크립트를 실행한 뒤 자식 프로세스 객체를 리턴받는다.

process.stdout.on 하위에서 결과(표준 출력 데이터)는 응답 데이터로 넘겨준다.

그런데 표준 출력 데이터는 현재 배열 그 자체이므로 그대로 넘겨주면 정상적인 응답 데이터로 받을 수 없다.

그래서 받아온 데이터를 문자열로 리턴해주는 별도의 함수를 만들었다.

convertWebToString 이다.

 

function convertWebToString(data) {
    //가져온 데이터가 Object 형태인데, 왜인지 모르겠지만 eval로 다시 초기화 하지 않으면 버퍼로 데이터를 가지고 있음
    let myJsonString = (data.toString());
    myJsonString = eval(myJsonString);
    // console.log(myJsonString)
    return data
    // //eval로 초기화 시 array형태의 데이터 얻을 수 있음.
    // console.log(myJsonString)
    // 
}

이부분이 좀 아리송하긴 한데

data를 eval로 실행해주지 않으면 데이터가 json 형태가 되지 않는다.

이부분은 나중에 다시 보충해봐야겠다.

여튼 python에서 리턴한 데이터를 eval로 한번 형변환(?) 해주어야 정상적인 respone이 가능하다.

 

이러한 일련의 과정을 거치고 나면

 

위와같이 python으로 bbc의 뉴스를 파싱하여 json 형태로 변환하고, 이를 http 요청으로 클라이언트에서 전달받을 수 있게 되었다.

 

이제 남은것은 1.3 React 기반 웹에서 node 서비스를 호출하고, 화면에 '예쁘게' 표시하기

이다.

 

이것도 간단하지만은 않은데,

단계를 또 잘라야겠다.

 

1.3.1 React에서 데이터 요청하고 화면에 표시하기

1.3.2 화면에 표시한 데이터 예쁘게 표시하기

1.3.3 화면의 일부 데이터 서버에 재요청하기(papago 이용하여 번역 기능 만들기)

1.3.4 번역한 데이터 바탕으로 듀오링고처럼 게임 형태로 데이터 표시하기

 

728x90