※ 개인적으로 공부한 내용들입니다. 오류가 있을 수 있습니다. 오류가 있다면 댓글을 달아주세요^^ 감사합니다.
크롤링이란?
웹사이트에서 글 혹은 사진들을 가지고 오는것이 떠오른다.
만들고 싶은 것은?
취업이 하고 싶다. 자소서를 써야하는데 기업의 이름과 마감일자를 가져와서 보고싶다.
1. 일단 크롤링 할 사이트를 정한다
사람인 너로 정했다.
2. 분석한다
// 나중에 사진첨부하기 ㅠㅠ... 사진이 안올라가네;;
var request = require("request"); var cheerio = require("cheerio"); var url = "http://www.saramin.co.kr/zf_user/jobs/public/list?sort=ud&quick_apply=&search_day=&keyword=&pr_exp_lv%5B%5D=1&up_cd%5B%5D=3#listTop"; request(url, function(error, response, body) { if (error) throw error; var $ = cheerio.load(body); var postElements = $("table.common_recruit_list tr"); postElements.each(function() { var endDate = $(this).find("td.support_info p.deadlines").text(); var companyTitle = $(this).find("td.company_nm a").attr("title"); console.log("마감일자 : " + endDate+" 회사명 : "+companyTitle+"\n"); }); });
위의 코드를 saramin.js로 저장 후
node saramin.js
명령어를 실행하면
콘솔창에 마감날짜와 회사명을 출력하는 것을 볼 수 있다.
하지만 콘솔에 출력하는 것보다 엑셀에 마감 일자와 회사명을 출력 후 저장을 해야 나중에 카톡 공지사항에 올리기 편합니다.
var request = require("request"); var cheerio = require("cheerio"); var fs = require("fs"); var officegen = require("officegen"); var xlsx = officegen("xlsx"); var sheet=xlsx.makeNewSheet(); sheet.name="공채"; sheet.setCell("A1","마감일자"); sheet.setCell("B1","회사명"); var url = "http://www.saramin.co.kr/zf_user/jobs/public/list?sort=ud&quick_apply=&search_day=&keyword=&pr_exp_lv%5B%5D=1&up_cd%5B%5D=3#listTop"; var i=1; request(url, function(error, response, body) { if (error) throw error; var $ = cheerio.load(body); var postElements = $("table.common_recruit_list tr"); postElements.each(function() { sheet.data[i]=[]; var endDate = $(this).find("td.support_info p.deadlines").text(); var companyTitle = $(this).find("td.company_nm a").attr("title"); sheet.data[i].push(endDate,companyTitle); i++; //console.log("마감일자 : " + endDate+" 회사명 : "+companyTitle+"\n"); }); }); var strm = fs.createWriteStream("test.xlsx"); xlsx.generate(strm);
그래서 위의 처럼 officegen 을 사용해서 엑셀에 저장을 하려 했습니다.. 그러나?? 엑셀은 마감일자와 회사명만 그려졌습니다.
무엇이 문제일까? 한참 고민하고, 여러군대에서 막 찍어본결과
request가 비동기적으로 실행하는 것이 문제였습니다. 그래서 비동기 sync-request 를 사용하기로 했습니다. 코드는 다음과 같습니다.
var request = require("sync-request"); var cheerio = require("cheerio"); var fs = require("fs"); var officegen = require("officegen"); var xlsx = officegen("xlsx"); var sheet=xlsx.makeNewSheet(); sheet.name="공채"; var url = "http://www.saramin.co.kr/zf_user/jobs/public/list?sort=ud&quick_apply=&search_day=&keyword=&pr_exp_lv%5B%5D=1&up_cd%5B%5D=3#listTop"; var i=0; var request = require('sync-request'); var res = request('GET', url); var $=cheerio.load(res.getBody()); var postElements = $("table.common_recruit_list tr"); function twostring(str){ var t=new String(str); if(t.length==1){ return t='0'+t; } } postElements.each(function() { sheet.data[i]=[]; var endDate = $(this).find("td.support_info p.deadlines").text(); if(endDate=="내일마감"){ var t= new Date(); t.setDate(t.getDate()+1); endDate=twostring(t.getMonth()+1)+'/'+twostring(t.getDate()); } else if(endDate=="오늘마감"){ var t= new Date(); endDate=twostring(t.getMonth()+1)+'/'+twostring(t.getDate()); }else if(endDate=="진행예정"){ }else{ endDate=endDate.substr(2,5); } var companyTitle = $(this).find("td.company_nm a").attr("title"); sheet.data[i].push(endDate,companyTitle); //console.log("마감일자 : " + endDate+" 회사명 : "+companyTitle+"\n"); i++; }); sheet.setCell("A1","마감일자"); sheet.setCell("B1","회사명"); var strm = fs.createWriteStream("test.xlsx"); xlsx.generate(strm);
그래서 결국 원하는 엑셀파일을 만들었습니다.
'dev > 데이터베이스' 카테고리의 다른 글
오라클 - 파티션 테이블 인덱스의 테이블 스페이스 변경 (0) | 2019.11.08 |
---|---|
오라클 - 인덱스 테이블 스페이스 변경 (0) | 2019.11.08 |
orient db 를 이용한 코드 중간단계. (0) | 2018.01.16 |
orient db 를 이용한 insert,select ,update, delete (0) | 2018.01.15 |
아주 간단한 노드js 웹 어플리케이션 (0) | 2018.01.13 |