Skip to content
This repository has been archived by the owner on Dec 15, 2022. It is now read-only.

likelionmju/apply-crawling-9th

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Likelion Apply Crawler Project

요약

멋쟁이 사자처럼 9기 지원페이지에 지원한 지원자의 정보를 크롤링하여 정리

데모

성공

성공

실패

실패

실행 전

  1. Chrome 버전에 맞는 ChromeDriver./에 다운
  2. secrets.json에 다음 정보를 작성
    • ADMIN_ID: 관리자 아이디
    • ADMIN_PASSWORD: 관리자 비밀번호
    • EXCLUDES: 제외할 사람들 이름 (없다면 빈 리스트)
    • QUESTIONS: 질문 목록 (질문 번호는 제외)
    • EMAIL: 발신 이메일 (Gmail)
    • EMAIL_PASSWORD: Gmail 비밀번호 (Gmail 2중 인증 사용 시 앱 비밀번호)
    • EMAIL_FROM: 발신 이름

secrets.json 작성 예시

{
  "ADMIN_ID": "[email protected]",
  "ADMIN_PASSWORD": "xxxxxxxx",
  "EXCLUDES": [
    "김길동",
    "박길동"
  ],
  "QUESTIONS": [
    "질문",
    "질문",
    "질문",
    "질문",
    "질문"
  ],
  "EMAIL": "[email protected]",
  "EMAIL_PASSWORD": "xxxxxxx",
  "EMAIL_FROM": "멋쟁이사자처럼 X 명지대(서울)"
}

실행 방법

  1. git clone https://github.com/likelionmju/apply_crawling.git
  2. python3 -m venv venv
  3. mac OS: source venv/bin/activate
    Windows: venv/Scripts/activate
  4. pip install -r requirements.txt
  5. python src/main.py

크롤링 작동 순서

  1. 프로그램 시작 시 1입력

  2. 멋쟁이 사자처럼 9기 지원페이지에 로그인

    def login(admin_id: str, admin_password: str, with_headless: bool = True) -> dict:
       ...
  3. 일부 제외할 사람 외에 모든 지원자 정보 취합

    def request_univ_page_source(univ_code: str, login_info: dict) -> str:
         ...
    
    def extract_all_applicant_pks(univ_page_source: str) -> list:
         ...
    
    def request_applicant_source(applicant_pk: str, login_info: dict) -> str:
         ...
    
    def parse_applicant_page(page: str, q_count: int) -> Applicant:
         ...
  4. 지원자가 제출한 휴대폰 번호가 000-0000-0000의 형식을 따르지 않는 경우,
    변경

    applicant.format_phone_num()
  5. ../지원자 서류/내에 지원자 별로 학과_학번_이름폴더 생성

    if not applicant.root_dir.exists():
         applicant.root_dir.mkdir()
  6. 지원자가 별도의 파일을 제출했다면, 파일을 다운로드

    def download_applicant_file(applicant: Applicant) -> None:
         ...
  7. 파일의 확장자가 .zip 이면,
    ../지원자 서류/학과_학번_이름/시간표 및 포트폴리오/에 압축해제

    def unzip(target: Path, to) -> None:
         ...
  8. 다운로드한 파일의 확장자가 .png, .jpg, .jpeg인 경우,
    파일명을 시간표로 변경

  9. 다운로드한 파일의 확장자가 .pdf, .docx, .hwp인 경우,
    파일명을 포트폴리오로 변경

    def reformat_file(file: Path) -> None:
         ...
  10. 지원자의 정보를 개인별 폴더 내에 지원서.docx로 정리

def export_docx(applicant: Applicant) -> None:
     ...

.docx 출력 예시

이름: 홍길동
입학 년도: 2018년
전공: 국어국문학과
전화번호: 010-0000-0000
이메일: [email protected]
GitHub: X
SNS: X

1. 질문
답변

2. 질문
답변

3. 질문
답변

4. 질문
답변

5. 질문
답변
  1. 지원자의 정보를 ../applicant/[이름].pkl로 저장

  2. 모든 지원자의 정보를 ../applicant/지원자 정보.xlsx로 정리 (전공으로 오름차순 정렬)

    def gathering_applicant_data(applicants: list):
      ...
    • 다른 기준으로 정렬하고 싶다면, crawler.py의 line 241을 수정하여 사용

.xlsx출력 예시

# 이름 입학 년도 전공 전화번호 이메일 GitHub SNS 합격
1 홍길동 2018년 국어국문학과 010-0000-0000 [email protected] X X TRUE

정보 복원 작동 순서

  1. 프로그램 시작 시 2입력

  2. 정보를 복원할 지원자의 이름을 입력

  3. 지원자의 정보를 출력

합격 처리 작동 순서

  1. 프로그램 시작 시 3입력

  2. 합격 처리할 지원자들의 이름을 공백으로 구분하여 입력

    • ex) 홍길동, 이길동을 합격처리 시 홍길동 이길동으로 입력

메일 발송 작동 순서

  1. 프로그램 시작 시 4입력

  2. .pkl파일을 기준으로 메일을 발송

메일 사용 방법

./data/폴더를 생성 후 내부에 fail_subject, fail_text, pass_subject, pass_text파일을 작성

  • fail_subject: 탈락자 발송 메일 제목
  • fail_text: 탈락자 발송 메일 내용
  • pass_subject: 합격자 발송 메일 제목
  • pass_text: 합격자 발송 메일 내용

Markdown으로 작성 시 .html로 변환 후 발송

사용 라이브러리

  • beautifulsoup4 v4.9.3
  • pathos v0.2.7
  • python-docx v0.8.10
  • requests v2.25.1
  • selenium v3.141.0
  • yaspin v1.4.1
  • openpyxl v3.0.6
  • pandas v1.2.3
  • markdown2 v2.4.0

개발 환경

  • IntelliJ IDEA 2020.3.2 (Ultimate Edition)
  • macOS Big Sur v11.2.2
  • python 3.8.5

기타

  • Pipe-and-Filter 사용
  • pathos.multiprocessing으로 Multiprocessing 구현
  • 압축된 파일에 한글이 포함되어 있는 경우, 파일 명이 깨지는 것을 방지

만든 사람

  • AiRini 명지대학교 융합소프트웨어학부 응용소프트웨어전공 18학번

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages