본문 바로가기

Node.js/node crawling

노드 크롤링 - 네이버 영화 크롤링하기, 엑셀에 작성하기

해당 엑셀파일의 주소를 통해 요청을 보내고 있다.

 

 

먼저 네티즌 평점쪽을 가져오려고 한다.

 

cheerio를 활용해 제이쿼리형식을 활용해서 html 데이터를 가져올 수 있다..

 

Promise.all을 활용해 전부 비동기 요청을 보내고 

받아온다.

const xlsx = require("xlsx");
const axios = require('axios'); 
const cheerio = require('cheerio'); // html 파싱

const workbook = xlsx.readFile("./xlsx/data.xlsx");
const ws = workbook.Sheets.영화목록;
const records = xlsx.utils.sheet_to_json(ws);

for(const [i, r] of records.entries()){
    console.log(i, r.제목, r.링크);
}

// 엑셀에있는 링크를 파싱으로 가져와서 Promise.all로 전부 axios 요청을 보낸다.
const crawler = async () => {
    await Promise.all(records.map(async (r) => {
        const response = await axios.get(r.링크);
        if(response.status === 200){ //응답이 성공한경우
            const html = response.data;
            // console.log(html);            
            const $ = cheerio.load(html);
            // 네티즌 평점 가져오기
            const text = $('.score.score_left .star_score').text();
            console.log(r.제목, '평점', text.trim());
        }
    }))
}

crawler();

Promise.all 을 활용하면 요청의 순서가 보장되지 않는다. (일괄 요청)

 

 

 

const xlsx = require("xlsx");
const axios = require('axios'); 
const cheerio = require('cheerio'); // html 파싱

const workbook = xlsx.readFile("./xlsx/data.xlsx");
const ws = workbook.Sheets.영화목록;
const records = xlsx.utils.sheet_to_json(ws);

for(const [i, r] of records.entries()){
    console.log(i, r.제목, r.링크);
}

// 엑셀에있는 링크를 파싱으로 가져와서 Promise.all로 전부 axios 요청을 보낸다.
const crawler = async () => {
    await Promise.all(records.map(async (r) => {
        const response = await axios.get(r.링크);
        if(response.status === 200){ //응답이 성공한경우
            const html = response.data;
            // console.log(html);            
            const $ = cheerio.load(html);
            // 네티즌 평점 가져오기
            const text = $('.score.score_left .star_score').text();
            console.log(r.제목, '평점', text.trim());
        }
    }))
}

crawler();

 

순서를 보장하려면 for of를 활용해 이터레이터로 실행해주면 된다(속도는 더 느리다)

 

 

const xlsx = require("xlsx");
const axios = require('axios'); 
const cheerio = require('cheerio'); // html 파싱

const workbook = xlsx.readFile("./xlsx/data.xlsx");
const ws = workbook.Sheets.영화목록;
const records = xlsx.utils.sheet_to_json(ws);

// for(const [i, r] of records.entries()){
//     console.log(i, r.제목, r.링크);
// }

// 엑셀에있는 링크를 파싱으로 가져와서 Promise.all로 전부 axios 요청을 보낸다.
const crawler = async () => {

    for(const [i, r] of records.entries() ){
        const response = await axios.get(r.링크);
        if(response.status === 200){ //응답이 성공한경우
            const html = response.data;
            // console.log(html);            
            const $ = cheerio.load(html);
            // 네티즌 평점 가져오기
            const text = $('.score.score_left .star_score').text();
            console.log(r.제목, '평점', text.trim());
        }
    }
    // await Promise.all(records.map(async (r) => {

    // }))
}

crawler();

 

 

크롤링 내용 excel 파일에 작성하기

 

추가해주는 로직 add_to_sheet.js 를 추가해준다 

const xlsx = require('xlsx');

function range_add_cell(range, cell){
    const rng = xlsx.utils.decode_range(range);
    const c = typeof cell === "string" ? xlsx.utils.decode_cell(cell) : cell;
    if(rng.s.r> c.r) rng.s.r = c.r;
    if(rng.s.c > c.c) rng.s.c = c.c;
    if(rng.e.r < c.r) rng.e.r = c.r;
    if(rng.e.c < c.c) rng.e.c = c.c;
    return xlsx.utils.encode_range(rng);
}

module.exports = function add_to_sheet(sheet, cell, type, raw){
    sheet['!ref'] = range_add_cell(sheet["!ref"], cell);
    sheet[cell] = {t : type, v: raw};
}

 

const xlsx = require("xlsx");
const axios = require('axios'); 
const cheerio = require('cheerio'); // html 파싱
const add_to_sheet = require("./add_to_sheet");
const workbook = xlsx.readFile("./xlsx/data.xlsx");
const ws = workbook.Sheets.영화목록;
const records = xlsx.utils.sheet_to_json(ws);

// for(const [i, r] of records.entries()){
//     console.log(i, r.제목, r.링크);
// }

// 엑셀에있는 링크를 파싱으로 가져와서 Promise.all로 전부 axios 요청을 보낸다.
const crawler = async () => {
    add_to_sheet(ws, 'C1', 's','평점');
    for(const [i, r] of records.entries() ){
        const response = await axios.get(r.링크);
        if(response.status === 200){ //응답이 성공한경우
            const html = response.data;
            // console.log(html);            
            const $ = cheerio.load(html);
            // 네티즌 평점 가져오기
            const text = $('.score.score_left .star_score').text();
            console.log(r.제목, '평점', text.trim());
            const newCell = 'C' + (i + 2);
            add_to_sheet(ws, newCell, 'n', parseFloat(text.trim()));
        }
    }
    xlsx.writeFile(workbook, 'xlsx/result.xlsx');
    // await Promise.all(records.map(async (r) => {

    // }))
}

crawler();

 

해당 로직을 실행하면 

 

 

정상적으로 파일이 작성이 완료가 된다.