본문 바로가기

Node.js/node crawling

노드 크롤링 - axios를 활용해서 이미지를 다운로드 하기

반응형

디렉토리를 읽고 없을경우 디렉토리를 생성해주는 코드

fs.readdir('screenshot', (err) => {
  if(err){
    console.error("screenshot 폴더가 없어 screenshot 폴더를 생성합니다 ")
    fs.mkdirSync("screenshot");
  }
});

 

sync 메소드는 프로그램의 처음과 끝에만 쓰는건 가능하다(그외는 blocking등이 일어나 성능에 영향을 미친다)

 

const xlsx = require("xlsx");
const puppeteer = require("puppeteer");
const axios = require("axios");
const fs = require("fs");
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);

fs.readdir('screenshot', (err) => {
  if(err){
    console.error("screenshot 폴더가 없어 screenshot 폴더를 생성합니다 ")
    fs.mkdirSync("screenshot");
  }
});


fs.readdir('poster', (err) => {
  if(err){
    console.error("poster 폴더가 없어 poster 폴더를 생성합니다 ")
    fs.mkdirSync("poster");
  }
});

const crawler = async () => {
  try {
    const browser = await puppeteer.launch({ headless: false });
    const page = await browser.newPage();
    //본인이 브라우저를 하는것 처럼 진행
    //속이기
    await page.setUserAgent(
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"
    );
    add_to_sheet(ws, 'C1', 's', '평점');
    for (const [i, r] of records.entries()) {
      await page.goto(r.링크);
      const result = await page.evaluate(() => {
        const scoreEl = document.querySelector('.score.score_left .star_score');
        let score = '';
        if(scoreEl){
          score = score.textContent;
        }
        const imgEl = document.querySelector(".poster img");
        let img = ''
        if(imgEl) {
          img = imgEl.src;
        }
        return {
          score,
          img
        }
      });

      if (result.score) {
        const newCell = 'C' + (i + 2);
        console.log(r.제목, '평점',result.score.trim());
        add_to_sheet(ws, newCell, 'n', parseFloat(result.score.trim()));
      }
      if(result.img){
        // buffer가 연속적으로 들어있는 자료구조 
        // 이미지 주소를 요청받아서 배열들을 받아온다.
        //  ?.+$ 에서 .은 모든 단어 +는 한개 이상 $는 끝을 의미합니다
        // ? 부터 끝부분까지 제거한다 (즉 ?이후 요청을 제거하는 방식);
        // const imgResult = await axios.get(result.img, {
        //   responseType: 'arraybuffer'
        // });
        const imgResult = await axios.get(result.img.replace(/\?.*$/, ''), {
          responseType: 'arraybuffer'
        });
        fs.writeFileSync(`poster/${r.제목}.jpg`, imgResult.data);
      }
      
      await page.waitFor(1000);
    }
    await page.close();
    await browser.close();
    xlsx.writeFile(workbook, 'xlsx/result.xlsx');
  } catch (e) {
    console.error(e);
  }
};
crawler();

 

 

 

해당과 같이 이미지파일을 크롤링해서 가져올 수 있다.

 

 

 

 

본 글은 아래 인프런 강의를 듣고 작성된 내용입니다

https://www.inflearn.com/course/%ED%81%AC%EB%A1%A4%EB%A7%81

 

Node.js로 웹 크롤링하기 - 인프런 | 강의

네이버, 아마존, 트위터, 유튜브, 페이스북, 인스타그램, unsplash.com 등의 사이트를 크롤링하며 실전에 적용해봅니다., Node.js로 웹 크롤링하기 Node.js와 Puppeteer를 활용해 웹 사이트를 크롤링하여 원

www.inflearn.com

 

반응형