프로젝트/[개인] Web Crawling E-Mail Service
[개인] 워크넷 맞춤 구직 정보 이메일로 받기 #1 | axios, cheerio 이용한 웹 크롤링
DandyNow
2022. 4. 14. 23:29
728x90
반응형
| 개발 동기 및 내용
매번 워크넷에 들어가 비슷한 검색어를 입력하는 것이 번거로웠다. 스케줄링까지 적용해 매일 정해진 시간에 자동으로 이메일 구직 정보를 받아보는 프로그램을 만들고자 한다.
| 사용 기술
node.js와 axios, cheerio 모듈을 사용했다.
| 진행 현황
현재까지 구현한 기능은 "검색어(keyword), 검색 결과 수(resultCnt, 최대 검색 건수 기본값 10), 지역코드(regionNumber)"를 매개변수로 주면 "채용공고명, 회사명, 채용 공고 상세 페이지 url"을 크롤링하는 것이다.
| 다음 단계
크롤링된 정보를 gmail로 보내는 기능을 구현할 것이다.
| 작성 코드
const axios = require("axios");
const cheerio = require("cheerio");
// 크롤링 대상
const getHTML = async (keyword, resultCnt, regionNumber) => {
try {
const html = (
// getJobs()을 호출할 때 워크넷 url은 "검색어(encodeURI), 검색 결과 수(resultCnt), 지역코드(regionNumber)"를 동적으로 받음
await axios.get(
`https://www.work.go.kr/empInfo/empInfoSrch/list/dtlEmpSrchList.do?careerTo=&keywordJobCd=&occupation=&templateInfo=&shsyWorkSecd=&rot2WorkYn=&payGbn=&resultCnt=${resultCnt}&keywordJobCont=&cert=&cloDateStdt=&moreCon=&minPay=&codeDepth2Info=11000&isChkLocCall=&sortFieldInfo=DATE&major=&resrDutyExcYn=&eodwYn=&sortField=DATE&staArea=&sortOrderBy=DESC&keyword=${encodeURI(
keyword
)}&termSearchGbn=all&carrEssYns=&benefitSrchAndOr=O&disableEmpHopeGbn=&webIsOut=&actServExcYn=&maxPay=&keywordStaAreaNm=&emailApplyYn=&listCookieInfo=DTL&pageCode=&codeDepth1Info=11000&keywordEtcYn=&publDutyExcYn=&keywordJobCdSeqNo=&exJobsCd=&templateDepthNmInfo=&computerPreferential=®DateStdt=&employGbn=&empTpGbcd=®ion=${regionNumber}&infaYn=&resultCntInfo=${resultCnt}&siteClcd=all&cloDateEndt=&sortOrderByInfo=DESC&currntPageNo=1&indArea=&careerTypes=&searchOn=Y&tlmgYn=&subEmpHopeYn=&academicGbn=&templateDepthNoInfo=&foriegn=&mealOfferClcd=&station=&moerButtonYn=&holidayGbn=&enterPriseGbn=all&academicGbnoEdu=noEdu&cloTermSearchGbn=all&keywordWantedTitle=&stationNm=&benefitGbn=&keywordFlag=&essCertChk=&isEmptyHeader=&depth2SelCode=&_csrf=afefc5c3-fc99-440b-9f6d-563efe24d151&keywordBusiNm=&preferentialGbn=&rot3WorkYn=&pfMatterPreferential=®DateEndt=&staAreaLineInfo1=11000&staAreaLineInfo2=1&pageIndex=1&termContractMmcnt=&careerFrom=&laborHrShortYn=#viewSPL`
)
).data;
return html;
} catch (e) {
console.log(e);
}
};
// 크롤링, 파싱 처리
const parsing = async (page) => {
const $ = cheerio.load(page);
const jobs = [];
const $jobList = $("tbody tr");
$jobList.each((idx, node) => {
const jobTitle = $(node).find(".cp-info-in:eq(0)").text().trim(); // 채용공고명
const url =
"https://www.work.go.kr" + $(node).find(".cp-info-in > a").attr("href"); // 채용공고 상세 보기 url
const company = $(node).find(".cp_name:eq(0)").text().trim(); // 회사명
if (
jobTitle != ""
) {
jobs.push({
jobTitle,
company,
url,
});
}
});
console.log(jobs.length); // 총 검색된 게시글 수를 콘솔창에서 확인
return jobs;
};
// 검색어(keyword), 검색 결과 수(resultCnt, 최대 검색 건수 기본값 10), 지역코드(regionNumber)
const getJobs = async (keyword, resultCnt = "10", regionNumber = "") => {
const html = await getHTML(keyword, resultCnt, regionNumber);
const jobs = await parsing(html);
console.log(jobs);
};
getJobs("javascript", 1000, 26000); // 검색어 , 최대 검색 결과 수, 지역(26000 - 부산전체)
728x90
반응형