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; //크롤러 객체 자체를 외부에서 사용할 수 있도록 모듈을 추출한다.
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/