크롤링을 위해서주로 사용하는 puppeteer 기본크롬 창 띄우는 실습 예제
const cheerio = require('cheerio');
const axios = require('axios');
const xlsx = require('xlsx');
const add_to_sheet = require('./add_to_sheet'); // 엑셀에 크롤링 한 내용 추가시
const puppeteer = require('puppeteer');
const { parse } = require('csv-parse');
const fs = require('fs');
const workbook = xlsx.readFile('xlsx/data.xlsx');
const ws = workbook.Sheets.영화목록; // ws: 워크시트
/////////////// 엑셀관련 ////////////////
// header: A - 엑셀파일에서 1행엔 속성값 들어가는데(r.제목), 대신 r.A이렇게 설정
// const records = xlsx.utils.sheet_to_json(ws);
// // const records = xlsx.utils.sheet_to_json(ws, { header: 'A' });
// console.log(records);
// console.log(ws['!ref']); // 범위값 출력(a1:b11 -> A2:B11)
// console.log(workbook.SheetNames) // 여러시트 배열로
// for (const name of workbook.SheetNames){
// const ws = workbook.Sheets[name];
// //여러 시트일 때
// }
// records.shift(); // 첫행 제외하고 출력
////////////// csv 관련 ///////////////
//readFileSync: 파일 읽어들이는 메서드
const csv = fs.readFileSync('csv/data.csv');
// 1. 문자열이 버퍼이기에 문자열로 바꿔줘야 함
// 2. parse() ==> 2차원 배열로 변경
const records = parse(csv.toString('utf-8'));
//////////////// 단순출력 /////////////////
// for (const [i, r] of records.entries()) {
// console.log(i, r.제목, r.링크);
// }
// records.forEach((r, i) => {
// console.log(i, r);
// });
/////////////// 엑셀 파싱 및 크롤링 - cheerio //////////
// const crawler = async () => {
// // 엑셀파일에 열 추가
// add_to_sheet(ws, 'C1', 's', '평점');
// for (const [i, r] of records.entries()) {
// const response = await axios.get(r.링크);
// // const response = await axios.get("https://movie.naver.com/movie/bi/mi/basic.naver?code=196047#");
// 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); // 2부터 11까지 필요
// add_to_sheet(ws, newCell, 'n', parseFloat(text.trim()));
// }
// }
// xlsx.writeFile(workbook, 'xlsx/result.xlsx'); // 열 추가해서 새로 만든다.
// // // Promise.all은 순서가 보장되지 않음, 동시에 시행되긴 함 - 속도는 빠름
// // await Promise.all(records.map(async (r) => {
// // }));
// };
////////////// pupeeteer ////////////////
const crawler = async () => {
// 실무에서는 개발할때만 화면 띄우고 배포할때 화면 안띄움
// headless: true 하면 브라우저 보이지 않음
// 더 실무적으로: headless: process.env.NODE_ENV === 'production'
const browser = await puppeteer.launch({ headless: false });
const [page, page2, page3] = await Promise.all([
browser.newPage(),
browser.newPage(),
browser.newPage(),
])
await Promise.all([
page.goto('https://zerocho.com'),
page2.goto('https://naver.com'),
page3.goto('https://google.com')
])
await Promise.all([
page.waitFor(3000),
page2.waitFor(3000),
page3.waitFor(3000),
])
await page.close();
await page2.close();
await page3.close();
await browser.close();
};
crawler();
리액트 네이티브 강의 추천 (2) | 2022.12.28 |
---|---|
순서대로 진행하는 AWS 웹 배포하기(ubuntu) (2) | 2022.12.24 |
nextjs, firebase hosting - refresh시 404에러 해결 (0) | 2022.10.24 |
플러터 기본강의 추천리스트 (2) | 2022.06.07 |
크롤링을 위한 puppeteer 기본 pt.2 (0) | 2022.05.28 |
댓글 영역