const request = require('request');
const iconv = require('iconv-lite');

request({
url: 'https://www.google.com/search',
method: 'GET',
qs: { q: '신사역 맛집' },
encoding: null,
}, (error, response, body) => {
const decodedResult = iconv.decode(body, 'euc-kr');
console.log(decodedResult);
});


한글이 깨지는 문제가 있을 때 request 옵션으로 encoding을 null로 설정한 후 iconv-lite 모듈을 이용해 euc-kr로 디코드 해주면 된다.


crawler.js

const request = require('request');
const iconv = require('iconv-lite');
const charset = require('charset');

const crawl = callback => queryString => request({
url: 'https://www.google.com/search',
encoding: null, //한글이 깨지는 문제를 해결하기 위해 null로 설정
method: 'GET', //GET 요청
qs: queryString, //크롤러를 이후 사용할 때 인자로 전달되는 값
timeout: 10000, //10초 이후 응답을 포기
followRedirect: true, //사이트 이동을 허용할 것인지 체크
maxRedirects: 10, //리다이렉션을 최대 몇 번 할지 설정
},
(error, response, body) => {
if (!error && response.statusCode === 200) { //HTTP 상태코드가 200이면 서버가 요청을 제대로 처리했다는 뜻이다.
const enc = charset(response.headers, body); //현재 사이트의 헤더 정보에서 인코딩 정보를 가져옴
const decodedResult = iconv.decode(body, enc); //iconv를 이용하여 해당 사이트의 인코딩 방식으로 body를 디코드
callback(decodedResult); //디코드 결과를 콜백
} else {
console.log(`error${response.statusCode}`);
}
});

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



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

const parse = (decodedResult) => { //디코드 결과가 콜백으로 넘어옴
const $ = cheerio.load(decodedResult); //검색한 결과를 $변수에 로드
const titles = $('h3.r').find('a'); //클래스명으로 r을 가진 h3 요소 중 하위 요소가 a인 데이터를 모두 찾아서 반환
titles.each((index, element) => { //titles의 검색 결과를 each를 통해 element 단위로 받아옴
const title = $(element).text(); //요소의 값을 추출후 저장
console.log(title);
fs.appendFile('./titles.txt', `${title}\n`); //titles.txt가 존재 하지않으면 생성하고 해당 내용을 붙여나감
});
};

crawler.crawl(parse)({ q: '샤로수길 맛집' }); //크롤링 결과를 parse 콜백함수에 넘겨주게 호출


'공부 > Node.js' 카테고리의 다른 글

로그 - winston 모듈  (0) 2019.03.08
템플릿 엔진 모듈 - ejs, pug 모듈  (0) 2019.03.07
npm  (0) 2019.03.06
http 모듈  (0) 2019.03.06
fs 모듈  (0) 2019.03.06

+ Recent posts