dukDukz

[블록체인] 데몬에 http로 요청하기, 크롤링 [실습] 본문

웹 개발/블록체인

[블록체인] 데몬에 http로 요청하기, 크롤링 [실습]

헤일리_HJ 2021. 9. 27. 14:29

전체 코드

더보기
// url 127.0.0.1:3800 -> hello ingcoin! 출력을 해보자

const express = require('express')
const request = require('request')
const cheerio = require('cheerio')  // npm install cheerio
const app = express()

// 요청 -> 응답
app.get('/', (req, res) => {
    res.send('hello ingcoin!')
})

// 요청A - 요청B - 응답B - 응답A
app.get('/naver', (req, res) => {
    // 요청 B - request 라는 패키지를 사용할거임
    request('https://naver.com', (err, response, body) => {
        console.log(err)

        if (err == null) {
            res.send('naver')
        } else {
            res.send('error')
        }
    })
})

app.get('/naver2', (req, res) => {
    request(
        {
            url: "http://naver.com",
            method: "POST",
            headers: { "Content-type": "application/json" },
            body: "{msg:'hello world!'}"
        },
        (err, response, data) => {
            console.log(data)
            console.log(response.statusCode);

            if (err == null && response.statusCode == 200) {
                res.send('naver2')
            } else {
                res.send('error')
            }
        })
})

app.get('/crawling', (req, res) => {
    request('http://naver.com', (err, response, data) => {
        let $ = cheerio.load(data)      // 얘를 선택자로 쓸거임

        // 뽑아낼 영역. css 에서 선택하듯이 뽑아서 결과물이 여러개니까 each 로 반복문 돌림
        $('.partner_box_wrap > .partner_box:nth-child(3) > a').each((index, item) => {
            // console.log(typeof(item)) // 이렇게 찍어서 어떤 형태인지 알수 있음 object
            // console.log(item.children[0].data)      // 하나씩 찍어보면서 안으로 들어가면 된다.
            let { data } = item.children[0]
            console.log(data);

        })
    })
})

const headers = {"Content-type": "application/json"}
const USER = process.env.RPC_USER || 'ingoo'
const PASS = process.env.RPC_PASSWORD || '1234'
const RPCPORT = process.env.RPC_PORT || 3000

app.get('/newaddress/:account', (req, res) => {
    const {account} = req.params
    const body = `{"method":"getnewaddress","params":["${account}"]}`
    const options = {
        url: `http://${USER}:${PASS}@127.0.0.1:${RPCPORT}`,
        method: "POST",
        headers,
        body
    }

    const callback = (err, response, data) => {
        if (err == null && response.statusCode == 200) {
            const body = JSON.parse(data)   
            // 결과물이 json 형태로 오지만 string 이므로 이렇게 parse 해주고
            
            // res.send(body)
            // res.render('')  //html 페이지를 보여줄 수 있다는 것
        } else {
            res.send('error')
        }
    }
    request(options, callback)
})

app.listen(3800, () => {
    console.log('server open');
})

 

vs code 

 

npm init

npm install express

npm install request

[공통적으로 써줘야 함]

// url 127.0.0.1:3800

const express = require('express')
const request = require('request')
const app = express()

....

app.listen(3800, () => {
    console.log('server open');
})

 

 

 

요청A - 요청B - 응답B - 응답A

# requeset

request('url',( err, response, data )=>{

})

1) url 을 string으로

// 요청A - 요청B - 응답B - 응답A
app.get('/naver', (req, res) => {
    // 요청 B - request 라는 패키지를 사용할거임
    request('https://naver.com', (err, response, body) => {
        console.log(err)

        if (err == null) {
            res.send('naver')
        } else {
            res.send('error')
        }
    })
})

 

2) url 을 객체로

app.get('/naver2', (req, res) => {
    request(
        {
            url: "http://naver.com",
            method: "POST",
            headers: { "Content-type": "application/json" },
            body: "{msg:'hello world!'}"
        },
        (err, response, data) => {
            console.log(data)
            console.log(response.statusCode);

            if (err == null && response.statusCode == 200) {
                res.send('naver2')
            } else {
                res.send('error')
            }
        })
})

 


데몬에 http로 요청하기

# getnewaddress - 주소 생성

wsl 에서 요청하기

curl -X POST -H "Content-type:application/json" -d '{"method":"getnewaddress","params":["ingoo5"]}' ingoo:1234@127.0.0.1:3000

 

express 에서 요청하기

const headers = {"Content-type": "application/json"}
const USER = process.env.RPC_USER || 'ingoo'
const PASS = process.env.RPC_PASSWORD || '1234'
const RPCPORT = process.env.RPC_PORT || 3000

app.get('/newaddress/:account', (req, res) => {
    const {account} = req.params
    const body = `{"method":"getnewaddress","params":["${account}"]}`
    const options = {
        url: `http://${USER}:${PASS}@127.0.0.1:${RPCPORT}`,
        method: "POST",
        headers,
        body
    }

    const callback = (err, response, data) => {
        if (err == null && response.statusCode == 200) {
            const body = JSON.parse(data)   
            // 결과물이 json 형태로 오지만 string 이므로 이렇게 parse 해주고
            
            res.send(body)
            // res.render('')  //html 페이지를 보여줄 수 있다는 것
        } else {
            res.send('error')
        }
    }
    request(options, callback)
})

 

 

 


# getaddressesbyaccount

: account 로 주소 조회

 

wsl 에서 요청하기

curl -X POST -H "Content-type:application/json" -d '{"method":"getaddressesbyaccount","params":["ingoo6"]}'
 ingoo:1234@127.0.0.1:3000

express 에서 요청하기

app.get('/getaddresses/:account',(req,res)=>{
    const {account} = req.params
    const body = `{"method":"getaddressesbyaccount","params":["${account}"]}`
    const options = {
        url : `http://${USER}:${PASS}@127.0.0.1:${RPCPORT}`,
        method:"POST",
        headers,
        body
    }
    const callback = (err,response,data)=>{
        console.log(err);
        console.log(response.statusCode);
        if(err == null && response.statusCode == 200){
            const body = JSON.parse(data)
            // console.log(body);
            res.send(body)
        }else{
            
            res.send('error')
        }
    }
    request(options,callback)
})

 


크롤링

 

const cheerio = require('cheerio')  // npm install cheerio

app.get('/crawling', (req, res) => {
    request('http://naver.com', (err, response, data) => {
        let $ = cheerio.load(data)      // 얘를 선택자로 쓸거임

        // 뽑아낼 영역. css 에서 선택하듯이 뽑아서 결과물이 여러개니까 each 로 반복문 돌림
        $('.partner_box_wrap > .partner_box:nth-child(3) > a').each((index, item) => {
            // console.log(typeof(item)) // 이렇게 찍어서 어떤 형태인지 알수 있음 object
            // console.log(item.children[0].data)      // 하나씩 찍어보면서 안으로 들어가면 된다.
            let { data } = item.children[0]
            console.log(data);

        })
    })
})