node200제-152. cheerio 이용해서 필요한 부분 추출하기

prana·2022년 6월 26일
0

152.js

const request = require('request');
const iconv = require('iconv-lite'); // 인코딩을 iconv-lite로 변환해주는 모듈을 불러온다. 
const charset = require('charset'); //charset 값을 알게 해주는 모듈을 불러 온다.


/*
request에 여러 가지 파라미터를 사용하여 홈페이지를 다운로드 하기 위해 요청한다. 
*/
const crawl = (callback) => queryString => request({ 
    url: 'https://www.google.com/search',
    encoding: null,
    method: 'GET',
    qs: queryString, //크롤러를 이후 사용할 때 인자로 전달되는 값을 이용한다.
    timeout: 30000, //단위 밀리초, 10초 이후 응답을 포기한다.
    followRedirect: true,  // 리다이렉션할 경우 사이트 이동을 허용할 것인지
    maxRedirects: 10 //최대 리다이렉션을 몇 번 할지 설정
}, (error, response, body)=> {
    if(!error && response.statusCode === 200 ){
       console.log('실행됨');
        const enc = charset(response.headers, body); //헤더 정보에서 인코딩 정보를 받아온다.
        const decodeResult = iconv.decode(body, enc).toString(); //해당 사이트의 인코딩 방식으로 body를 디코드 한다. 깨짐을 방지하기 위해 
        console.log('-----------------', decodeResult);
        callback(decodeResult); 
    }else {
        console.log(`error${response.statusCode}`);
    }
});

module.exports.crawl = crawl; //크롤러 객체 자체를 외부에서 사용할 수 있도록 모듈을 추출한다. 



152-2.js

const crawler = require('./152');
const cheerio = require('cheerio');
const fs = require('fs');

const parse = (decodedResult) => {//디코드 결과가 콜백으로 넘어옴
    const $ = cheerio.load(decodedResult);
    //console.log('-----------------', decodedResult ,'***************')
    const titles = $('div .BNeawe');
    console.log(titles);
    titles.each((index, element)=> {
        const title = $(element).text();
        console.log(title);
        fs.appendFile('./node200_project/titles.txt', `${title}\n`, (err)=> {
            console.log(err);
        })
    })
    // for (let i = 0; i < titles.length; i+=1) {
    //     const title = $(titles[i]).text();
    //     console.log(title);        
    // }
};
crawler.crawl(parse)({q: '서울대입구역 맛집'});

여기서 나는 decodeResult 가 callback 함수를 통해 잘 넘어왔는지 보고 싶어서

//console.log('-----------------', decodedResult ,'***')

를 통해 확인했고,

결과값이 잘 넘어온 것을 확인할 수 있었다.
책에서는..

const titleText = $('h3.r').find('a');

으로 나와있었는데 아무리 찾아도 결과값이 안 떠서... 천천히 내려보다가 적당히 규칙성 있는 div 태그를 찾아보기 시작했고
구글로 검색하니 한국어로 변환이 되어 하나씩 찾아 내려갔다.

서울대입구 맛집이 검색되어 txt 파일로 만들어진 것을 확인했다! 야호~

참고 : https://dencode.com/

profile
안녕하세요!!

0개의 댓글