해당 엑셀파일의 주소를 통해 요청을 보내고 있다.
먼저 네티즌 평점쪽을 가져오려고 한다.
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();
해당 로직을 실행하면
정상적으로 파일이 작성이 완료가 된다.
'Node.js > node crawling' 카테고리의 다른 글
노드 크롤링 - puppeteer의 다양한 기능들 (0) | 2020.08.15 |
---|---|
노드 크롤링 - csv에 있는 주소를 통해 puppeteer 크롤링, csv파일 작성하기 (0) | 2020.08.15 |
노드 크롤링 - puppeteer 사용해보기 (0) | 2020.08.15 |
노드 크롤링 - csv 파일, 엑셀파일(xlsx) 파싱하기 (0) | 2020.08.15 |
puppeteer을 활용해서 스크린샷 찍기, 크롤링하기, pdf 생성하기 (0) | 2020.05.16 |