디렉토리를 읽고 없을경우 디렉토리를 생성해주는 코드
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 > node crawling' 카테고리의 다른 글
노드 크롤링 - 인피니티 스크롤 사이트(unsplash) 크롤링하기 (3) | 2020.08.16 |
---|---|
노드 크롤링 - 브라우저 사이즈 조절 및 스크린샷 찍기 (0) | 2020.08.16 |
노드 크롤링 - userAgent와 한탭으로 크롤링 (0) | 2020.08.16 |
노드 크롤링 - puppeteer의 다양한 기능들 (0) | 2020.08.15 |
노드 크롤링 - csv에 있는 주소를 통해 puppeteer 크롤링, csv파일 작성하기 (0) | 2020.08.15 |