🚨 노션에 바로 입력하려했으나 아직 성공하지 못했다.
수많은 블로그들 중 하루도 빼먹지 않고 Easy Writing 문장들을 포스팅되는 블로그들을 찾아봤다.
fs.readdir('result', (err) => {
if (err) {
console.log('result 폴더가 없어 생성합니다')
fs.mkdirSync('result'); //폴더 생성
}
});
await page.goto('http://blog.naver.com/PostList.nhn?blogId=magpie777&from=postList&categoryNo=48', {
waitUntil: 'networkidle0'
}); //페이지 접속
이동한 Easy Writing 게시판은 하루치 라디오 내용을 담은 게시글들을 담고있다
매주 주말에 크롤링을 한다면 차례대로 금, 목, 수, 화, 월 게시글 링크를 가져올 수 있다.
for (let i = 1; i <= 5; i++) {
const link = await page.$eval(
`.blog2_categorylist tr:nth-child(${6 - i}) a`,
element => element.href
); // 이동한 페이지에서 링크 가져오기
const pageI = await browser.newPage(); //pageI 라는 새로운 페이지 열기
await pageI.goto(link); //가져온 링크로 이동
...
}
위의 경우는 iframe을 사용할 필요가 없었지만 필요한 경우를 위해 다루는 법을 공유한다
const iframe = page.frames().find(frame => frame.name() === 'mainFrame');
const link = await iframe.$eval(`selector`, element => element.href);
링크 수집하는 for문 안에서 문장 가져오는 for문을 돌린다
result[0]
에는 라디오 방송 날짜를 적어줬다result[1] ~ [5]
에는 한글 문장을 삽입한다result[6]
은 빈줄을 삽입한다result[7] ~ [11]
에는 영어 문장을 삽입한다result[12]
에도 빈줄을 삽입한다const result = []; //문자 넣을 배열 생성
result[0] = [`${month}월 ${date}일${days[i - 1]}`]; //첫줄에 날짜
for (const [j, n] of nb.entries()) {
const text = await pageI.$$eval( //문장 가져오기
`.se-module.se-module-text p:nth-child(${n})`,
element => element[0].textContent
);
if (text != '') {
if ((n - 1) < 5) //1번부터 4번 문장 (한글)
result[n - 1] = [`${(n - 1)%5}. ${text}`];
else if (7 <= (n - 1) && (n - 1) <= 10) //1번부터 4번 문장(영어)
result[n - 1] = [`${(n - 2)%5}. ${text}`]
else if ((n - 1) == 5 || (n - 1) == 11) //5번 문장(한글/영어)
result[n - 1] = [`5. ${text}`];
else if (n - 1 == 6) //한글과 영어문장 사이 빈줄 삽입
result[n - 1] = [''];
}
result.push(['']); //마지막에 빈줄 삽입
}
배열을 텍스트로 바꾸기 위해 stringify를 사용해준다
"
가 랜덤으로 붙는다str += stringify(result).replace(/\"/g, ''); //배열을 문자열로 변환 후 따옴표 제거
fs.writeFileSync('result/result.md', str); //문자열을 result/result.md에 입력
const fs = require('fs');
const puppeteer = require('puppeteer');
const axios = require('axios');
const stringify = require('csv-stringify/lib/sync');
fs.readdir('result', (err) => {
if (err) {
console.log('result 폴더가 없어 생성합니다')
fs.mkdirSync('result');
}
});
const crawler = async () => {
try{
const browser = await puppeteer.launch({
headless: false,
}); //브라우저 띄우기
const page = await browser.newPage(); //페이지 띄우기
await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36');
await page.goto('http://blog.naver.com/PostList.nhn?blogId=magpie777&from=postList&categoryNo=48', {
waitUntil: 'networkidle0'
}); //페이지 접속
//문자열 가져올 때 돌릴 숫자 배열
let nb = [];
for (let i = 2; i <= 12; i++)
nb.push(i);
//날짜 입력시 필요한 배열
const days = ['(월)', '(화)', '(수)', '(목)', '(금)'];
const months = ['Month', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
let str = '';
//게시판의 게시글 링크 가져오기
for (let i = 1; i <= 5; i++) {
const link = await page.$eval(`.blog2_categorylist tr:nth-child(${6 - i}) a`, element => element.href);
const pageI = await browser.newPage();
await pageI.goto(link);
//블로그의 제목에서 날짜 따오기
//[22 September]와 같은 형식으로 되어있다
let month = '';
let date = '';
let k = 0;
let title = await pageI.$$eval('.se-fs-.se-ff-', element => element[0].textContent);
while (title[k] != ' ')
k++;
date = title.substring(1, k);
let l = k;
while (title[l] != ']')
l++;
let monthstr = title.substring(k + 1, l);
month = months.indexOf(monthstr);
//문자열 가져오기
const result = [];
result[0] = [`${month}월 ${date}일${days[i - 1]}`];
for (const [j, n] of nb.entries()) {
const text = await pageI.$$eval(`.se-module.se-module-text p:nth-child(${n})`, element => element[0].textContent);
//문자열을 result에 입력
if (text != '') {
if ((n - 1) < 5)
result[n - 1] = [`${(n - 1)%5}. ${text}`];
else if (7 <= (n - 1) && (n - 1) <= 10)
result[n - 1] = [`${(n - 2)%5}. ${text}`]
else if ((n - 1) == 5 || (n - 1) == 11)
result[n - 1] = [`5. ${text}`];
else if (n - 1 == 6)
result[n - 1] = [''];
}
result.push(['']);
}
await pageI.close();
//배열을 문자열로 변환 후 쌍따옴표 제거
str += stringify(result).replace(/\"/g, '');
}
//문자열을 파일에 저장
fs.writeFileSync('result/result.md', str);
await page.close(); //페이지 닫기
await browser.close(); //브라우저 닫기
} catch (e) {
console.error(e);
}
}
crawler();