Dandy Now!
  • [개인] 워크넷 맞춤 구직 정보 이메일로 받기 #1 | axios, cheerio 이용한 웹 크롤링
    2022년 04월 14일 23시 29분 00초에 업로드 된 글입니다.
    작성자: DandyNow
    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
    반응형
    댓글