프로젝트/[개인] 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=&regDateStdt=&employGbn=&empTpGbcd=&region=${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=&regDateEndt=&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 - 부산전체)

 

[그림 1] 크롤링 결과 8건

728x90
반응형