Giter Club home page Giter Club logo

job-alert's Introduction

Job Alert

Job Alert

Overview | Features

Overview

여러 채용 사이트의 정보를 모아 메일 또는 슬랙으로 알려주는 채용 알림 서비스

여러 채용 사이트의 정보를 가져와 키워드별로 신규 채용건 혹은 갱신 채용건을 알려준다.

Feature

제공 사이트

  • 로켓펀치
  • 원티드

제공 알림 채널

  • 이메일 ( SENDGRID )

Environment

Environment Variable Development Default Production Default
SENDGRID_API_KEY n/a raise error

설치 및 실행 방법

git clone https://github.com/AsheKR/job-alert.git

pip install -r sources/requirements.txt

python run.py

Settings

sources/settings.yaml 파일을 통해 크롤러의 설정 값을 변경 할 수 있다.

extensions:  # 사용 가능한 확장팩 및 공통 설정을 나열하는 설정
    search_engines:  # 사용 가능한 검색 엔진
      rocket_punch: {}
      wanted: {}
    senders:  # 사용한 결과를 전송할 수단
      html_output: {}  # 디버깅을 위한 sender
      slack: {}
      send_grid:
        sender: <email>  # 결과를 전송할 이메일 주소
 
users:
  - user: <username>  # 설정을 저장할 유저의 이름
    search_engines:  # 검색엔진으로 사용할 설정 
      rocket_punch: {}
      wanted: {}
    senders:
      send_grid:
        recipient:
          - [email protected]
    keywords:  # 검색어로 지정할 것
      - django,ai  # 여러 태그를 AND 검색 하고싶다면 콤마로 구분한다. 
      - other_tag

개발 환경

TYPE SPEC
OS macOS Mojave 10.14.6
Python Python 3.8.2
Pyenv 1.2.17
Pip Pip 19.2.3

프로젝트 구조

트리모양의 프로젝트 구조를 를 가져올 때는 exa 라이브러리를 사용했습니다.

.                               # 루트는 git 과 관련된 설정
├── assets                  # github 에서 사용하는 이미지를 담아두는 폴더
├── licenses                # license 관련한 폴더
└── sources                     # Python 앱의 설정이나 코드 관리 설정
   ├── app                      # Python 실행 코드
   │  ├── crawlers
   │  ├── parsers
   │  ├── schemas
   │  ├── senders
   │  ├── static            # HTML 에서 사용되는 리소스
   │  ├── targets           # 크롤러 실행 시 파일을 기록하는 장소
   │  ├── templates         # HTML 을 만들 때 사용하는 코드
   │  ├── test
   │  └──run.py             # 실행 스크립트
   ├── requirements.txt
   └── settings.yaml        # 실행 설정

How Does it Work?

Github CI 에 스케쥴로 등록되어 자동으로 신규 채용건을 수집한다.

신규 채용건임을 알기 위해 최신 순으로 정렬된 채용 데이터를 받고, 최신 채용 ID 를 파일에 기록한다. 이후 최신순으로 정렬하고 파일에 저장된 최신 채용 ID 이 나타낼까지 데이터를 긁어 모아 알림을 보내고 다시 최신 채용 ID 를 기록하고를 반복한다.

새 크롤러를 추가하는 법

0. 구성

Company

회사 관련 데이터를 가지고 있다.

JobDetail

채용 관련 데이터를 가지고 있다.

1. 스키마 구현

각 사이트마다 가지고 있는 고유 정보가 다르기 때문에 스키마를 따로 구현한다. BaseSchema 는 가능하면 채워서 보여주도록한다.

schemas/__init__.py

회사 명을 Static 하게 포함하고 있는 곳이다. TYPE_<사이트명> 타입을 추가한다.

schemas/company/<사이트명>.py

schemas/company/base.py 를 상속받아 회사 데이터를 채우는 <사이트명>CompanySchema 클래스를 생성한다.

schemas/job_detail/<사이트명>.py

schemas/job_detail/base.py 를 상속받아 채용 데이터를 채우는 <사이트명>JobDetailSchema 클래스를 생성한다.

schemas/company/__init__.py

Company 로 사용 가능한 스키마를 모아두는 곳이다.

schemas/company/<사이트명>.py 를 구현했다면 CompanyOneOfSchematype_schemas 에 앞에서 만든 TYPE_<사이트명><사이트명>CompanySchemakey: value 로 담는다.

2. 크롤러 구현

sources/app/crawlers/__init__.py 파일의 BaseCrawler 를 상속하여 크롤러를 생성한다. NotImplementError, assert 로 실패하는 것들을 찾아 구현한다.

3. 스키마, 크롤러 등록

run.pySEARCH_ENGINES 에 다음과 같은 형식을 추가한다.

SEARCH_ENGINES = {
    TYPE_<사이트명>: {
        'label': '한글로 된 사이트명',
        'crawler': <사이트명>Crawler,
        'schema': 사이트명CompanySchema,
    }
}

새 센더를 추가하는 법

sources/app/senders/__init__.py 파일의 BaseSender 를 상속하여 크롤러를 생성한다. NotImplementError, assert 로 실패하는 것들을 찾아 구현한다.

크롤러를 구현했으면 sources/app/run.pySENDERS 의 형식에 맞춰 크롤러를 넣어준다. 이후부터 해당 센더를 동작시키기 위해 settings.yamlextensionssenders 의 키를 넣는다.

DEBUG Setting

1. search_engines DEBUG

extensions - search_engines 에 debug 를 주면 신규 채용건만 가져오는 것이 아니라 모든 채용건을 가져오도록한다.

extensions:
  search_engines:
    debug: {}
    rocket_punch: {}
    wanted: {}

users:
  - user: Ashe
    search_engins:
      rocket_punch: {}
      wanted: {}

2. sender DEBUG

extensions - senders 에 debug 를 주면 다른 곳으로 전송하지 않고 debug.html 파일로 결과를 보여준다.

extensions:
  senders:
    debug: {}

알림 시간을 변경하는 법

.github/workflows/auto-run.yml 파일의 on - schedule - cron 을 변경한다.

job-alert's People

Contributors

ashekr avatar

Watchers

James Cloos avatar

job-alert's Issues

정적 코드 분석 도구 추가

PROBLEM
코드 퀄리티를 위해 정적 코드 분석 도구를 추가 해야합니다.
선택의 과정과 이유에 대해서는 아래 이슈에 계속 적을 예정입니다.

슬랙 전송 기능

PROBLEM
전송 채널을 넓히기 위해 슬랙 전송 기능이 필요합니다.
전송 채널을 선택하는 설정이 필요하고 전송 채널 설정을 다루는 코드가 필요합니다.

테스트 추가

PROBLEM
정상 동작, Exception 동작에 대한 테스트 추가 할 예정입니다.

센트리 도입

PROBLEM
Sentry 를 사용하여 에러 로깅을 할 예정입니다.
Sentry 만으로 부족하다고 느낄 경우 에러가 날 만한 곳은 except Exception 으로 감싼 후 UnkwonError 라는 커스텀 Exception 을 만들어 필요한 정보를 전달 할 것입니다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.