diff --git a/backend/API/main.py b/backend/API/main.py index 0630490df..e2f9ac335 100644 --- a/backend/API/main.py +++ b/backend/API/main.py @@ -15,7 +15,6 @@ logger = logging.getLogger(__name__) - # --- Factory Pattern --- class RequestFactory: @staticmethod @@ -96,33 +95,21 @@ def get_company_name_by_detail_job(req: schemas.DetailJobRequest, db: Session = def get_job_posting(req: schemas.JobPostingRequest, db: Session = Depends(get_db)): req = RequestFactory.create(schemas.JobPostingRequest, req.dict()) - results = db.query( - RecruitQualification.company_type, - RecruitQualification.main_job, - RecruitQualification.location, - RecruitQualification.education_level, - RecruitQualification.major, - RecruitQualification.experience, - RecruitQualification.language_requirement, - RecruitQualification.military_requirement, - RecruitQualification.overseas_available, - RecruitQualification.etc_requirements, - RecruitQualification.process, - RecruitQualification.image - ).filter( - RecruitQualification.job_category == req.job_category, - RecruitQualification.company_name == req.company_name, - RecruitQualification.detail_job == req.detail_job - ).distinct().all() - - keys = [ - + fields = [ "company_type", "main_job", "location", "education_level", "major", "experience", "language_requirement", "military_requirement", "overseas_available", "etc_requirements", "process", "image" ] + get_attr = lambda field: getattr(RecruitQualification, field) - return ResultAdapter.to_dict_list(keys, results) + results = db.query(*(get_attr(f) for f in fields))\ + .filter( + RecruitQualification.job_category == req.job_category, + RecruitQualification.company_name == req.company_name, + RecruitQualification.detail_job == req.detail_job + ).distinct().all() + + return ResultAdapter.to_dict_list(fields, results) # 회사와 직무를 입력받아 합격자들을 받아옴 @app.post("/get-applicants-by-company-detail-job", response_model=list[schemas.ApplicantSchema], tags=["스펙 기준 검색"]) @@ -154,23 +141,14 @@ def get_detail_jobs_by_company(req: schemas.CompanyOnlyRequest, db: Session = De query = query.filter(Applicant.company == req.company) return [{"detail_job": r[0]} for r in query.distinct().all() if r[0] is not None] -# @app.get("/get-all-universities", response_model=list[str], tags=["스펙 기준 검색"]) -# @safe_handler -# def get_all_universities(db: Session = Depends(get_db)): -# return [r[0] for r in db.query(Applicant.university) -# .filter(Applicant.university.isnot(None)) -# .filter(Applicant.university != "") -# .distinct().all()] - # 모든 대학 드롭다운 @app.get("/get-all-universities", response_model=list[str], tags=["스펙 기준 검색"]) @safe_handler def get_all_universities(db: Session = Depends(get_db)): - extract = lambda row: row[0] - return list(map(extract, db.query(Applicant.university) - .filter(Applicant.university.isnot(None)) - .filter(Applicant.university != "") - .distinct().all())) + return [r[0] for r in db.query(Applicant.university) + .filter(Applicant.university.isnot(None)) + .filter(Applicant.university != "") + .distinct().all()] # 학교를 입력받아 합격자들 드롭다운 @app.post("/get-applicants-by-school", response_model=list[schemas.CompanyAndJob], tags=["스펙 기준 검색"]) diff --git a/backend/crawling/01_DB_test.ipynb b/backend/crawling/01_DB_test.ipynb deleted file mode 100644 index 0547373a7..000000000 --- a/backend/crawling/01_DB_test.ipynb +++ /dev/null @@ -1,511 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "1c81678a", - "metadata": {}, - "outputs": [], - "source": [ - "from sqlalchemy import create_engine, text\n", - "import pandas as pd\n", - "\n", - "# DB 정보\n", - "DATABASE_URL = \"postgresql+psycopg2://postgres:비밀번호@localhost:<>/<>\"\n", - "\n", - "# 엔진 만들기\n", - "engine = create_engine(DATABASE_URL)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "0c008a87", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
company_namecompany_typemain_jobdetail_joblocationqualificationprocess
0삼성전자대기업반도체공정 엔지니어수원학사 이상서류-면접-최종
1LG전자대기업가전R&D서울학사 이상서류-코딩-면접
\n", - "
" - ], - "text/plain": [ - " company_name company_type main_job detail_job location qualification \\\n", - "0 삼성전자 대기업 반도체 공정 엔지니어 수원 학사 이상 \n", - "1 LG전자 대기업 가전 R&D 서울 학사 이상 \n", - "\n", - " process \n", - "0 서류-면접-최종 \n", - "1 서류-코딩-면접 " - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# ✅ [3] 크롤링한 데이터 준비 (예시 DataFrame)\n", - "job_postings_data = pd.DataFrame({\n", - " 'company_name': ['삼성전자', 'LG전자'],\n", - " 'company_type': ['대기업', '대기업'],\n", - " 'main_job': ['반도체', '가전'],\n", - " 'detail_job': ['공정 엔지니어', 'R&D'],\n", - " 'location': ['수원', '서울'],\n", - " 'qualification': ['학사 이상', '학사 이상'],\n", - " 'process': ['서류-면접-최종', '서류-코딩-면접']\n", - "})\n", - "\n", - "# 확인\n", - "job_postings_data.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "04ee17e0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "✅ job_postings 삽입 완료!\n" - ] - } - ], - "source": [ - "# ✅ [4] job_postings 테이블에 데이터 삽입\n", - "job_postings_data.to_sql('job_postings', engine, if_exists='append', index=False)\n", - "print(\"✅ job_postings 삽입 완료!\")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "c3eefe53", - "metadata": {}, - "outputs": [], - "source": [ - "# ✅ [5] applicants 데이터 예시\n", - "applicants_data = pd.DataFrame({\n", - " 'company': ['삼성전자'],\n", - " 'division': ['DS부문'],\n", - " 'job_title': ['반도체공정기술'],\n", - " 'apply_term': ['2024 상반기'],\n", - " 'university': ['홍익대학교'],\n", - " 'major': ['화학공학과'],\n", - " 'gpa': [4.39],\n", - " 'gpa_scale': [4.5],\n", - " 'toeic': [905],\n", - " 'opic': ['IH'],\n", - " 'toeic_speaking': [None],\n", - " 'work_experience': [None]\n", - "})" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "81926e4e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "✅ applicants 삽입 완료!\n" - ] - } - ], - "source": [ - "applicants_data.to_sql('applicants', engine, if_exists='append', index=False)\n", - "print(\"✅ applicants 삽입 완료!\")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "d81fa2f5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "✅ 최근 applicants id: 1\n" - ] - } - ], - "source": [ - "# ✅ [6] certifications 데이터 예시\n", - "# 우선 applicants에 들어간 id 확인\n", - "with engine.connect() as conn:\n", - " result = conn.execute(text(\"SELECT id FROM applicants ORDER BY id DESC LIMIT 1\"))\n", - " applicant_id = result.scalar()\n", - " print(f\"✅ 최근 applicants id: {applicant_id}\")\n", - "\n", - "# certifications 데이터\n", - "certifications_data = pd.DataFrame({\n", - " 'applicant_id': [applicant_id, applicant_id, applicant_id],\n", - " 'certification_name': ['SQLD', '리눅스마스터 2급', '정보처리기사']\n", - "})" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "e9f36ca7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "✅ certifications 삽입 완료!\n" - ] - } - ], - "source": [ - "certifications_data.to_sql('certifications', engine, if_exists='append', index=False)\n", - "print(\"✅ certifications 삽입 완료!\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "6858073f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idcompany_namecompany_typemain_jobdetail_joblocationqualificationprocesscreated_at
01삼성전자대기업반도체 공정회로 설계수원학사 이상, 전공 무관서류 - 면접 - 최종2025-05-08 11:04:51.605152
12삼성전자대기업반도체 공정회로 설계수원학사 이상, 전공 무관서류 - 면접 - 최종2025-05-08 11:05:35.465879
23삼성전자대기업반도체공정 엔지니어수원학사 이상서류-면접-최종2025-05-08 11:26:08.031186
34LG전자대기업가전R&D서울학사 이상서류-코딩-면접2025-05-08 11:26:08.031186
\n", - "
" - ], - "text/plain": [ - " id company_name company_type main_job detail_job location qualification \\\n", - "0 1 삼성전자 대기업 반도체 공정 회로 설계 수원 학사 이상, 전공 무관 \n", - "1 2 삼성전자 대기업 반도체 공정 회로 설계 수원 학사 이상, 전공 무관 \n", - "2 3 삼성전자 대기업 반도체 공정 엔지니어 수원 학사 이상 \n", - "3 4 LG전자 대기업 가전 R&D 서울 학사 이상 \n", - "\n", - " process created_at \n", - "0 서류 - 면접 - 최종 2025-05-08 11:04:51.605152 \n", - "1 서류 - 면접 - 최종 2025-05-08 11:05:35.465879 \n", - "2 서류-면접-최종 2025-05-08 11:26:08.031186 \n", - "3 서류-코딩-면접 2025-05-08 11:26:08.031186 " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# ✅ [7] 결과 조회 (확인용)\n", - "pd.read_sql(\"SELECT * FROM job_postings;\", engine)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "bb96a107", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idcompanydivisionjob_titleapply_termuniversitymajorgpagpa_scaletoeicopictoeic_speakingwork_experience
01삼성전자DS부문반도체공정기술2024 상반기홍익대학교화학공학과4.394.5905IHNoneNone
\n", - "
" - ], - "text/plain": [ - " id company division job_title apply_term university major gpa \\\n", - "0 1 삼성전자 DS부문 반도체공정기술 2024 상반기 홍익대학교 화학공학과 4.39 \n", - "\n", - " gpa_scale toeic opic toeic_speaking work_experience \n", - "0 4.5 905 IH None None " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.read_sql(\"SELECT * FROM applicants;\", engine)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "7f7aca7f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idapplicant_idcertification_name
011SQLD
121리눅스마스터 2급
231정보처리기사
\n", - "
" - ], - "text/plain": [ - " id applicant_id certification_name\n", - "0 1 1 SQLD\n", - "1 2 1 리눅스마스터 2급\n", - "2 3 1 정보처리기사" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.read_sql(\"SELECT * FROM certifications;\", engine)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "hoenv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/backend/crawling/README.md b/backend/crawling/README.md index 665379448..b50f817b8 100644 --- a/backend/crawling/README.md +++ b/backend/crawling/README.md @@ -6,15 +6,11 @@ ## 🗂 개요 spectrackr의 기반이 되는 데이터베이스를 구축하기 위한 전처리 및 크롤링 파이프라인입니다. -총 3가지 핵심 데이터를 수집합니다: - • ✅ 합격자 정보 (applicants) - • ✅ 자격증 정보 (certifications) - • ✅ 기업의 모집 요강 (job_postings) + ## 🧩 기능 -### 1. 합격자 크롤링 -### + ## 실행 순서 diff --git a/backend/crawling/base SQL.sql b/backend/crawling/base SQL.sql deleted file mode 100644 index 955aaf55a..000000000 --- a/backend/crawling/base SQL.sql +++ /dev/null @@ -1,37 +0,0 @@ --- 테이블 1: 회사 - 직무 - 자격 정보 -CREATE TABLE job_postings ( - id SERIAL PRIMARY KEY, - company_name VARCHAR(255), - company_type VARCHAR(50), - main_job VARCHAR(100), - detail_job VARCHAR(100), - location VARCHAR(100), - qualification TEXT, - process TEXT, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - --- 테이블 2: 합격자 정보 -CREATE TABLE applicants ( - id SERIAL PRIMARY KEY, - company VARCHAR(255), - division VARCHAR(255), - job_title VARCHAR(255), - apply_term VARCHAR(100), - university VARCHAR(255), - major VARCHAR(255), - gpa DECIMAL(4,2), - gpa_scale DECIMAL(4,2), - toeic INT, - opic VARCHAR(20), - toeic_speaking VARCHAR(50), - work_experience TEXT -); - --- 테이블 3: 자격증 정보 -CREATE TABLE certifications ( - id SERIAL PRIMARY KEY, - applicant_id INT, - certification_name VARCHAR(255), - FOREIGN KEY (applicant_id) REFERENCES applicants(id) -); diff --git a/backend/crawling/certifications.csv b/backend/crawling/certifications.csv deleted file mode 100644 index 3fdcdab02..000000000 --- a/backend/crawling/certifications.csv +++ /dev/null @@ -1,14 +0,0 @@ -main_id,certification_name -1,SQLD -1,리눅스마스터 2급 -1,정보처리기사 -4,한국사검정시험: 고급 -4,컴퓨터활용능력: 1급 -4,운전면허 -5,공정실습 -5,데이터분석 교육 -6,우수논문상 수상 -6,VE경진대회 입상 -7,캡스톤 -7,특허유니버시아드 -7,컴퓨터활용능력: 1급 diff --git a/backend/crawling/cleaned_successful_applicants_specs.csv b/backend/crawling/cleaned_successful_applicants_specs.csv deleted file mode 100644 index 9324912f1..000000000 --- a/backend/crawling/cleaned_successful_applicants_specs.csv +++ /dev/null @@ -1,11 +0,0 @@ -company,division,job_title,apply_term,university,major,gpa,gpa_scale,toeic,opic,toeic_speaking,work_experience,other_certifications -삼성전자,DS부문 제조&기술담당,반도체공정기술,2024 상반기,홍익대학교,화학공학과,4.39,4.5,905,IH,,, -삼성전자,DA사업부 SW개발,,2024 상반기,인하대학교,컴퓨터공학과,3.47,,,IM2,,,"기타: SQLD, 리눅스마스터 2급, 정보처리기사" -삼성전자,AVP 사업팀,패키지 개발,2024 상반기,산기대,생명화학공학과,3.69,,750,IM2,,앰코코리아 1년, -삼성전자,DS 평가 및 분석,,2024 상반기,서성한,기계공학,4.13,4.5,,IM2,,삼성전자DS 장기현장실습 , -삼성전자,DS부문 Test&System Package총괄,패키지개발,2024 상반기,중앙대,기계공학과,4.31,4.5,,AL,,,"한국사검정시험: 고급, 컴퓨터활용능력: 1급, 기타: 운전면허" -삼성전자,DS 제조&기술담당,반도체공정기술,2024 상반기,홍익대학교,화학공학과,4.39,4.5,905,Ih,,,"공정실습, 데이터분석 교육" -삼성전자,파운드리사업부,회로설계,2024 상반기,인하대학교,정보통신공학과,3.85,4.5,,IH,,한국철도기술연구원 인턴 1회 ,"우수논문상 수상, VE경진대회 입상" -삼성전자,AVP사업팀,반도체공정기술,2024 상반기,숭실대,전기공학부,3.82,4.5,,IM1,,,"캡스톤,특허유니버시아드, 컴퓨터활용능력: 1급" -삼성전자,CTO_반도체연구소_반도체공정기술,,2024 상반기,건동홍,화학공학,3.5,4.5,,AL,,장비사 1년, -삼성전자,SW개발,,2024 상반기,지방,"전자공학, 컴퓨터공학",4.04,4.5,,,140,, diff --git a/backend/crawling/crawl_jikhang.py b/backend/crawling/crawl_jikhang.py new file mode 100644 index 000000000..8d16c6349 --- /dev/null +++ b/backend/crawling/crawl_jikhang.py @@ -0,0 +1,107 @@ +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.chrome.options import Options +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +import time +import pandas as pd + +# 크롬 설정 +options = Options() +options.add_experimental_option("detach", True) +driver = webdriver.Chrome(options=options) +driver.set_window_size(1280, 1024) +wait = WebDriverWait(driver, 20) + +# 사이트 접속 +driver.get("https://zighang.com/it") +time.sleep(2) + +# 직무 설정 +job_name = "서버·백엔드" + +# 직무 필터 열기 +arrow_xpath = '//*[@id="root"]/main/div[3]/div/div/div/div/div[2]/div/section/button[2]/div/img' +wait.until(EC.element_to_be_clickable((By.XPATH, arrow_xpath))).click() +print("직무 필터 열기 성공") +time.sleep(1) + +# 직무 클릭 +job_button_xpath = f'//button[normalize-space()="{job_name}"]' +wait.until(EC.element_to_be_clickable((By.XPATH, job_button_xpath))).click() +print(f" 직무 '{job_name}' 선택 완료") +time.sleep(1) + +# 공고 보기 클릭 +confirm_button = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.sticky.bottom-0 button.bg-primary'))) +driver.execute_script("arguments[0].scrollIntoView(true);", confirm_button) +driver.execute_script("arguments[0].click();", confirm_button) +print("공고 보기 버튼 클릭 완료") +wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'p.ds-web-title2'))) +print("공고 리스트 로딩 완료") + +# 공고 순회 +MAX_CLICKS = 10 +original_tab = driver.current_window_handle +results = [] + +for i in range(2, MAX_CLICKS + 1): + try: + title_xpath = f'(//p[contains(@class, "ds-web-title2")])[{i}]' + title_elem = wait.until(EC.presence_of_element_located((By.XPATH, title_xpath))) + driver.execute_script("arguments[0].scrollIntoView(true);", title_elem) + driver.execute_script("window.scrollBy(0, -200);") + time.sleep(0.3) + parent_link = title_elem.find_element(By.XPATH, "./ancestor::a[1]") + driver.execute_script("arguments[0].click();", parent_link) + print(f"▶️ [{i}]번째 공고 클릭 → 새 탭 열림 예상") + time.sleep(2) + + # 새 탭 전환 + new_tab = [tab for tab in driver.window_handles if tab != original_tab][0] + driver.switch_to.window(new_tab) + + # 공고 정보 크롤링 + data = {} + data["회사명"] = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[1]/div[1]/div/a').text + data["경력"] = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[1]/div/div').text + data["학력"] = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[3]/div/div').text + data["근무지"] = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[2]/div/div').text + data["직군"] = job_name + + try: + data["우대사항"] = driver.find_element(By.XPATH, '//h2[text()="우대사항"]/following-sibling::p').text + print(f"우대사항 크롤링 완료: {data['우대사항'][:10]}...") + except: + data["우대사항"] = "" + + try: + data["자격요건"] = driver.find_element(By.XPATH, '//h2[text()="자격요건"]/following-sibling::p').text + print(f"자격요건 크롤링 완료: {data['자격요건'][:10]}...") + except: + data["자격요건"] = "" + + if data["우대사항"] == "" and data["자격요건"] == "": + try: + img_elem = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[4]/img') + data["이미지경로"] = img_elem.get_attribute("src") + print("이미지 URL 저장 완료") + except: + data["이미지경로"] = "" + print("이미지 URL 저장 실패") + else: + data["이미지경로"] = "" + + results.append(data) + driver.close() + driver.switch_to.window(original_tab) + print(f"🔙 기존 탭 복귀 완료\n") + + except Exception as e: + print(f"[{i}]번째 공고 실패: {e}") + continue + +# 엑셀 저장 +df = pd.DataFrame(results) +df.to_excel("직행_크롤링_결과.xlsx", index=False) +print("엑셀 저장 완료") diff --git a/backend/crawling/crawl_linkareer.py b/backend/crawling/crawl_linkareer.py new file mode 100644 index 000000000..0b25d1b11 --- /dev/null +++ b/backend/crawling/crawl_linkareer.py @@ -0,0 +1,102 @@ +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.chrome.options import Options +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +import time + +import pandas as pd +import time + + +chrome_options = Options() +chrome_options.add_experimental_option("detach", True) +driver = webdriver.Chrome(options=chrome_options) +wait = WebDriverWait(driver, 10) + +results = [] + +# 크롤링할 페이지 범위 (1~5페이지 예시) +for page in range(1, 6): # 필요시 1~원하는 페이지 범위 수정 + list_url = f"https://linkareer.com/list/recruit?filterBy_activityTypeID=5&filterBy_categoryIDs=58&filterBy_status=OPEN&orderBy_direction=DESC&orderBy_field=RECENT&page={page}" + driver.get(list_url) + time.sleep(2) + + print(f"📄 {page}페이지 접속 완료") + + # 메인 탭 핸들 저장 + main_window = driver.current_window_handle + + # 공고 row 개수 가져오기 + row_count = len(driver.find_elements(By.XPATH, '//*[@id="__next"]/div[1]/div/main/div/section/div[2]/table/tbody/tr')) + print(f"{row_count}개의 공고 탐색 예정") + + for i in range(1, row_count + 1): + try: + link_element = driver.find_element(By.XPATH, f'//*[@id="__next"]/div[1]/div/main/div/section/div[2]/table/tbody/tr[{i}]/td[2]/div/a/div/p') + link_element.click() + + # 새 탭으로 전환 + driver.switch_to.window(driver.window_handles[-1]) + + # 기본 정보 크롤링 + company_name = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="__next"]/div[1]/div/main/div/div/section[1]/div/article/header/h2'))).text.strip() + company_type = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="__next"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[1]/dd'))).text.strip() + + position_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="__next"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[5]/dd'))) + position = position_element.text.strip() + + # 모든 p 태그 텍스트 수집 + p_elements = driver.find_elements(By.XPATH, '//*[@id="DETAIL"]/section[1]/div/p') + p_texts = [p.text.strip() for p in p_elements] + + # 자격요건/모집직무 인덱스 탐색 + qual_idx = next((idx for idx, text in enumerate(p_texts) if '자격요건' in text or '자격 요건' in text), None) + pos_idx = next((idx for idx, text in enumerate(p_texts) if '모집 직무' in text or '세부 직무' in text), None) + + # 자격요건 텍스트 추출 + qualification_texts = [] + if qual_idx is not None: + for t in p_texts[qual_idx + 1:]: + if any(keyword in t for keyword in ['지원', '혜택', '우대', '다음', '근무']): + break + qualification_texts.append(t) + qualification = "\n".join(qualification_texts) + + # 세부직무 추출 + detail_position = '' + if pos_idx is not None: + detail_position = p_texts[pos_idx + 1] if pos_idx + 1 < len(p_texts) else '' + + # 결과 저장 + results.append({ + '회사명': company_name, + '기업형태': company_type, + '모집직무': position, + '세부직무': detail_position, + '자격요건': qualification + }) + + print(f"{company_name} ({i}/{row_count}, page {page}) 크롤링 완료") + + # 새 탭 닫기 & 메인 탭으로 전환 + driver.close() + driver.switch_to.window(main_window) + + time.sleep(1) + + except Exception as e: + print(f"{page}페이지 {i}번째 공고 오류: {e}") + # 예외 시 새 탭 닫고 메인 탭 복귀 + if len(driver.window_handles) > 1: + driver.close() + driver.switch_to.window(main_window) + continue + +driver.quit() + +# DataFrame 변환 및 저장 +df = pd.DataFrame(results) +df.to_csv('linkareer_crawling.csv', index=False, encoding='utf-8-sig') + +print("크롤링 완료! CSV 저장됨.") \ No newline at end of file diff --git a/backend/crawling/crawling_demo_jikhaeng.ipynb b/backend/crawling/crawling_demo_jikhaeng.ipynb deleted file mode 100644 index 82b9ca9f6..000000000 --- a/backend/crawling/crawling_demo_jikhaeng.ipynb +++ /dev/null @@ -1,922 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "2c9945dc", - "metadata": {}, - "source": [ - "### [기본 테스트용] 열고 닫기만 하는 셀레니움 코드" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "e98fe0d3", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "✅ 직무 필터 열기 성공\n", - "✅ 직무 '서버·백엔드' 선택 완료\n", - "✅ 공고 보기 버튼 클릭 시도 완료\n", - "✅ 공고 리스트 로딩 완료\n", - "▶️ [1]번째 공고 클릭 → 새 탭 열림 예상\n", - "🆕 새 탭 전환 완료\n", - "🔙 기존 탭 복귀 완료\n", - "▶️ [2]번째 공고 클릭 → 새 탭 열림 예상\n", - "🆕 새 탭 전환 완료\n", - "🔙 기존 탭 복귀 완료\n", - "▶️ [3]번째 공고 클릭 → 새 탭 열림 예상\n", - "🆕 새 탭 전환 완료\n", - "🔙 기존 탭 복귀 완료\n", - "▶️ [4]번째 공고 클릭 → 새 탭 열림 예상\n", - "🆕 새 탭 전환 완료\n", - "🔙 기존 탭 복귀 완료\n", - "▶️ [5]번째 공고 클릭 → 새 탭 열림 예상\n", - "🆕 새 탭 전환 완료\n", - "🔙 기존 탭 복귀 완료\n", - "▶️ [6]번째 공고 클릭 → 새 탭 열림 예상\n", - "🆕 새 탭 전환 완료\n", - "🔙 기존 탭 복귀 완료\n", - "▶️ [7]번째 공고 클릭 → 새 탭 열림 예상\n", - "🆕 새 탭 전환 완료\n", - "🔙 기존 탭 복귀 완료\n", - "▶️ [8]번째 공고 클릭 → 새 탭 열림 예상\n", - "🆕 새 탭 전환 완료\n", - "🔙 기존 탭 복귀 완료\n", - "▶️ [9]번째 공고 클릭 → 새 탭 열림 예상\n", - "🆕 새 탭 전환 완료\n", - "🔙 기존 탭 복귀 완료\n", - "▶️ [10]번째 공고 클릭 → 새 탭 열림 예상\n", - "🆕 새 탭 전환 완료\n", - "🔙 기존 탭 복귀 완료\n" - ] - } - ], - "source": [ - "from selenium import webdriver\n", - "from selenium.webdriver.common.by import By\n", - "from selenium.webdriver.chrome.options import Options\n", - "from selenium.webdriver.support.ui import WebDriverWait\n", - "from selenium.webdriver.support import expected_conditions as EC\n", - "import time\n", - "\n", - "# ✅ 크롬 옵션 설정\n", - "options = Options()\n", - "options.add_experimental_option(\"detach\", True)\n", - "driver = webdriver.Chrome(options=options)\n", - "\n", - "# ✅ 창 크기 고정 (반응형 대응)\n", - "driver.set_window_size(1280, 1024)\n", - "wait = WebDriverWait(driver, 20)\n", - "\n", - "# ✅ 사이트 접속\n", - "driver.get(\"https://zighang.com/it\")\n", - "time.sleep(2)\n", - "\n", - "# ✅ 원하는 직무 설정\n", - "job_name = \"서버·백엔드\" # 또는 프론트엔드, AI 등\n", - "\n", - "# ✅ 1. 직무 필터 열기\n", - "try:\n", - " arrow_xpath = '//*[@id=\"root\"]/main/div[3]/div/div/div/div/div[2]/div/section/button[2]/div/img'\n", - " arrow_button = wait.until(EC.element_to_be_clickable((By.XPATH, arrow_xpath)))\n", - " arrow_button.click()\n", - " print(\"✅ 직무 필터 열기 성공\")\n", - " time.sleep(1)\n", - "except Exception as e:\n", - " print(f\"❌ 직무 필터 열기 실패: {e}\")\n", - " driver.quit()\n", - "\n", - "# ✅ 2. 직무 클릭\n", - "try:\n", - " job_button_xpath = f'//button[normalize-space()=\"{job_name}\"]'\n", - " job_button = wait.until(EC.element_to_be_clickable((By.XPATH, job_button_xpath)))\n", - " job_button.click()\n", - " print(f\"✅ 직무 '{job_name}' 선택 완료\")\n", - " time.sleep(1)\n", - "except Exception as e:\n", - " print(f\"❌ 직무 선택 실패: {e}\")\n", - " driver.quit()\n", - "\n", - "# ✅ 3. 공고 보기 버튼 클릭\n", - "try:\n", - " confirm_button = wait.until(EC.presence_of_element_located((\n", - " By.CSS_SELECTOR, 'div.sticky.bottom-0 button.bg-primary'\n", - " )))\n", - " driver.execute_script(\"arguments[0].scrollIntoView(true);\", confirm_button)\n", - " time.sleep(0.3)\n", - " driver.execute_script(\"arguments[0].click();\", confirm_button)\n", - " print(\"✅ 공고 보기 버튼 클릭 시도 완료\")\n", - "\n", - " wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'p.ds-web-title2')))\n", - " print(\"✅ 공고 리스트 로딩 완료\")\n", - " time.sleep(1)\n", - "\n", - "except Exception as e:\n", - " print(f\"❌ 공고 보기 버튼 클릭 또는 공고 로딩 실패: {e}\")\n", - " driver.quit()\n", - "\n", - "# ✅ 4. 공고 클릭 + 목록 버튼으로 복귀 반복\n", - "MAX_CLICKS = 10\n", - "original_tab = driver.current_window_handle # 현재 탭 저장\n", - "\n", - "for i in range(1, MAX_CLICKS + 1):\n", - " try:\n", - " # 공고 제목 기준으로 찾음\n", - " title_xpath = f'(//p[contains(@class, \"ds-web-title2\")])[{i}]'\n", - " title_elem = wait.until(EC.presence_of_element_located((By.XPATH, title_xpath)))\n", - "\n", - " # 스크롤 위치 조정\n", - " driver.execute_script(\"arguments[0].scrollIntoView(true);\", title_elem)\n", - " driver.execute_script(\"window.scrollBy(0, -200);\")\n", - " time.sleep(0.3)\n", - "\n", - " # 상위 a 태그 클릭 (새 탭 열릴 것)\n", - " parent_link = title_elem.find_element(By.XPATH, \"./ancestor::a[1]\")\n", - " driver.execute_script(\"arguments[0].click();\", parent_link)\n", - " print(f\"▶️ [{i}]번째 공고 클릭 → 새 탭 열림 예상\")\n", - " time.sleep(2)\n", - "\n", - " # ✅ 새 탭으로 전환\n", - " all_tabs = driver.window_handles\n", - " new_tab = [tab for tab in all_tabs if tab != original_tab][0]\n", - " driver.switch_to.window(new_tab)\n", - " print(f\"🆕 새 탭 전환 완료\")\n", - "\n", - " # 원하는 행동 (ex: 크롤링) 가능\n", - " time.sleep(2)\n", - "\n", - " # ✅ 새 탭 닫기 & 원래 탭으로 복귀\n", - " driver.close()\n", - " driver.switch_to.window(original_tab)\n", - " print(f\"🔙 기존 탭 복귀 완료\")\n", - " time.sleep(1)\n", - "\n", - " except Exception as e:\n", - " print(f\"❌ [{i}]번째 공고 실패: {e}\")\n", - " continue\n" - ] - }, - { - "cell_type": "markdown", - "id": "e357f4de", - "metadata": {}, - "source": [ - "### 채용공고 긁어오기 추가" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "8f905112", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "🖼️ [2] 텍스트 미존재 → 이미지 저장 완료: 쿠팡_공고2.png\n", - "❌ [3] 이미지 크롤링 실패: Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[4]/img\"}\n", - " (Session info: chrome=137.0.7151.69); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception\n", - "Stacktrace:\n", - "0 chromedriver 0x000000010504a654 cxxbridge1$str$ptr + 2723108\n", - "1 chromedriver 0x00000001050428c8 cxxbridge1$str$ptr + 2690968\n", - "2 chromedriver 0x0000000104b96714 cxxbridge1$string$len + 90428\n", - "3 chromedriver 0x0000000104bdd7c0 cxxbridge1$string$len + 381416\n", - "4 chromedriver 0x0000000104c1ede8 cxxbridge1$string$len + 649232\n", - "5 chromedriver 0x0000000104bd19c8 cxxbridge1$string$len + 332784\n", - "6 chromedriver 0x000000010500e278 cxxbridge1$str$ptr + 2476360\n", - "7 chromedriver 0x000000010501150c cxxbridge1$str$ptr + 2489308\n", - "8 chromedriver 0x0000000104fefa64 cxxbridge1$str$ptr + 2351412\n", - "9 chromedriver 0x0000000105011d94 cxxbridge1$str$ptr + 2491492\n", - "10 chromedriver 0x0000000104fe0d58 cxxbridge1$str$ptr + 2290728\n", - "11 chromedriver 0x0000000105031d60 cxxbridge1$str$ptr + 2622512\n", - "12 chromedriver 0x0000000105031eec cxxbridge1$str$ptr + 2622908\n", - "13 chromedriver 0x0000000105042514 cxxbridge1$str$ptr + 2690020\n", - "14 libsystem_pthread.dylib 0x00000001901cec0c _pthread_start + 136\n", - "15 libsystem_pthread.dylib 0x00000001901c9b80 thread_start + 8\n", - "\n", - "❌ [4] 이미지 크롤링 실패: Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[4]/img\"}\n", - " (Session info: chrome=137.0.7151.69); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception\n", - "Stacktrace:\n", - "0 chromedriver 0x000000010504a654 cxxbridge1$str$ptr + 2723108\n", - "1 chromedriver 0x00000001050428c8 cxxbridge1$str$ptr + 2690968\n", - "2 chromedriver 0x0000000104b96714 cxxbridge1$string$len + 90428\n", - "3 chromedriver 0x0000000104bdd7c0 cxxbridge1$string$len + 381416\n", - "4 chromedriver 0x0000000104c1ede8 cxxbridge1$string$len + 649232\n", - "5 chromedriver 0x0000000104bd19c8 cxxbridge1$string$len + 332784\n", - "6 chromedriver 0x000000010500e278 cxxbridge1$str$ptr + 2476360\n", - "7 chromedriver 0x000000010501150c cxxbridge1$str$ptr + 2489308\n", - "8 chromedriver 0x0000000104fefa64 cxxbridge1$str$ptr + 2351412\n", - "9 chromedriver 0x0000000105011d94 cxxbridge1$str$ptr + 2491492\n", - "10 chromedriver 0x0000000104fe0d58 cxxbridge1$str$ptr + 2290728\n", - "11 chromedriver 0x0000000105031d60 cxxbridge1$str$ptr + 2622512\n", - "12 chromedriver 0x0000000105031eec cxxbridge1$str$ptr + 2622908\n", - "13 chromedriver 0x0000000105042514 cxxbridge1$str$ptr + 2690020\n", - "14 libsystem_pthread.dylib 0x00000001901cec0c _pthread_start + 136\n", - "15 libsystem_pthread.dylib 0x00000001901c9b80 thread_start + 8\n", - "\n", - "🖼️ [5] 텍스트 미존재 → 이미지 저장 완료: 네이버클라우드_공고5.png\n", - "🖼️ [6] 텍스트 미존재 → 이미지 저장 완료: 클로봇_공고6.png\n", - "🖼️ [7] 텍스트 미존재 → 이미지 저장 완료: 코웨이_공고7.png\n", - "🖼️ [8] 텍스트 미존재 → 이미지 저장 완료: NHN_공고8.png\n", - "🖼️ [9] 텍스트 미존재 → 이미지 저장 완료: 네이버클라우드_공고9.png\n", - "✅ [10] 텍스트 기반 우대사항/자격요건 크롤링 완료\n", - "✅ 엑셀 저장 완료\n" - ] - } - ], - "source": [ - "from selenium import webdriver\n", - "from selenium.webdriver.common.by import By\n", - "from selenium.webdriver.chrome.options import Options\n", - "from selenium.webdriver.support.ui import WebDriverWait\n", - "from selenium.webdriver.support import expected_conditions as EC\n", - "import os\n", - "import time\n", - "import requests\n", - "import pandas as pd\n", - "\n", - "# ✅ 크롬 옵션\n", - "options = Options()\n", - "options.add_experimental_option(\"detach\", True)\n", - "driver = webdriver.Chrome(options=options)\n", - "driver.set_window_size(1280, 1024)\n", - "wait = WebDriverWait(driver, 20)\n", - "\n", - "# ✅ 사이트 접속\n", - "driver.get(\"https://zighang.com/it\")\n", - "time.sleep(2)\n", - "\n", - "# ✅ 원하는 직무\n", - "job_name = \"서버·백엔드\"\n", - "\n", - "# ✅ 필터 열기\n", - "arrow_xpath = '//*[@id=\"root\"]/main/div[3]/div/div/div/div/div[2]/div/section/button[2]/div/img'\n", - "wait.until(EC.element_to_be_clickable((By.XPATH, arrow_xpath))).click()\n", - "time.sleep(1)\n", - "\n", - "# ✅ 직무 선택\n", - "job_xpath = f'//button[normalize-space()=\"{job_name}\"]'\n", - "wait.until(EC.element_to_be_clickable((By.XPATH, job_xpath))).click()\n", - "time.sleep(1)\n", - "\n", - "# ✅ 공고 보기 클릭\n", - "confirm_button = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.sticky.bottom-0 button.bg-primary')))\n", - "driver.execute_script(\"arguments[0].scrollIntoView(true);\", confirm_button)\n", - "driver.execute_script(\"arguments[0].click();\", confirm_button)\n", - "wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'p.ds-web-title2')))\n", - "time.sleep(1)\n", - "\n", - "# ✅ 공고 탐색\n", - "MAX_CLICKS = 10\n", - "original_tab = driver.current_window_handle\n", - "results = []\n", - "\n", - "for i in range(2, MAX_CLICKS + 1):\n", - " try:\n", - " title_xpath = f'(//p[contains(@class, \"ds-web-title2\")])[{i}]'\n", - " title_elem = wait.until(EC.presence_of_element_located((By.XPATH, title_xpath)))\n", - " driver.execute_script(\"arguments[0].scrollIntoView(true);\", title_elem)\n", - " driver.execute_script(\"window.scrollBy(0, -200);\")\n", - " parent_link = title_elem.find_element(By.XPATH, \"./ancestor::a[1]\")\n", - " driver.execute_script(\"arguments[0].click();\", parent_link)\n", - " time.sleep(2)\n", - "\n", - " # 새 탭으로 이동\n", - " new_tab = [tab for tab in driver.window_handles if tab != original_tab][0]\n", - " driver.switch_to.window(new_tab)\n", - " time.sleep(2)\n", - "\n", - " # ✅ 데이터 수집\n", - " data = {}\n", - " data[\"회사명\"] = driver.find_element(By.XPATH, '//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[1]/div[1]/div/a').text\n", - " data[\"경력\"] = driver.find_element(By.XPATH, '//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[1]/div/div').text\n", - " data[\"학력\"] = driver.find_element(By.XPATH, '//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[3]/div/div').text\n", - " data[\"근무지\"] = driver.find_element(By.XPATH, '//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[2]/div/div').text\n", - " data[\"직군\"] = driver.find_element(By.XPATH, '//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[5]/div/div/div').text\n", - "\n", - " # ✅ 텍스트 or 이미지 처리\n", - " try:\n", - " prefers = driver.find_element(By.XPATH, '//h2[text()=\"우대사항\"]/following-sibling::p[1]').text\n", - " requires = driver.find_element(By.XPATH, '//h2[text()=\"자격요건\"]/following-sibling::p[1]').text\n", - " data[\"우대사항\"] = prefers\n", - " data[\"자격요건\"] = requires\n", - " data[\"이미지경로\"] = \"\"\n", - " print(f\"✅ [{i}] 텍스트 기반 우대사항/자격요건 크롤링 완료\")\n", - " except:\n", - " try:\n", - " img_elem = driver.find_element(By.XPATH, '//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[4]/img')\n", - " img_url = img_elem.get_attribute(\"src\")\n", - " filename = f\"{data['회사명']}_공고{i}.png\"\n", - " os.makedirs(\"downloads\", exist_ok=True)\n", - " filepath = os.path.join(\"downloads\", filename)\n", - " with open(filepath, \"wb\") as f:\n", - " f.write(requests.get(img_url).content)\n", - " data[\"이미지경로\"] = filepath\n", - " data[\"우대사항\"] = \"\"\n", - " data[\"자격요건\"] = \"\"\n", - " print(f\"🖼️ [{i}] 텍스트 미존재 → 이미지 저장 완료: {filename}\")\n", - " except Exception as img_e:\n", - " print(f\"❌ [{i}] 이미지 크롤링 실패: {img_e}\")\n", - "\n", - " results.append(data)\n", - "\n", - " driver.close()\n", - " driver.switch_to.window(original_tab)\n", - " time.sleep(1)\n", - "\n", - " except Exception as e:\n", - " print(f\"❌ [{i}] 공고 처리 실패: {e}\")\n", - " driver.switch_to.window(original_tab)\n", - " continue\n", - "\n", - "# ✅ 엑셀 저장\n", - "df = pd.DataFrame(results)\n", - "df.to_excel(\"채용공고_크롤링결과.xlsx\", index=False)\n", - "print(\"✅ 엑셀 저장 완료\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "558f983c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
회사명경력학력근무지직군이미지경로우대사항자격요건
0쿠팡신입학사서울서버·백엔드, 안드로이드, iOSdownloads/쿠팡_공고2.png
1팀리부뜨3~8년차학력 무관기타서버·백엔드, DevOps·SRENaNNaNNaN
2팀리부뜨2~8년차학력 무관서울서버·백엔드NaNNaNNaN
3네이버클라우드경력 무관학사경기기타교육, 서버·백엔드downloads/네이버클라우드_공고5.png
4클로봇10년차 이상학력 무관서울기타엔지니어링·R&D, 로봇SW, 서버·백엔드, 프론트엔드downloads/클로봇_공고6.png
5코웨이7년차 이상학력 무관서울서버·백엔드, 사물인터넷(IoT), DevOps·SREdownloads/코웨이_공고7.png
6NHN5년차 이상학력 무관경기서버·백엔드, 소프트웨어 엔지니어, 게임개발(서버)downloads/NHN_공고8.png
7네이버클라우드3년차, 10년차학력 무관경기안드로이드, iOS, 프론트엔드, 서버·백엔드downloads/네이버클라우드_공고9.png
8액티부키3~10년차학력 무관전북서버·백엔드, 백엔드, 웹풀스택• 지도 관련 개발 경험자\\n• 결제 관련 개발 경험자\\n• B2C 플랫폼 개발 경...• 개발 3년 이상 경력의 중급개발자\\n• IntelliJ 가능\\n• Spring ...
\n", - "
" - ], - "text/plain": [ - " 회사명 경력 학력 근무지 직군 \\\n", - "0 쿠팡 신입 학사 서울 서버·백엔드, 안드로이드, iOS \n", - "1 팀리부뜨 3~8년차 학력 무관 기타 서버·백엔드, DevOps·SRE \n", - "2 팀리부뜨 2~8년차 학력 무관 서울 서버·백엔드 \n", - "3 네이버클라우드 경력 무관 학사 경기 기타교육, 서버·백엔드 \n", - "4 클로봇 10년차 이상 학력 무관 서울 기타엔지니어링·R&D, 로봇SW, 서버·백엔드, 프론트엔드 \n", - "5 코웨이 7년차 이상 학력 무관 서울 서버·백엔드, 사물인터넷(IoT), DevOps·SRE \n", - "6 NHN 5년차 이상 학력 무관 경기 서버·백엔드, 소프트웨어 엔지니어, 게임개발(서버) \n", - "7 네이버클라우드 3년차, 10년차 학력 무관 경기 안드로이드, iOS, 프론트엔드, 서버·백엔드 \n", - "8 액티부키 3~10년차 학력 무관 전북 서버·백엔드, 백엔드, 웹풀스택 \n", - "\n", - " 이미지경로 \\\n", - "0 downloads/쿠팡_공고2.png \n", - "1 NaN \n", - "2 NaN \n", - "3 downloads/네이버클라우드_공고5.png \n", - "4 downloads/클로봇_공고6.png \n", - "5 downloads/코웨이_공고7.png \n", - "6 downloads/NHN_공고8.png \n", - "7 downloads/네이버클라우드_공고9.png \n", - "8 \n", - "\n", - " 우대사항 \\\n", - "0 \n", - "1 NaN \n", - "2 NaN \n", - "3 \n", - "4 \n", - "5 \n", - "6 \n", - "7 \n", - "8 • 지도 관련 개발 경험자\\n• 결제 관련 개발 경험자\\n• B2C 플랫폼 개발 경... \n", - "\n", - " 자격요건 \n", - "0 \n", - "1 NaN \n", - "2 NaN \n", - "3 \n", - "4 \n", - "5 \n", - "6 \n", - "7 \n", - "8 • 개발 3년 이상 경력의 중급개발자\\n• IntelliJ 가능\\n• Spring ... " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "d8af31f5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "✅ 직무 필터 열기 성공\n", - "✅ 직무 '서버·백엔드' 선택 완료\n", - "✅ 공고 보기 버튼 클릭 완료\n", - "✅ 공고 리스트 로딩 완료\n", - "▶️ [2]번째 공고 클릭 → 새 탭 열림 예상\n", - "🖼️ 이미지 URL 저장 완료\n", - "🔙 기존 탭 복귀 완료\n", - "\n", - "▶️ [3]번째 공고 클릭 → 새 탭 열림 예상\n", - "❌ 이미지 URL 저장 실패\n", - "🔙 기존 탭 복귀 완료\n", - "\n", - "▶️ [4]번째 공고 클릭 → 새 탭 열림 예상\n", - "❌ 이미지 URL 저장 실패\n", - "🔙 기존 탭 복귀 완료\n", - "\n", - "▶️ [5]번째 공고 클릭 → 새 탭 열림 예상\n", - "🖼️ 이미지 URL 저장 완료\n", - "🔙 기존 탭 복귀 완료\n", - "\n", - "▶️ [6]번째 공고 클릭 → 새 탭 열림 예상\n", - "🖼️ 이미지 URL 저장 완료\n", - "🔙 기존 탭 복귀 완료\n", - "\n", - "▶️ [7]번째 공고 클릭 → 새 탭 열림 예상\n", - "🖼️ 이미지 URL 저장 완료\n", - "🔙 기존 탭 복귀 완료\n", - "\n", - "▶️ [8]번째 공고 클릭 → 새 탭 열림 예상\n", - "🖼️ 이미지 URL 저장 완료\n", - "🔙 기존 탭 복귀 완료\n", - "\n", - "▶️ [9]번째 공고 클릭 → 새 탭 열림 예상\n", - "🖼️ 이미지 URL 저장 완료\n", - "🔙 기존 탭 복귀 완료\n", - "\n", - "▶️ [10]번째 공고 클릭 → 새 탭 열림 예상\n", - "✅ 우대사항 크롤링 완료: • 지도 관련 개발...\n", - "✅ 자격요건 크롤링 완료: • 개발 3년 이상...\n", - "🔙 기존 탭 복귀 완료\n", - "\n", - "✅ 엑셀 저장 완료\n" - ] - } - ], - "source": [ - "from selenium import webdriver\n", - "from selenium.webdriver.common.by import By\n", - "from selenium.webdriver.chrome.options import Options\n", - "from selenium.webdriver.support.ui import WebDriverWait\n", - "from selenium.webdriver.support import expected_conditions as EC\n", - "import time\n", - "import pandas as pd\n", - "\n", - "# ✅ 크롬 설정\n", - "options = Options()\n", - "options.add_experimental_option(\"detach\", True)\n", - "driver = webdriver.Chrome(options=options)\n", - "driver.set_window_size(1280, 1024)\n", - "wait = WebDriverWait(driver, 20)\n", - "\n", - "# ✅ 사이트 접속\n", - "driver.get(\"https://zighang.com/it\")\n", - "time.sleep(2)\n", - "\n", - "# ✅ 직무 설정\n", - "job_name = \"서버·백엔드\"\n", - "\n", - "# ✅ 직무 필터 열기\n", - "arrow_xpath = '//*[@id=\"root\"]/main/div[3]/div/div/div/div/div[2]/div/section/button[2]/div/img'\n", - "wait.until(EC.element_to_be_clickable((By.XPATH, arrow_xpath))).click()\n", - "print(\"✅ 직무 필터 열기 성공\")\n", - "time.sleep(1)\n", - "\n", - "# ✅ 직무 클릭\n", - "job_button_xpath = f'//button[normalize-space()=\"{job_name}\"]'\n", - "wait.until(EC.element_to_be_clickable((By.XPATH, job_button_xpath))).click()\n", - "print(f\"✅ 직무 '{job_name}' 선택 완료\")\n", - "time.sleep(1)\n", - "\n", - "# ✅ 공고 보기 클릭\n", - "confirm_button = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.sticky.bottom-0 button.bg-primary')))\n", - "driver.execute_script(\"arguments[0].scrollIntoView(true);\", confirm_button)\n", - "driver.execute_script(\"arguments[0].click();\", confirm_button)\n", - "print(\"✅ 공고 보기 버튼 클릭 완료\")\n", - "wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'p.ds-web-title2')))\n", - "print(\"✅ 공고 리스트 로딩 완료\")\n", - "\n", - "# ✅ 공고 순회\n", - "MAX_CLICKS = 10\n", - "original_tab = driver.current_window_handle\n", - "results = []\n", - "\n", - "for i in range(2, MAX_CLICKS + 1):\n", - " try:\n", - " title_xpath = f'(//p[contains(@class, \"ds-web-title2\")])[{i}]'\n", - " title_elem = wait.until(EC.presence_of_element_located((By.XPATH, title_xpath)))\n", - " driver.execute_script(\"arguments[0].scrollIntoView(true);\", title_elem)\n", - " driver.execute_script(\"window.scrollBy(0, -200);\")\n", - " time.sleep(0.3)\n", - " parent_link = title_elem.find_element(By.XPATH, \"./ancestor::a[1]\")\n", - " driver.execute_script(\"arguments[0].click();\", parent_link)\n", - " print(f\"▶️ [{i}]번째 공고 클릭 → 새 탭 열림 예상\")\n", - " time.sleep(2)\n", - "\n", - " # 새 탭 전환\n", - " new_tab = [tab for tab in driver.window_handles if tab != original_tab][0]\n", - " driver.switch_to.window(new_tab)\n", - "\n", - " # ✅ 공고 정보 크롤링\n", - " data = {}\n", - " data[\"회사명\"] = driver.find_element(By.XPATH, '//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[1]/div[1]/div/a').text\n", - " data[\"경력\"] = driver.find_element(By.XPATH, '//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[1]/div/div').text\n", - " data[\"학력\"] = driver.find_element(By.XPATH, '//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[3]/div/div').text\n", - " data[\"근무지\"] = driver.find_element(By.XPATH, '//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[2]/div/div').text\n", - " data[\"직군\"] = job_name\n", - "\n", - " try:\n", - " data[\"우대사항\"] = driver.find_element(By.XPATH, '//h2[text()=\"우대사항\"]/following-sibling::p').text\n", - " print(f\"✅ 우대사항 크롤링 완료: {data['우대사항'][:10]}...\")\n", - " except:\n", - " data[\"우대사항\"] = \"\"\n", - "\n", - " try:\n", - " data[\"자격요건\"] = driver.find_element(By.XPATH, '//h2[text()=\"자격요건\"]/following-sibling::p').text\n", - " print(f\"✅ 자격요건 크롤링 완료: {data['자격요건'][:10]}...\")\n", - " except:\n", - " data[\"자격요건\"] = \"\"\n", - "\n", - " if data[\"우대사항\"] == \"\" and data[\"자격요건\"] == \"\":\n", - " try:\n", - " img_elem = driver.find_element(By.XPATH, '//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[4]/img')\n", - " data[\"이미지경로\"] = img_elem.get_attribute(\"src\")\n", - " print(\"🖼️ 이미지 URL 저장 완료\")\n", - " except:\n", - " data[\"이미지경로\"] = \"\"\n", - " print(\"❌ 이미지 URL 저장 실패\")\n", - " else:\n", - " data[\"이미지경로\"] = \"\"\n", - "\n", - " results.append(data)\n", - " driver.close()\n", - " driver.switch_to.window(original_tab)\n", - " print(f\"🔙 기존 탭 복귀 완료\\n\")\n", - "\n", - " except Exception as e:\n", - " print(f\"❌ [{i}]번째 공고 실패: {e}\")\n", - " continue\n", - "\n", - "# ✅ 엑셀 저장\n", - "df = pd.DataFrame(results)\n", - "df.to_excel(\"직행_크롤링_결과.xlsx\", index=False)\n", - "print(\"✅ 엑셀 저장 완료\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "fa236770", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
회사명경력학력근무지직군우대사항자격요건이미지경로
0쿠팡신입학사서울서버·백엔드https://d2juy7qzamcf56.cloudfront.net/2025-06-...
1팀리부뜨3~8년차학력 무관기타서버·백엔드
2팀리부뜨2~8년차학력 무관서울서버·백엔드
3네이버클라우드경력 무관학사경기서버·백엔드https://d2juy7qzamcf56.cloudfront.net/2025-06-...
4클로봇10년차 이상학력 무관서울서버·백엔드https://d2juy7qzamcf56.cloudfront.net/2025-06-...
5코웨이7년차 이상학력 무관서울서버·백엔드https://d2juy7qzamcf56.cloudfront.net/2025-06-...
6NHN5년차 이상학력 무관경기서버·백엔드https://d2juy7qzamcf56.cloudfront.net/2025-06-...
7네이버클라우드3년차, 10년차학력 무관경기서버·백엔드https://d2juy7qzamcf56.cloudfront.net/2025-06-...
8액티부키3~10년차학력 무관전북서버·백엔드• 지도 관련 개발 경험자\\n• 결제 관련 개발 경험자\\n• B2C 플랫폼 개발 경...• 개발 3년 이상 경력의 중급개발자\\n• IntelliJ 가능\\n• Spring ...
\n", - "
" - ], - "text/plain": [ - " 회사명 경력 학력 근무지 직군 \\\n", - "0 쿠팡 신입 학사 서울 서버·백엔드 \n", - "1 팀리부뜨 3~8년차 학력 무관 기타 서버·백엔드 \n", - "2 팀리부뜨 2~8년차 학력 무관 서울 서버·백엔드 \n", - "3 네이버클라우드 경력 무관 학사 경기 서버·백엔드 \n", - "4 클로봇 10년차 이상 학력 무관 서울 서버·백엔드 \n", - "5 코웨이 7년차 이상 학력 무관 서울 서버·백엔드 \n", - "6 NHN 5년차 이상 학력 무관 경기 서버·백엔드 \n", - "7 네이버클라우드 3년차, 10년차 학력 무관 경기 서버·백엔드 \n", - "8 액티부키 3~10년차 학력 무관 전북 서버·백엔드 \n", - "\n", - " 우대사항 \\\n", - "0 \n", - "1 \n", - "2 \n", - "3 \n", - "4 \n", - "5 \n", - "6 \n", - "7 \n", - "8 • 지도 관련 개발 경험자\\n• 결제 관련 개발 경험자\\n• B2C 플랫폼 개발 경... \n", - "\n", - " 자격요건 \\\n", - "0 \n", - "1 \n", - "2 \n", - "3 \n", - "4 \n", - "5 \n", - "6 \n", - "7 \n", - "8 • 개발 3년 이상 경력의 중급개발자\\n• IntelliJ 가능\\n• Spring ... \n", - "\n", - " 이미지경로 \n", - "0 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n", - "1 \n", - "2 \n", - "3 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n", - "4 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n", - "5 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n", - "6 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n", - "7 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n", - "8 " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "python313", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/backend/crawling/crawling_demo_linkareer.ipynb b/backend/crawling/crawling_demo_linkareer.ipynb deleted file mode 100644 index d1d860dd1..000000000 --- a/backend/crawling/crawling_demo_linkareer.ipynb +++ /dev/null @@ -1,1723 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 6, - "id": "df3e2c0f", - "metadata": {}, - "outputs": [], - "source": [ - "from selenium import webdriver\n", - "from selenium.webdriver.common.by import By\n", - "from selenium.webdriver.chrome.options import Options\n", - "from selenium.webdriver.support.ui import WebDriverWait\n", - "from selenium.webdriver.support import expected_conditions as EC\n", - "import pandas as pd\n", - "import time\n", - "import traceback\n", - "import re\n" - ] - }, - { - "cell_type": "markdown", - "id": "8955cb0b", - "metadata": {}, - "source": [ - "## 크롤링 확인" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "01a2f8d2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "✅ 플랜핏 크롤링 완료\n", - "✅ 리얼드로우 크롤링 완료\n", - "✅ 주식회사 화이트큐브 크롤링 완료\n", - "✅ 주식회사 화이트큐브 크롤링 완료\n", - "✅ 놀유니버스 크롤링 완료\n", - "✅ 진에어 크롤링 완료\n", - "✅ 이앤에스글로벌 크롤링 완료\n", - "✅ CJ푸드빌 크롤링 완료\n", - "✅ CJ푸드빌 크롤링 완료\n", - "✅ 삼성전자 크롤링 완료\n", - "✅ 코레일네트웍스 크롤링 완료\n", - "✅ 주식회사 놀유니버스 크롤링 완료\n", - "✅ 한미그룹 크롤링 완료\n", - "✅ 국가정보원 크롤링 완료\n", - "✅ NHN Cloud 크롤링 완료\n", - "✅ NHN Cloud 크롤링 완료\n", - "✅ NHN Cloud 크롤링 완료\n", - "✅ EY한영 크롤링 완료\n", - "✅ Toss 크롤링 완료\n", - "✅ SNOW 크롤링 완료\n", - "{'회사명': '플랜핏', '기업형태': '중소기업', '모집직무': 'IT/인터넷', '자격요건': '- IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용자와 대화에 두려움이 없으며 사용자 관점에서 생각하며 사용자에게 관심이 많은 분\\n- 데이터를 통해 문제를 파악하고 데이터를 측정하여 해당 데이터에 기반한 논리적인 의사 결정을 내릴 수 있는 분\\n- 다양한 분야의 이해관계자(팀원 및 외부인)와 효율적인 커뮤니케이션이 가능한 분'}\n", - "{'회사명': '리얼드로우', '기업형태': '중소기업', '모집직무': '서울 마포구', '자격요건': '서류전형 - 면접전형 - 최종합격'}\n", - "{'회사명': '주식회사 화이트큐브', '기업형태': '스타트업', '모집직무': '서울 강남구', '자격요건': 'ex) 상품 소개서 개선을 통한 B2B 계약 전환율 상승, 광고 소재 효율 테스트 등'}\n", - "{'회사명': '주식회사 화이트큐브', '기업형태': '스타트업', '모집직무': '서울 강남구', '자격요건': '• 진짜 ‘성공’을 만들고자 하는 열망이 강한 분.\\n• 이 업무를 왜 해야 하는지를 항상 고민하며, 해당 이유를 근거로 팀원들을 설득할 수 있는 분\\n• 컴퓨터공학 전공 혹은 이에 준하는 지식 및 활용 역량이 있으신 분'}\n", - "{'회사명': '놀유니버스', '기업형태': '중견기업', '모집직무': '경기 성남시 수정구', '자격요건': '기본적인 오피스 툴(특히 Excel 또는 Google 스프레드시트) 사용이 가능한 분\\n팀과의 커뮤니케이션을 중요하게 생각하며, 협업을 긍정적으로 대하는 분'}\n", - "{'회사명': '진에어', '기업형태': '대기업', '모집직무': '서울 강서구', '자격요건': ''}\n", - "{'회사명': '이앤에스글로벌', '기업형태': '중견기업', '모집직무': '서울 강남구', '자격요건': ''}\n", - "{'회사명': 'CJ푸드빌', '기업형태': '대기업', '모집직무': '서울 중구', '자격요건': \"- 다양한 Data 분석 Tool 활용 경험 (Python, SQL 등)\\n- ‘Data’ 기반으로 객관적인 현상 인식과 '분석적 사고'를 통해 솔루션을 도출하는 역량\\n- 현장 업무에 대한 이해를 위한 현업과의 협업 역량\\n- Data 분석을 위한 Data Engineer 등 관련 전문가들과의 협업 역량\"}\n", - "{'회사명': 'CJ푸드빌', '기업형태': '대기업', '모집직무': '서울 중구', '자격요건': '- App 설계부터 배포, 서비스 운영까지의 경험이 있으신 분\\n- 자기 주도적인 개발과 전체 프로세스를 고려한 설계와 구현이 가능 하신 분'}\n", - "{'회사명': '삼성전자', '기업형태': '대기업', '모집직무': '경기 수원시 영통구', '자격요건': '[VD사업부] VX 전략\\n[VD사업부] 3D Graphics Core 기술개발\\n[VD사업부] 그래픽엔진 응용 어플리케이션 개발\\n[DA사업부] 제품 기획\\n[DA사업부] Retail PM\\n[DA사업부] B2C/B2B 영업\\n[DA사업부] 모터 개발\\n[DA사업부] 센서/인버터 회로 개발\\n[DA사업부] AI/보안 Solution 개발\\n[DA사업부] 거점 최적화\\n[DA사업부] AI/Data Scientist'}\n", - "{'회사명': '코레일네트웍스', '기업형태': '공공기관/공기업', '모집직무': '서울 용산구, 서울 구로구, 인천 연수구, 경기 과천시, 부산 동래구', '자격요건': '기간제(육휴대체)_영업직_역무직'}\n", - "{'회사명': '주식회사 놀유니버스', '기업형태': '중견기업', '모집직무': '경기 성남시 수정구', '자격요건': '[채용담당자의 메시지]\\n- NOL의 서비스 품질을 책임지는 QA 조직에서는 단순한 테스트가 아닌, 문제를 한발 앞서 감지하고 개선해나가는 태도를 중요하게 여겨요.\\n- 이번 포지션은 테스트 자동화, 정적 분석, 문제 해결까지 전체 사이클에 깊이 관여할 수 있는 자리예요.\\n- 품질 개선을 위한 제안을 아끼지 않고, 데이터를 근거로 서비스 완성도를 높이고 싶은 분이라면, 저희 팀과 큰 시너지를 낼 수 있을 거예요.'}\n", - "{'회사명': '한미그룹', '기업형태': '대기업', '모집직무': '서울 송파구', '자격요건': '[한미사이언스] 웹 솔루션 개발/운영\\n[한미사이언스] 식품 OEM'}\n", - "{'회사명': '국가정보원', '기업형태': '공공기관/공기업', '모집직무': '서울 강남구', '자격요건': '어학_영어\\n어학_중국어\\n어학_일본어\\n어학_프랑스어\\n어학_러시아어\\n어학_스페인어\\n어학_아랍어'}\n", - "{'회사명': 'NHN Cloud', '기업형태': '중견기업', '모집직무': '경기 성남시 분당구', '자격요건': ''}\n", - "{'회사명': 'NHN Cloud', '기업형태': '중견기업', '모집직무': '경기 성남시 분당구', '자격요건': ''}\n", - "{'회사명': 'NHN Cloud', '기업형태': '중견기업', '모집직무': '경기 성남시 분당구', '자격요건': ''}\n", - "{'회사명': 'EY한영', '기업형태': '외국계기업', '모집직무': '서울 영등포구', '자격요건': ''}\n", - "{'회사명': 'Toss', '기업형태': '중소기업', '모집직무': 'IT/인터넷, 마케팅/광고/홍보, 영업/고객상담, 서비스', '자격요건': ''}\n", - "{'회사명': 'SNOW', '기업형태': '대기업', '모집직무': '경기 성남시 분당구', '자격요건': 'VITA 콘텐츠 기획/운영 체험형 인턴\\nCS 기획/운영 체험형 인턴\\nSODA/Foodie 콘텐츠 기획/운영 체험형 인턴'}\n" - ] - } - ], - "source": [ - "chrome_options = Options()\n", - "chrome_options.add_experimental_option(\"detach\", True)\n", - "driver = webdriver.Chrome(options=chrome_options)\n", - "wait = WebDriverWait(driver, 10)\n", - "\n", - "# ✅ 리스트 페이지 접속\n", - "list_url = \"https://linkareer.com/list/recruit?filterBy_activityTypeID=5&filterBy_categoryIDs=58&filterBy_status=OPEN&orderBy_direction=DESC&orderBy_field=RECENT&page=1\"\n", - "driver.get(list_url)\n", - "time.sleep(2) # 페이지 로딩 대기\n", - "\n", - "results = []\n", - "\n", - "# ✅ 리스트 안의 공고 개수\n", - "row_count = len(driver.find_elements(By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/section/div[2]/table/tbody/tr'))\n", - "\n", - "for i in range(1, row_count + 1):\n", - " try:\n", - " # 공고 클릭\n", - " link_element = driver.find_element(By.XPATH, f'//*[@id=\"__next\"]/div[1]/div/main/div/section/div[2]/table/tbody/tr[{i}]/td[2]/div/a/div/p')\n", - " link_element.click()\n", - "\n", - " # 새 창 핸들 얻기\n", - " driver.switch_to.window(driver.window_handles[-1])\n", - "\n", - " # ✅ 새 창에서 데이터 크롤링\n", - " company_name_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/div/section[1]/div/article/header/h2')))\n", - " company_name = company_name_element.text.strip()\n", - "\n", - " company_type_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[1]/dd')))\n", - " company_type = company_type_element.text.strip()\n", - "\n", - " position_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[5]/dd')))\n", - " position = position_element.text.strip()\n", - "\n", - " qualification_texts = []\n", - " idx = 13\n", - " while True:\n", - " try:\n", - " para = driver.find_element(By.XPATH, f'//*[@id=\"DETAIL\"]/section/div/p[{idx}]')\n", - " text = para.text.strip()\n", - " if text == '' or '다음' in text:\n", - " break\n", - " qualification_texts.append(text)\n", - " idx += 1\n", - " except:\n", - " break\n", - "\n", - " qualification = \"\\n\".join(qualification_texts)\n", - "\n", - " # ✅ 데이터 저장\n", - " results.append({\n", - " '회사명': company_name,\n", - " '기업형태': company_type,\n", - " '모집직무': position,\n", - " '자격요건': qualification\n", - " })\n", - "\n", - " print(f\"✅ {company_name} 크롤링 완료\")\n", - "\n", - " # 새 창 닫기\n", - " driver.close()\n", - "\n", - " # 원래 창으로 돌아가기\n", - " driver.switch_to.window(driver.window_handles[0])\n", - "\n", - " time.sleep(1) # 다음 클릭 전에 살짝 대기\n", - "\n", - " except Exception as e:\n", - " print(f\"❌ {i}번째 공고 크롤링 중 오류: {e}\")\n", - " # 새 창이 열렸다면 닫고 돌아오기\n", - " if len(driver.window_handles) > 1:\n", - " driver.close()\n", - " driver.switch_to.window(driver.window_handles[0])\n", - " continue\n", - "\n", - "driver.quit()\n", - "\n", - "# ✅ 결과 출력\n", - "for r in results:\n", - " print(r)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "2a766d1c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'회사명': '플랜핏',\n", - " '기업형태': '중소기업',\n", - " '모집직무': 'IT/인터넷',\n", - " '자격요건': '- IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용자와 대화에 두려움이 없으며 사용자 관점에서 생각하며 사용자에게 관심이 많은 분\\n- 데이터를 통해 문제를 파악하고 데이터를 측정하여 해당 데이터에 기반한 논리적인 의사 결정을 내릴 수 있는 분\\n- 다양한 분야의 이해관계자(팀원 및 외부인)와 효율적인 커뮤니케이션이 가능한 분'},\n", - " {'회사명': '리얼드로우',\n", - " '기업형태': '중소기업',\n", - " '모집직무': '서울 마포구',\n", - " '자격요건': '서류전형 - 면접전형 - 최종합격'},\n", - " {'회사명': '주식회사 화이트큐브',\n", - " '기업형태': '스타트업',\n", - " '모집직무': '서울 강남구',\n", - " '자격요건': 'ex) 상품 소개서 개선을 통한 B2B 계약 전환율 상승, 광고 소재 효율 테스트 등'},\n", - " {'회사명': '주식회사 화이트큐브',\n", - " '기업형태': '스타트업',\n", - " '모집직무': '서울 강남구',\n", - " '자격요건': '• 진짜 ‘성공’을 만들고자 하는 열망이 강한 분.\\n• 이 업무를 왜 해야 하는지를 항상 고민하며, 해당 이유를 근거로 팀원들을 설득할 수 있는 분\\n• 컴퓨터공학 전공 혹은 이에 준하는 지식 및 활용 역량이 있으신 분'},\n", - " {'회사명': '놀유니버스',\n", - " '기업형태': '중견기업',\n", - " '모집직무': '경기 성남시 수정구',\n", - " '자격요건': '기본적인 오피스 툴(특히 Excel 또는 Google 스프레드시트) 사용이 가능한 분\\n팀과의 커뮤니케이션을 중요하게 생각하며, 협업을 긍정적으로 대하는 분'},\n", - " {'회사명': '진에어', '기업형태': '대기업', '모집직무': '서울 강서구', '자격요건': ''},\n", - " {'회사명': '이앤에스글로벌', '기업형태': '중견기업', '모집직무': '서울 강남구', '자격요건': ''},\n", - " {'회사명': 'CJ푸드빌',\n", - " '기업형태': '대기업',\n", - " '모집직무': '서울 중구',\n", - " '자격요건': \"- 다양한 Data 분석 Tool 활용 경험 (Python, SQL 등)\\n- ‘Data’ 기반으로 객관적인 현상 인식과 '분석적 사고'를 통해 솔루션을 도출하는 역량\\n- 현장 업무에 대한 이해를 위한 현업과의 협업 역량\\n- Data 분석을 위한 Data Engineer 등 관련 전문가들과의 협업 역량\"},\n", - " {'회사명': 'CJ푸드빌',\n", - " '기업형태': '대기업',\n", - " '모집직무': '서울 중구',\n", - " '자격요건': '- App 설계부터 배포, 서비스 운영까지의 경험이 있으신 분\\n- 자기 주도적인 개발과 전체 프로세스를 고려한 설계와 구현이 가능 하신 분'},\n", - " {'회사명': '삼성전자',\n", - " '기업형태': '대기업',\n", - " '모집직무': '경기 수원시 영통구',\n", - " '자격요건': '[VD사업부] VX 전략\\n[VD사업부] 3D Graphics Core 기술개발\\n[VD사업부] 그래픽엔진 응용 어플리케이션 개발\\n[DA사업부] 제품 기획\\n[DA사업부] Retail PM\\n[DA사업부] B2C/B2B 영업\\n[DA사업부] 모터 개발\\n[DA사업부] 센서/인버터 회로 개발\\n[DA사업부] AI/보안 Solution 개발\\n[DA사업부] 거점 최적화\\n[DA사업부] AI/Data Scientist'},\n", - " {'회사명': '코레일네트웍스',\n", - " '기업형태': '공공기관/공기업',\n", - " '모집직무': '서울 용산구, 서울 구로구, 인천 연수구, 경기 과천시, 부산 동래구',\n", - " '자격요건': '기간제(육휴대체)_영업직_역무직'},\n", - " {'회사명': '주식회사 놀유니버스',\n", - " '기업형태': '중견기업',\n", - " '모집직무': '경기 성남시 수정구',\n", - " '자격요건': '[채용담당자의 메시지]\\n- NOL의 서비스 품질을 책임지는 QA 조직에서는 단순한 테스트가 아닌, 문제를 한발 앞서 감지하고 개선해나가는 태도를 중요하게 여겨요.\\n- 이번 포지션은 테스트 자동화, 정적 분석, 문제 해결까지 전체 사이클에 깊이 관여할 수 있는 자리예요.\\n- 품질 개선을 위한 제안을 아끼지 않고, 데이터를 근거로 서비스 완성도를 높이고 싶은 분이라면, 저희 팀과 큰 시너지를 낼 수 있을 거예요.'},\n", - " {'회사명': '한미그룹',\n", - " '기업형태': '대기업',\n", - " '모집직무': '서울 송파구',\n", - " '자격요건': '[한미사이언스] 웹 솔루션 개발/운영\\n[한미사이언스] 식품 OEM'},\n", - " {'회사명': '국가정보원',\n", - " '기업형태': '공공기관/공기업',\n", - " '모집직무': '서울 강남구',\n", - " '자격요건': '어학_영어\\n어학_중국어\\n어학_일본어\\n어학_프랑스어\\n어학_러시아어\\n어학_스페인어\\n어학_아랍어'},\n", - " {'회사명': 'NHN Cloud', '기업형태': '중견기업', '모집직무': '경기 성남시 분당구', '자격요건': ''},\n", - " {'회사명': 'NHN Cloud', '기업형태': '중견기업', '모집직무': '경기 성남시 분당구', '자격요건': ''},\n", - " {'회사명': 'NHN Cloud', '기업형태': '중견기업', '모집직무': '경기 성남시 분당구', '자격요건': ''},\n", - " {'회사명': 'EY한영', '기업형태': '외국계기업', '모집직무': '서울 영등포구', '자격요건': ''},\n", - " {'회사명': 'Toss',\n", - " '기업형태': '중소기업',\n", - " '모집직무': 'IT/인터넷, 마케팅/광고/홍보, 영업/고객상담, 서비스',\n", - " '자격요건': ''},\n", - " {'회사명': 'SNOW',\n", - " '기업형태': '대기업',\n", - " '모집직무': '경기 성남시 분당구',\n", - " '자격요건': 'VITA 콘텐츠 기획/운영 체험형 인턴\\nCS 기획/운영 체험형 인턴\\nSODA/Foodie 콘텐츠 기획/운영 체험형 인턴'}]" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "d04800ba", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "현재 윈도우: 05258E12E69BD2B82AB180147D3F9CCC\n", - "기존 핸들 목록: ['05258E12E69BD2B82AB180147D3F9CCC', '763D6D694D25223D776C5FEF888F5E72']\n", - "클릭 후 윈도우: 05258E12E69BD2B82AB180147D3F9CCC\n", - "클릭 후 핸들 목록: ['05258E12E69BD2B82AB180147D3F9CCC', '763D6D694D25223D776C5FEF888F5E72', '046D32987200EF54434527999D735ECF']\n" - ] - } - ], - "source": [ - "# 테스트: 새 탭이 열리는지 확인\n", - "\n", - "driver.get(\"https://linkareer.com/list/recruit?filterBy_activityTypeID=5&filterBy_categoryIDs=58&filterBy_status=OPEN&orderBy_direction=DESC&orderBy_field=RECENT&page=1\")\n", - "time.sleep(3)\n", - "\n", - "selector = '//table/tbody/tr[1]/td[2]//p'\n", - "element = wait.until(EC.element_to_be_clickable((By.XPATH, selector)))\n", - "\n", - "print(\"현재 윈도우:\", driver.current_window_handle)\n", - "print(\"기존 핸들 목록:\", driver.window_handles)\n", - "\n", - "driver.execute_script(\"arguments[0].click();\", element)\n", - "time.sleep(2)\n", - "\n", - "print(\"클릭 후 윈도우:\", driver.current_window_handle)\n", - "print(\"클릭 후 핸들 목록:\", driver.window_handles)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "744c4b87", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "공고 element 찾음: [플랜핏] PO(신입/경력) 모집\n" - ] - } - ], - "source": [ - "from selenium import webdriver\n", - "from selenium.webdriver.common.by import By\n", - "from selenium.webdriver.chrome.options import Options\n", - "from selenium.webdriver.support.ui import WebDriverWait\n", - "from selenium.webdriver.support import expected_conditions as EC\n", - "import time\n", - "\n", - "chrome_options = Options()\n", - "chrome_options.add_experimental_option(\"detach\", True)\n", - "\n", - "driver = webdriver.Chrome(options=chrome_options)\n", - "wait = WebDriverWait(driver, 10)\n", - "\n", - "driver.get(\"https://linkareer.com/list/recruit?filterBy_activityTypeID=5&filterBy_categoryIDs=58&filterBy_status=OPEN&orderBy_direction=DESC&orderBy_field=RECENT&page=1\")\n", - "time.sleep(3)\n", - "\n", - "try:\n", - " selector = '//table/tbody/tr[1]/td[2]//p'\n", - " element = wait.until(EC.presence_of_element_located((By.XPATH, selector)))\n", - " print(\"공고 element 찾음:\", element.text.strip())\n", - "except Exception as e:\n", - " print(\"에러 발생:\", e)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "edcabaca", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "회사명: 플랜핏\n", - "기업형태: 중소기업\n", - "모집직무: IT/인터넷\n", - "자격요건: - IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\n", - "- 사용자와 대화에 두려움이 없으며 사용자 관점에서 생각하며 사용자에게 관심이 많은 분\n", - "- 데이터를 통해 문제를 파악하고 데이터를 측정하여 해당 데이터에 기반한 논리적인 의사 결정을 내릴 수 있는 분\n", - "- 다양한 분야의 이해관계자(팀원 및 외부인)와 효율적인 커뮤니케이션이 가능한 분\n" - ] - } - ], - "source": [ - "chrome_options = Options()\n", - "chrome_options.add_experimental_option(\"detach\", True)\n", - "driver = webdriver.Chrome(options=chrome_options)\n", - "wait = WebDriverWait(driver, 10)\n", - "\n", - "driver.get(\"https://linkareer.com/activity/239941\")\n", - "\n", - "# ✅ 회사명\n", - "company_name_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/div/section[1]/div/article/header/h2')))\n", - "company_name = company_name_element.text.strip()\n", - "\n", - "# ✅ 기업형태\n", - "company_type_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[1]/dd')))\n", - "company_type = company_type_element.text.strip()\n", - "\n", - "# ✅ 모집직무\n", - "position_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[5]/dd')))\n", - "position = position_element.text.strip()\n", - "\n", - "# ✅ 자격요건 제목 찾기\n", - "qualification_title_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"DETAIL\"]/section/div/p[12]')))\n", - "# 자격요건 텍스트는 p[13]부터 시작 (구조에 맞게 조정)\n", - "qualification_texts = []\n", - "idx = 13\n", - "while True:\n", - " try:\n", - " para = driver.find_element(By.XPATH, f'//*[@id=\"DETAIL\"]/section/div/p[{idx}]')\n", - " text = para.text.strip()\n", - " if text == '' or '다음' in text: # 종료 조건 (필요시 수정)\n", - " break\n", - " qualification_texts.append(text)\n", - " idx += 1\n", - " except:\n", - " break # 더 이상 요소 없으면 종료\n", - "\n", - "qualification = \"\\n\".join(qualification_texts)\n", - "\n", - "# ✅ 출력\n", - "print(\"회사명:\", company_name)\n", - "print(\"기업형태:\", company_type)\n", - "print(\"모집직무:\", position)\n", - "print(\"자격요건:\", qualification)\n", - "\n", - "driver.quit()\n" - ] - }, - { - "cell_type": "markdown", - "id": "beb67508", - "metadata": {}, - "source": [ - "## 자격요건 위치 다름 문제를 해결" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "f9d07eac", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "✅ 플랜핏 완료\n", - "✅ 리얼드로우 완료\n", - "✅ 주식회사 화이트큐브 완료\n", - "✅ 주식회사 화이트큐브 완료\n", - "✅ 놀유니버스 완료\n", - "✅ 진에어 완료\n", - "✅ 이앤에스글로벌 완료\n", - "✅ CJ푸드빌 완료\n", - "✅ CJ푸드빌 완료\n", - "✅ 삼성전자 완료\n", - "✅ 코레일네트웍스 완료\n", - "✅ 주식회사 놀유니버스 완료\n", - "✅ 한미그룹 완료\n", - "✅ 국가정보원 완료\n", - "✅ NHN Cloud 완료\n", - "✅ NHN Cloud 완료\n", - "✅ NHN Cloud 완료\n", - "✅ EY한영 완료\n", - "✅ Toss 완료\n", - "✅ SNOW 완료\n", - "{'회사명': '플랜핏', '기업형태': '중소기업', '모집직무': 'IT/인터넷', '세부직무': '', '자격요건': '- IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용자와 대화에 두려움이 없으며 사용자 관점에서 생각하며 사용자에게 관심이 많은 분\\n- 데이터를 통해 문제를 파악하고 데이터를 측정하여 해당 데이터에 기반한 논리적인 의사 결정을 내릴 수 있는 분\\n- 다양한 분야의 이해관계자(팀원 및 외부인)와 효율적인 커뮤니케이션이 가능한 분\\n\\n\\n[인재 영입 프로세스]\\n- 서류 전형 -> 1차 직무 인터뷰 -> 2차 컬쳐핏 인터뷰 -> 최종 합격\\n\\n'}\n", - "{'회사명': '리얼드로우', '기업형태': '중소기업', '모집직무': '서울 마포구', '세부직무': 'SW Engineer', '자격요건': '- 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n*이메일 접수: people@realdraw.ai\\n(이력서, 포트폴리오)'}\n", - "{'회사명': '주식회사 화이트큐브', '기업형태': '스타트업', '모집직무': '서울 강남구', '세부직무': '콘텐츠 디자이너 인턴', '자격요건': '그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자인이 가능하신 분\\n비즈니스 성장을 위한 다양한 프로젝트 기획 및 디자인 가능하신 분\\n디자인 결과물의 성과 데이터를 함께 확인하고 개선하여 ’비즈니스 성과’를 달성하고 싶은 분\\nex) 상품 소개서 개선을 통한 B2B 계약 전환율 상승, 광고 소재 효율 테스트 등\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격'}\n", - "{'회사명': '주식회사 화이트큐브', '기업형태': '스타트업', '모집직무': '서울 강남구', '세부직무': '백엔드 개발자 인턴', '자격요건': '• Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n• HTTP, HTML, JSON 등 웹 기본 구조에 대한 이해가 있으신 분\\n• 사용자 경험과 고객 가치를 최우선으로 하여 개발을 통해 비즈니스 성장에 기여하고 싶은 열망이 있는 분\\n• 진짜 ‘성공’을 만들고자 하는 열망이 강한 분.\\n• 이 업무를 왜 해야 하는지를 항상 고민하며, 해당 이유를 근거로 팀원들을 설득할 수 있는 분\\n• 컴퓨터공학 전공 혹은 이에 준하는 지식 및 활용 역량이 있으신 분\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격'}\n", - "{'회사명': '놀유니버스', '기업형태': '중견기업', '모집직무': '경기 성남시 수정구', '세부직무': '브랜드 마케팅 지원 담당자', '자격요건': '브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트렌드에 민감하고, 다양한 브랜드 활동을 관찰하는 걸 좋아하는 분\\n꼼꼼하게 문서와 숫자를 다루며, 정확하게 검토하는 업무에 자신 있는 분\\n기본적인 오피스 툴(특히 Excel 또는 Google 스프레드시트) 사용이 가능한 분\\n팀과의 커뮤니케이션을 중요하게 생각하며, 협업을 긍정적으로 대하는 분\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격'}\n", - "{'회사명': '진에어', '기업형태': '대기업', '모집직무': '서울 강서구', '세부직무': '', '자격요건': ''}\n", - "{'회사명': '이앤에스글로벌', '기업형태': '중견기업', '모집직무': '서울 강남구', '세부직무': '', '자격요건': ''}\n", - "{'회사명': 'CJ푸드빌', '기업형태': '대기업', '모집직무': '서울 중구', '세부직무': '데이터 전략·분석 전문가', '자격요건': \"- 4년제 학사 졸 이상\\n- 관련 학과 : 컴퓨터공학, 산업공학, 경영정보, 문헌정보 등\\n- Data 분석 역량 및 관련 프로젝트 경력 3년 이상\\n- 다양한 Data 분석 Tool 활용 경험 (Python, SQL 등)\\n- ‘Data’ 기반으로 객관적인 현상 인식과 '분석적 사고'를 통해 솔루션을 도출하는 역량\\n- 현장 업무에 대한 이해를 위한 현업과의 협업 역량\\n- Data 분석을 위한 Data Engineer 등 관련 전문가들과의 협업 역량\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n\\n\"}\n", - "{'회사명': 'CJ푸드빌', '기업형태': '대기업', '모집직무': '서울 중구', '세부직무': '디지털서비스 APP 개발자', '자격요건': '- 4년제 대학 졸업자 이상\\n- 컴퓨터공학, 산업공학, 소프트웨어공학 등 관련학과\\n- React Native 및 Flutter 개발 경험 (최소 5년 이상) 💻\\n- App 설계부터 배포, 서비스 운영까지의 경험이 있으신 분\\n- 자기 주도적인 개발과 전체 프로세스를 고려한 설계와 구현이 가능 하신 분\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n\\n\\n'}\n", - "{'회사명': '삼성전자', '기업형태': '대기업', '모집직무': '경기 수원시 영통구', '세부직무': '[VD사업부] Product Partnership', '자격요건': ''}\n", - "{'회사명': '코레일네트웍스', '기업형태': '공공기관/공기업', '모집직무': '서울 용산구, 서울 구로구, 인천 연수구, 경기 과천시, 부산 동래구', '세부직무': '일반직6급', '자격요건': '하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 인적성검사 - 필기전형 - 면접전형 - 최종합격\\n\\n\\n'}\n", - "{'회사명': '주식회사 놀유니버스', '기업형태': '중견기업', '모집직무': '경기 성남시 수정구', '세부직무': '', '자격요건': ''}\n", - "{'회사명': '한미그룹', '기업형태': '대기업', '모집직무': '서울 송파구', '세부직무': '[한미약품] Medical', '자격요건': ''}\n", - "{'회사명': '국가정보원', '기업형태': '공공기관/공기업', '모집직무': '서울 강남구', '세부직무': '해외정보', '자격요건': '하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n\\n\\n'}\n", - "{'회사명': 'NHN Cloud', '기업형태': '중견기업', '모집직무': '경기 성남시 분당구', '세부직무': '', '자격요건': ''}\n", - "{'회사명': 'NHN Cloud', '기업형태': '중견기업', '모집직무': '경기 성남시 분당구', '세부직무': '', '자격요건': ''}\n", - "{'회사명': 'NHN Cloud', '기업형태': '중견기업', '모집직무': '경기 성남시 분당구', '세부직무': '', '자격요건': ''}\n", - "{'회사명': 'EY한영', '기업형태': '외국계기업', '모집직무': '서울 영등포구', '세부직무': '', '자격요건': ''}\n", - "{'회사명': 'Toss', '기업형태': '중소기업', '모집직무': 'IT/인터넷, 마케팅/광고/홍보, 영업/고객상담, 서비스', '세부직무': '', '자격요건': ''}\n", - "{'회사명': 'SNOW', '기업형태': '대기업', '모집직무': '경기 성남시 분당구', '세부직무': '남미 타겟 EPIK 콘텐츠 마케팅 체험형 인턴', '자격요건': ''}\n" - ] - } - ], - "source": [ - "chrome_options = Options()\n", - "chrome_options.add_experimental_option(\"detach\", True)\n", - "driver = webdriver.Chrome(options=chrome_options)\n", - "wait = WebDriverWait(driver, 10)\n", - "\n", - "list_url = \"https://linkareer.com/list/recruit?filterBy_activityTypeID=5&filterBy_categoryIDs=58&filterBy_status=OPEN&orderBy_direction=DESC&orderBy_field=RECENT&page=1\"\n", - "driver.get(list_url)\n", - "time.sleep(2)\n", - "\n", - "results = []\n", - "row_count = len(driver.find_elements(By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/section/div[2]/table/tbody/tr'))\n", - "\n", - "for i in range(1, row_count + 1):\n", - " try:\n", - " link_element = driver.find_element(By.XPATH, f'//*[@id=\"__next\"]/div[1]/div/main/div/section/div[2]/table/tbody/tr[{i}]/td[2]/div/a/div/p')\n", - " link_element.click()\n", - "\n", - " driver.switch_to.window(driver.window_handles[-1])\n", - "\n", - " # 기본 정보 크롤링\n", - " company_name = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/div/section[1]/div/article/header/h2'))).text.strip()\n", - " company_type = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[1]/dd'))).text.strip()\n", - "\n", - " # 모든 p 태그 가져오기\n", - " p_elements = driver.find_elements(By.XPATH, '//*[@id=\"DETAIL\"]/section[1]/div/p')\n", - " p_texts = [p.text.strip() for p in p_elements]\n", - "\n", - " # 자격요건 인덱스 찾기\n", - " qual_idx = next((idx for idx, text in enumerate(p_texts) if '자격요건' in text or '자격 요건' in text), None)\n", - "\n", - " # 모집직무 인덱스 찾기\n", - " pos_idx = next((idx for idx, text in enumerate(p_texts) if '모집 직무' in text or '세부 직무' in text), None)\n", - "\n", - " qualification_texts = []\n", - " if qual_idx is not None:\n", - " for t in p_texts[qual_idx + 1:]:\n", - " if any(keyword in t for keyword in ['지원', '혜택', '우대', '다음', '근무']):\n", - " break\n", - " qualification_texts.append(t)\n", - "\n", - " detail_position = ''\n", - " if pos_idx is not None:\n", - " detail_position = p_texts[pos_idx + 1] if pos_idx + 1 < len(p_texts) else ''\n", - "\n", - " qualification = \"\\n\".join(qualification_texts)\n", - "\n", - " position_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[5]/dd')))\n", - " position = position_element.text.strip()\n", - "\n", - " results.append({\n", - " '회사명': company_name,\n", - " '기업형태': company_type,\n", - " '모집직무': position,\n", - " '세부직무': detail_position,\n", - " '자격요건': qualification\n", - " })\n", - "\n", - " print(f\"✅ {company_name} 완료\")\n", - "\n", - " driver.close()\n", - " driver.switch_to.window(driver.window_handles[0])\n", - "\n", - " time.sleep(1)\n", - "\n", - " except Exception as e:\n", - " print(f\"❌ {i}번째 공고 오류: {e}\")\n", - " if len(driver.window_handles) > 1:\n", - " driver.close()\n", - " driver.switch_to.window(driver.window_handles[0])\n", - " continue\n", - "\n", - "driver.quit()\n", - "\n", - "for r in results:\n", - " print(r)" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "8b005232", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'회사명': '플랜핏',\n", - " '기업형태': '중소기업',\n", - " '모집직무': 'IT/인터넷',\n", - " '세부직무': '',\n", - " '자격요건': '- IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용자와 대화에 두려움이 없으며 사용자 관점에서 생각하며 사용자에게 관심이 많은 분\\n- 데이터를 통해 문제를 파악하고 데이터를 측정하여 해당 데이터에 기반한 논리적인 의사 결정을 내릴 수 있는 분\\n- 다양한 분야의 이해관계자(팀원 및 외부인)와 효율적인 커뮤니케이션이 가능한 분\\n\\n\\n[인재 영입 프로세스]\\n- 서류 전형 -> 1차 직무 인터뷰 -> 2차 컬쳐핏 인터뷰 -> 최종 합격\\n\\n'},\n", - " {'회사명': '리얼드로우',\n", - " '기업형태': '중소기업',\n", - " '모집직무': '서울 마포구',\n", - " '세부직무': 'SW Engineer',\n", - " '자격요건': '- 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n*이메일 접수: people@realdraw.ai\\n(이력서, 포트폴리오)'},\n", - " {'회사명': '주식회사 화이트큐브',\n", - " '기업형태': '스타트업',\n", - " '모집직무': '서울 강남구',\n", - " '세부직무': '콘텐츠 디자이너 인턴',\n", - " '자격요건': '그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자인이 가능하신 분\\n비즈니스 성장을 위한 다양한 프로젝트 기획 및 디자인 가능하신 분\\n디자인 결과물의 성과 데이터를 함께 확인하고 개선하여 ’비즈니스 성과’를 달성하고 싶은 분\\nex) 상품 소개서 개선을 통한 B2B 계약 전환율 상승, 광고 소재 효율 테스트 등\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격'},\n", - " {'회사명': '주식회사 화이트큐브',\n", - " '기업형태': '스타트업',\n", - " '모집직무': '서울 강남구',\n", - " '세부직무': '백엔드 개발자 인턴',\n", - " '자격요건': '• Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n• HTTP, HTML, JSON 등 웹 기본 구조에 대한 이해가 있으신 분\\n• 사용자 경험과 고객 가치를 최우선으로 하여 개발을 통해 비즈니스 성장에 기여하고 싶은 열망이 있는 분\\n• 진짜 ‘성공’을 만들고자 하는 열망이 강한 분.\\n• 이 업무를 왜 해야 하는지를 항상 고민하며, 해당 이유를 근거로 팀원들을 설득할 수 있는 분\\n• 컴퓨터공학 전공 혹은 이에 준하는 지식 및 활용 역량이 있으신 분\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격'},\n", - " {'회사명': '놀유니버스',\n", - " '기업형태': '중견기업',\n", - " '모집직무': '경기 성남시 수정구',\n", - " '세부직무': '브랜드 마케팅 지원 담당자',\n", - " '자격요건': '브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트렌드에 민감하고, 다양한 브랜드 활동을 관찰하는 걸 좋아하는 분\\n꼼꼼하게 문서와 숫자를 다루며, 정확하게 검토하는 업무에 자신 있는 분\\n기본적인 오피스 툴(특히 Excel 또는 Google 스프레드시트) 사용이 가능한 분\\n팀과의 커뮤니케이션을 중요하게 생각하며, 협업을 긍정적으로 대하는 분\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격'},\n", - " {'회사명': '진에어', '기업형태': '대기업', '모집직무': '서울 강서구', '세부직무': '', '자격요건': ''},\n", - " {'회사명': '이앤에스글로벌', '기업형태': '중견기업', '모집직무': '서울 강남구', '세부직무': '', '자격요건': ''},\n", - " {'회사명': 'CJ푸드빌',\n", - " '기업형태': '대기업',\n", - " '모집직무': '서울 중구',\n", - " '세부직무': '데이터 전략·분석 전문가',\n", - " '자격요건': \"- 4년제 학사 졸 이상\\n- 관련 학과 : 컴퓨터공학, 산업공학, 경영정보, 문헌정보 등\\n- Data 분석 역량 및 관련 프로젝트 경력 3년 이상\\n- 다양한 Data 분석 Tool 활용 경험 (Python, SQL 등)\\n- ‘Data’ 기반으로 객관적인 현상 인식과 '분석적 사고'를 통해 솔루션을 도출하는 역량\\n- 현장 업무에 대한 이해를 위한 현업과의 협업 역량\\n- Data 분석을 위한 Data Engineer 등 관련 전문가들과의 협업 역량\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n\\n\"},\n", - " {'회사명': 'CJ푸드빌',\n", - " '기업형태': '대기업',\n", - " '모집직무': '서울 중구',\n", - " '세부직무': '디지털서비스 APP 개발자',\n", - " '자격요건': '- 4년제 대학 졸업자 이상\\n- 컴퓨터공학, 산업공학, 소프트웨어공학 등 관련학과\\n- React Native 및 Flutter 개발 경험 (최소 5년 이상) 💻\\n- App 설계부터 배포, 서비스 운영까지의 경험이 있으신 분\\n- 자기 주도적인 개발과 전체 프로세스를 고려한 설계와 구현이 가능 하신 분\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n\\n\\n'},\n", - " {'회사명': '삼성전자',\n", - " '기업형태': '대기업',\n", - " '모집직무': '경기 수원시 영통구',\n", - " '세부직무': '[VD사업부] Product Partnership',\n", - " '자격요건': ''},\n", - " {'회사명': '코레일네트웍스',\n", - " '기업형태': '공공기관/공기업',\n", - " '모집직무': '서울 용산구, 서울 구로구, 인천 연수구, 경기 과천시, 부산 동래구',\n", - " '세부직무': '일반직6급',\n", - " '자격요건': '하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 인적성검사 - 필기전형 - 면접전형 - 최종합격\\n\\n\\n'},\n", - " {'회사명': '주식회사 놀유니버스',\n", - " '기업형태': '중견기업',\n", - " '모집직무': '경기 성남시 수정구',\n", - " '세부직무': '',\n", - " '자격요건': ''},\n", - " {'회사명': '한미그룹',\n", - " '기업형태': '대기업',\n", - " '모집직무': '서울 송파구',\n", - " '세부직무': '[한미약품] Medical',\n", - " '자격요건': ''},\n", - " {'회사명': '국가정보원',\n", - " '기업형태': '공공기관/공기업',\n", - " '모집직무': '서울 강남구',\n", - " '세부직무': '해외정보',\n", - " '자격요건': '하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n\\n\\n'},\n", - " {'회사명': 'NHN Cloud',\n", - " '기업형태': '중견기업',\n", - " '모집직무': '경기 성남시 분당구',\n", - " '세부직무': '',\n", - " '자격요건': ''},\n", - " {'회사명': 'NHN Cloud',\n", - " '기업형태': '중견기업',\n", - " '모집직무': '경기 성남시 분당구',\n", - " '세부직무': '',\n", - " '자격요건': ''},\n", - " {'회사명': 'NHN Cloud',\n", - " '기업형태': '중견기업',\n", - " '모집직무': '경기 성남시 분당구',\n", - " '세부직무': '',\n", - " '자격요건': ''},\n", - " {'회사명': 'EY한영', '기업형태': '외국계기업', '모집직무': '서울 영등포구', '세부직무': '', '자격요건': ''},\n", - " {'회사명': 'Toss',\n", - " '기업형태': '중소기업',\n", - " '모집직무': 'IT/인터넷, 마케팅/광고/홍보, 영업/고객상담, 서비스',\n", - " '세부직무': '',\n", - " '자격요건': ''},\n", - " {'회사명': 'SNOW',\n", - " '기업형태': '대기업',\n", - " '모집직무': '경기 성남시 분당구',\n", - " '세부직무': '남미 타겟 EPIK 콘텐츠 마케팅 체험형 인턴',\n", - " '자격요건': ''}]" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "dc116ec9", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
회사명기업형태모집직무세부직무자격요건
0플랜핏중소기업IT/인터넷- IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용...
1리얼드로우중소기업서울 마포구SW Engineer- 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n...
2주식회사 화이트큐브스타트업서울 강남구콘텐츠 디자이너 인턴그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자...
3주식회사 화이트큐브스타트업서울 강남구백엔드 개발자 인턴• Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n•...
4놀유니버스중견기업경기 성남시 수정구브랜드 마케팅 지원 담당자브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트...
5진에어대기업서울 강서구
6이앤에스글로벌중견기업서울 강남구
7CJ푸드빌대기업서울 중구데이터 전략·분석 전문가- 4년제 학사 졸 이상\\n- 관련 학과 : 컴퓨터공학, 산업공학, 경영정보, 문헌...
8CJ푸드빌대기업서울 중구디지털서비스 APP 개발자- 4년제 대학 졸업자 이상\\n- 컴퓨터공학, 산업공학, 소프트웨어공학 등 관련학과...
9삼성전자대기업경기 수원시 영통구[VD사업부] Product Partnership
10코레일네트웍스공공기관/공기업서울 용산구, 서울 구로구, 인천 연수구, 경기 과천시, 부산 동래구일반직6급하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 인적성검사 - 필기전형 - ...
11주식회사 놀유니버스중견기업경기 성남시 수정구
12한미그룹대기업서울 송파구[한미약품] Medical
13국가정보원공공기관/공기업서울 강남구해외정보하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n...
14NHN Cloud중견기업경기 성남시 분당구
15NHN Cloud중견기업경기 성남시 분당구
16NHN Cloud중견기업경기 성남시 분당구
17EY한영외국계기업서울 영등포구
18Toss중소기업IT/인터넷, 마케팅/광고/홍보, 영업/고객상담, 서비스
19SNOW대기업경기 성남시 분당구남미 타겟 EPIK 콘텐츠 마케팅 체험형 인턴
\n", - "
" - ], - "text/plain": [ - " 회사명 기업형태 모집직무 \\\n", - "0 플랜핏 중소기업 IT/인터넷 \n", - "1 리얼드로우 중소기업 서울 마포구 \n", - "2 주식회사 화이트큐브 스타트업 서울 강남구 \n", - "3 주식회사 화이트큐브 스타트업 서울 강남구 \n", - "4 놀유니버스 중견기업 경기 성남시 수정구 \n", - "5 진에어 대기업 서울 강서구 \n", - "6 이앤에스글로벌 중견기업 서울 강남구 \n", - "7 CJ푸드빌 대기업 서울 중구 \n", - "8 CJ푸드빌 대기업 서울 중구 \n", - "9 삼성전자 대기업 경기 수원시 영통구 \n", - "10 코레일네트웍스 공공기관/공기업 서울 용산구, 서울 구로구, 인천 연수구, 경기 과천시, 부산 동래구 \n", - "11 주식회사 놀유니버스 중견기업 경기 성남시 수정구 \n", - "12 한미그룹 대기업 서울 송파구 \n", - "13 국가정보원 공공기관/공기업 서울 강남구 \n", - "14 NHN Cloud 중견기업 경기 성남시 분당구 \n", - "15 NHN Cloud 중견기업 경기 성남시 분당구 \n", - "16 NHN Cloud 중견기업 경기 성남시 분당구 \n", - "17 EY한영 외국계기업 서울 영등포구 \n", - "18 Toss 중소기업 IT/인터넷, 마케팅/광고/홍보, 영업/고객상담, 서비스 \n", - "19 SNOW 대기업 경기 성남시 분당구 \n", - "\n", - " 세부직무 \\\n", - "0 \n", - "1 SW Engineer \n", - "2 콘텐츠 디자이너 인턴 \n", - "3 백엔드 개발자 인턴 \n", - "4 브랜드 마케팅 지원 담당자 \n", - "5 \n", - "6 \n", - "7 데이터 전략·분석 전문가 \n", - "8 디지털서비스 APP 개발자 \n", - "9 [VD사업부] Product Partnership \n", - "10 일반직6급 \n", - "11 \n", - "12 [한미약품] Medical \n", - "13 해외정보 \n", - "14 \n", - "15 \n", - "16 \n", - "17 \n", - "18 \n", - "19 남미 타겟 EPIK 콘텐츠 마케팅 체험형 인턴 \n", - "\n", - " 자격요건 \n", - "0 - IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용... \n", - "1 - 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n... \n", - "2 그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자... \n", - "3 • Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n•... \n", - "4 브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트... \n", - "5 \n", - "6 \n", - "7 - 4년제 학사 졸 이상\\n- 관련 학과 : 컴퓨터공학, 산업공학, 경영정보, 문헌... \n", - "8 - 4년제 대학 졸업자 이상\\n- 컴퓨터공학, 산업공학, 소프트웨어공학 등 관련학과... \n", - "9 \n", - "10 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 인적성검사 - 필기전형 - ... \n", - "11 \n", - "12 \n", - "13 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n... \n", - "14 \n", - "15 \n", - "16 \n", - "17 \n", - "18 \n", - "19 " - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame(results)" - ] - }, - { - "cell_type": "markdown", - "id": "1dca6b23", - "metadata": {}, - "source": [ - "## 여러 페이지 크롤링 기능 추가" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "49cca052", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "📄 1페이지 접속 완료\n", - "🔍 20개의 공고 탐색 예정\n", - "✅ 플랜핏 (1/20, page 1) 크롤링 완료\n", - "✅ 리얼드로우 (2/20, page 1) 크롤링 완료\n", - "✅ 주식회사 화이트큐브 (3/20, page 1) 크롤링 완료\n", - "✅ 주식회사 화이트큐브 (4/20, page 1) 크롤링 완료\n", - "✅ 놀유니버스 (5/20, page 1) 크롤링 완료\n", - "✅ 진에어 (6/20, page 1) 크롤링 완료\n", - "✅ 이앤에스글로벌 (7/20, page 1) 크롤링 완료\n", - "✅ CJ푸드빌 (8/20, page 1) 크롤링 완료\n", - "✅ CJ푸드빌 (9/20, page 1) 크롤링 완료\n", - "✅ 삼성전자 (10/20, page 1) 크롤링 완료\n", - "✅ 코레일네트웍스 (11/20, page 1) 크롤링 완료\n", - "✅ 주식회사 놀유니버스 (12/20, page 1) 크롤링 완료\n", - "✅ 한미그룹 (13/20, page 1) 크롤링 완료\n", - "✅ 국가정보원 (14/20, page 1) 크롤링 완료\n", - "✅ NHN Cloud (15/20, page 1) 크롤링 완료\n", - "✅ NHN Cloud (16/20, page 1) 크롤링 완료\n", - "✅ NHN Cloud (17/20, page 1) 크롤링 완료\n", - "✅ EY한영 (18/20, page 1) 크롤링 완료\n", - "✅ Toss (19/20, page 1) 크롤링 완료\n", - "✅ SNOW (20/20, page 1) 크롤링 완료\n", - "📄 2페이지 접속 완료\n", - "🔍 20개의 공고 탐색 예정\n", - "✅ 근로복지공단 (1/20, page 2) 크롤링 완료\n", - "✅ 새만금개발공사 (2/20, page 2) 크롤링 완료\n", - "✅ 해태제과식품 (3/20, page 2) 크롤링 완료\n", - "✅ NHN서비스 (4/20, page 2) 크롤링 완료\n", - "✅ 펄어비스 (5/20, page 2) 크롤링 완료\n", - "✅ 네이버웹툰 (6/20, page 2) 크롤링 완료\n", - "✅ 더존비즈온 (7/20, page 2) 크롤링 완료\n", - "✅ 주식회사 누리미디어 (8/20, page 2) 크롤링 완료\n", - "✅ MBC (9/20, page 2) 크롤링 완료\n", - "✅ CJ ENM (10/20, page 2) 크롤링 완료\n", - "✅ CJ ENM (11/20, page 2) 크롤링 완료\n", - "✅ CJ ENM (12/20, page 2) 크롤링 완료\n", - "✅ MBC (13/20, page 2) 크롤링 완료\n", - "✅ 타라티피에스 (14/20, page 2) 크롤링 완료\n", - "✅ AXA손해보험 (15/20, page 2) 크롤링 완료\n", - "✅ 세정아이앤씨 (16/20, page 2) 크롤링 완료\n", - "✅ 네이버클라우드 (17/20, page 2) 크롤링 완료\n", - "✅ 일동제약 (18/20, page 2) 크롤링 완료\n", - "✅ 디스트릭트코리아 (19/20, page 2) 크롤링 완료\n", - "✅ SK C&C USA INC (20/20, page 2) 크롤링 완료\n", - "📄 3페이지 접속 완료\n", - "🔍 20개의 공고 탐색 예정\n", - "✅ 라인플러스 (1/20, page 3) 크롤링 완료\n", - "✅ 교보문고 (2/20, page 3) 크롤링 완료\n", - "✅ 진학사 (3/20, page 3) 크롤링 완료\n", - "✅ 토스인슈어런스 (4/20, page 3) 크롤링 완료\n", - "✅ 토즈코리아 (5/20, page 3) 크롤링 완료\n", - "✅ 포티투닷 (6/20, page 3) 크롤링 완료\n", - "✅ 샘표식품 (7/20, page 3) 크롤링 완료\n", - "✅ LG CNS (8/20, page 3) 크롤링 완료\n", - "✅ 노르마 (9/20, page 3) 크롤링 완료\n", - "✅ SFA반도체 (10/20, page 3) 크롤링 완료\n", - "✅ PTKOREA (11/20, page 3) 크롤링 완료\n", - "✅ 슈어소프트테크 (12/20, page 3) 크롤링 완료\n", - "✅ orskorea (13/20, page 3) 크롤링 완료\n", - "✅ 슈프리마 (14/20, page 3) 크롤링 완료\n", - "✅ 지멘스 (15/20, page 3) 크롤링 완료\n", - "✅ 효림그룹 (16/20, page 3) 크롤링 완료\n", - "✅ PTKOREA (17/20, page 3) 크롤링 완료\n", - "✅ 바비톡 (18/20, page 3) 크롤링 완료\n", - "✅ (사)이에스지노동사회협회 (19/20, page 3) 크롤링 완료\n", - "✅ 스카이랩스 (20/20, page 3) 크롤링 완료\n", - "📄 4페이지 접속 완료\n", - "🔍 20개의 공고 탐색 예정\n", - "✅ 카카오페이 (1/20, page 4) 크롤링 완료\n", - "✅ 한국자산관리공사 (2/20, page 4) 크롤링 완료\n", - "✅ 마야크루 (3/20, page 4) 크롤링 완료\n", - "✅ 플레이디 (4/20, page 4) 크롤링 완료\n", - "✅ JYP엔터테인먼트 (5/20, page 4) 크롤링 완료\n", - "✅ 비바리퍼블리카 (6/20, page 4) 크롤링 완료\n", - "✅ 네이버웹툰 (7/20, page 4) 크롤링 완료\n", - "✅ 한국도로교통공단 (8/20, page 4) 크롤링 완료\n", - "✅ 펄어비스 (9/20, page 4) 크롤링 완료\n", - "✅ 한국보건의료정보원 (10/20, page 4) 크롤링 완료\n", - "✅ 대구경북첨단의료산업진흥재단 (11/20, page 4) 크롤링 완료\n", - "✅ (주)힐링페이퍼 (12/20, page 4) 크롤링 완료\n", - "✅ 주식회사 어썸스쿨 (13/20, page 4) 크롤링 완료\n", - "✅ 현대글로비스 (14/20, page 4) 크롤링 완료\n", - "✅ IBK기업은행 (15/20, page 4) 크롤링 완료\n", - "✅ 쿠팡 (16/20, page 4) 크롤링 완료\n", - "✅ 토스페이먼츠 (17/20, page 4) 크롤링 완료\n", - "✅ 한국지식재산보호원 (18/20, page 4) 크롤링 완료\n", - "✅ 한국세라믹기술원 (19/20, page 4) 크롤링 완료\n", - "✅ 한국석유공사 (20/20, page 4) 크롤링 완료\n", - "📄 5페이지 접속 완료\n", - "🔍 20개의 공고 탐색 예정\n", - "✅ 토스뱅크 (1/20, page 5) 크롤링 완료\n", - "✅ LG전자 (2/20, page 5) 크롤링 완료\n", - "✅ 카카오 (3/20, page 5) 크롤링 완료\n", - "✅ 한전KDN (4/20, page 5) 크롤링 완료\n", - "✅ 효성 (5/20, page 5) 크롤링 완료\n", - "✅ 효성ITX (6/20, page 5) 크롤링 완료\n", - "✅ 에고이즘 (7/20, page 5) 크롤링 완료\n", - "✅ 서울에너지공사 (8/20, page 5) 크롤링 완료\n", - "✅ 독립기념관 (9/20, page 5) 크롤링 완료\n", - "✅ 주식회사 인터엑스 (10/20, page 5) 크롤링 완료\n", - "✅ 주식회사 인터엑스 (11/20, page 5) 크롤링 완료\n", - "✅ 주식회사 코드잇 (12/20, page 5) 크롤링 완료\n", - "✅ 주식회사 인터엑스 (13/20, page 5) 크롤링 완료\n", - "✅ 신한은행 (14/20, page 5) 크롤링 완료\n", - "✅ SK ON (15/20, page 5) 크롤링 완료\n", - "✅ 한국하니웰 (16/20, page 5) 크롤링 완료\n", - "✅ 스타쉽엔터테인먼트 (17/20, page 5) 크롤링 완료\n", - "✅ 경신 (18/20, page 5) 크롤링 완료\n", - "✅ 앳홈 (19/20, page 5) 크롤링 완료\n", - "✅ 현대오토에버 (20/20, page 5) 크롤링 완료\n", - "🎉 크롤링 완료! CSV 저장됨.\n" - ] - } - ], - "source": [ - "chrome_options = Options()\n", - "chrome_options.add_experimental_option(\"detach\", True)\n", - "driver = webdriver.Chrome(options=chrome_options)\n", - "wait = WebDriverWait(driver, 10)\n", - "\n", - "results = []\n", - "\n", - "# ✅ 크롤링할 페이지 범위 (1~5페이지 예시)\n", - "for page in range(1, 6): # 필요시 1~원하는 페이지 범위 수정\n", - " list_url = f\"https://linkareer.com/list/recruit?filterBy_activityTypeID=5&filterBy_categoryIDs=58&filterBy_status=OPEN&orderBy_direction=DESC&orderBy_field=RECENT&page={page}\"\n", - " driver.get(list_url)\n", - " time.sleep(2)\n", - "\n", - " print(f\"📄 {page}페이지 접속 완료\")\n", - "\n", - " # ✅ 메인 탭 핸들 저장\n", - " main_window = driver.current_window_handle\n", - "\n", - " # 공고 row 개수 가져오기\n", - " row_count = len(driver.find_elements(By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/section/div[2]/table/tbody/tr'))\n", - " print(f\"🔍 {row_count}개의 공고 탐색 예정\")\n", - "\n", - " for i in range(1, row_count + 1):\n", - " try:\n", - " link_element = driver.find_element(By.XPATH, f'//*[@id=\"__next\"]/div[1]/div/main/div/section/div[2]/table/tbody/tr[{i}]/td[2]/div/a/div/p')\n", - " link_element.click()\n", - "\n", - " # 새 탭으로 전환\n", - " driver.switch_to.window(driver.window_handles[-1])\n", - "\n", - " # ✅ 기본 정보 크롤링\n", - " company_name = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/div/section[1]/div/article/header/h2'))).text.strip()\n", - " company_type = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[1]/dd'))).text.strip()\n", - "\n", - " position_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id=\"__next\"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[5]/dd')))\n", - " position = position_element.text.strip()\n", - "\n", - " # ✅ 모든 p 태그 텍스트 수집\n", - " p_elements = driver.find_elements(By.XPATH, '//*[@id=\"DETAIL\"]/section[1]/div/p')\n", - " p_texts = [p.text.strip() for p in p_elements]\n", - "\n", - " # ✅ 자격요건/모집직무 인덱스 탐색\n", - " qual_idx = next((idx for idx, text in enumerate(p_texts) if '자격요건' in text or '자격 요건' in text), None)\n", - " pos_idx = next((idx for idx, text in enumerate(p_texts) if '모집 직무' in text or '세부 직무' in text), None)\n", - "\n", - " # ✅ 자격요건 텍스트 추출\n", - " qualification_texts = []\n", - " if qual_idx is not None:\n", - " for t in p_texts[qual_idx + 1:]:\n", - " if any(keyword in t for keyword in ['지원', '혜택', '우대', '다음', '근무']):\n", - " break\n", - " qualification_texts.append(t)\n", - " qualification = \"\\n\".join(qualification_texts)\n", - "\n", - " # ✅ 세부직무 추출\n", - " detail_position = ''\n", - " if pos_idx is not None:\n", - " detail_position = p_texts[pos_idx + 1] if pos_idx + 1 < len(p_texts) else ''\n", - "\n", - " # ✅ 결과 저장\n", - " results.append({\n", - " '회사명': company_name,\n", - " '기업형태': company_type,\n", - " '모집직무': position,\n", - " '세부직무': detail_position,\n", - " '자격요건': qualification\n", - " })\n", - "\n", - " print(f\"✅ {company_name} ({i}/{row_count}, page {page}) 크롤링 완료\")\n", - "\n", - " # 새 탭 닫기 & 메인 탭으로 전환\n", - " driver.close()\n", - " driver.switch_to.window(main_window)\n", - "\n", - " time.sleep(1)\n", - "\n", - " except Exception as e:\n", - " print(f\"❌ {page}페이지 {i}번째 공고 오류: {e}\")\n", - " # 예외 시 새 탭 닫고 메인 탭 복귀\n", - " if len(driver.window_handles) > 1:\n", - " driver.close()\n", - " driver.switch_to.window(main_window)\n", - " continue\n", - "\n", - "driver.quit()\n", - "\n", - "# ✅ DataFrame 변환 및 저장\n", - "df = pd.DataFrame(results)\n", - "df.to_csv('linkareer_crawling.csv', index=False, encoding='utf-8-sig')\n", - "\n", - "print(\"🎉 크롤링 완료! CSV 저장됨.\")" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "b4179206", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
회사명기업형태모집직무세부직무자격요건
0플랜핏중소기업IT/인터넷- IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용...
1리얼드로우중소기업서울 마포구SW Engineer- 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n...
2주식회사 화이트큐브스타트업서울 강남구콘텐츠 디자이너 인턴그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자...
3주식회사 화이트큐브스타트업서울 강남구백엔드 개발자 인턴• Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n•...
4놀유니버스중견기업경기 성남시 수정구브랜드 마케팅 지원 담당자브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트...
..................
95한국하니웰중견기업서울 마포구
96스타쉽엔터테인먼트대기업서울 강남구- 학력 : 초대졸 이상\\n- 경력 : 무관(신입/경력)\\n- 엔터테인먼트 및 문화...
97경신대기업인천 연수구, 인천 연수구, 경기 화성시, 전북특별자치도 군산시, 경기 의왕시채용연계형 인턴-영업-원가
98앳홈중소기업경영/사무, 마케팅/광고/홍보, IT/인터넷인플루언서 커머스 AMD유튜브, 인스타그램 등 콘텐츠 플랫폼을 자주 보고, 트렌드에 관심 많은 분\\n인플루...
99현대오토에버대기업서울 강남구, 울산 북구, 경기 화성시, 충남 아산시, 경기 의왕시-디지털 경험-최종학력 4년제 대졸 이상\\n남성의 경우 군필 또는 면제자\\n해외여행 결격사유가 없...
\n", - "

100 rows × 5 columns

\n", - "
" - ], - "text/plain": [ - " 회사명 기업형태 모집직무 \\\n", - "0 플랜핏 중소기업 IT/인터넷 \n", - "1 리얼드로우 중소기업 서울 마포구 \n", - "2 주식회사 화이트큐브 스타트업 서울 강남구 \n", - "3 주식회사 화이트큐브 스타트업 서울 강남구 \n", - "4 놀유니버스 중견기업 경기 성남시 수정구 \n", - ".. ... ... ... \n", - "95 한국하니웰 중견기업 서울 마포구 \n", - "96 스타쉽엔터테인먼트 대기업 서울 강남구 \n", - "97 경신 대기업 인천 연수구, 인천 연수구, 경기 화성시, 전북특별자치도 군산시, 경기 의왕시 \n", - "98 앳홈 중소기업 경영/사무, 마케팅/광고/홍보, IT/인터넷 \n", - "99 현대오토에버 대기업 서울 강남구, 울산 북구, 경기 화성시, 충남 아산시, 경기 의왕시 \n", - "\n", - " 세부직무 자격요건 \n", - "0 - IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용... \n", - "1 SW Engineer - 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n... \n", - "2 콘텐츠 디자이너 인턴 그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자... \n", - "3 백엔드 개발자 인턴 • Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n•... \n", - "4 브랜드 마케팅 지원 담당자 브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트... \n", - ".. ... ... \n", - "95 \n", - "96 - 학력 : 초대졸 이상\\n- 경력 : 무관(신입/경력)\\n- 엔터테인먼트 및 문화... \n", - "97 채용연계형 인턴-영업-원가 \n", - "98 인플루언서 커머스 AMD 유튜브, 인스타그램 등 콘텐츠 플랫폼을 자주 보고, 트렌드에 관심 많은 분\\n인플루... \n", - "99 -디지털 경험- 최종학력 4년제 대졸 이상\\n남성의 경우 군필 또는 면제자\\n해외여행 결격사유가 없... \n", - "\n", - "[100 rows x 5 columns]" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame(results)" - ] - }, - { - "cell_type": "markdown", - "id": "97ee2976", - "metadata": {}, - "source": [ - "### 샘플로 크롤링한 데이터 확인" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "bf460a59", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "<>:1: SyntaxWarning: invalid escape sequence '\\l'\n", - "<>:1: SyntaxWarning: invalid escape sequence '\\l'\n", - "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\ipykernel_23680\\2138932626.py:1: SyntaxWarning: invalid escape sequence '\\l'\n", - " df = pd.read_csv('C:\\고급프로그래밍\\linkareer_crawling.csv')\n" - ] - } - ], - "source": [ - "df = pd.read_csv('C:\\고급프로그래밍\\linkareer_crawling.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "5ed07310", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
회사명기업형태모집직무세부직무자격요건
0플랜핏중소기업IT/인터넷NaN- IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용...
1리얼드로우중소기업서울 마포구SW Engineer- 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n...
2주식회사 화이트큐브스타트업서울 강남구콘텐츠 디자이너 인턴그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자...
3주식회사 화이트큐브스타트업서울 강남구백엔드 개발자 인턴• Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n•...
4놀유니버스중견기업경기 성남시 수정구브랜드 마케팅 지원 담당자브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트...
\n", - "
" - ], - "text/plain": [ - " 회사명 기업형태 모집직무 세부직무 \\\n", - "0 플랜핏 중소기업 IT/인터넷 NaN \n", - "1 리얼드로우 중소기업 서울 마포구 SW Engineer \n", - "2 주식회사 화이트큐브 스타트업 서울 강남구 콘텐츠 디자이너 인턴 \n", - "3 주식회사 화이트큐브 스타트업 서울 강남구 백엔드 개발자 인턴 \n", - "4 놀유니버스 중견기업 경기 성남시 수정구 브랜드 마케팅 지원 담당자 \n", - "\n", - " 자격요건 \n", - "0 - IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용... \n", - "1 - 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n... \n", - "2 그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자... \n", - "3 • Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n•... \n", - "4 브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트... " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "a5220abc", - "metadata": {}, - "outputs": [], - "source": [ - "def split_process(text):\n", - " # NaN 방지 처리: 비어있으면 ''로 변경\n", - " if not isinstance(text, str):\n", - " text = ''\n", - " \n", - " # 전형 절차 분리\n", - " process_pattern = r'\\[.*?(전형|프로세스).*?\\][\\s\\S]*'\n", - " process_match = re.search(process_pattern, text)\n", - " \n", - " if process_match:\n", - " process = process_match.group().strip()\n", - " qualification = text.replace(process, '').strip()\n", - " else:\n", - " process = ''\n", - " qualification = text.strip()\n", - " \n", - " return qualification, process\n", - "\n", - "result_rows = []\n", - "\n", - "\n", - "# 예시 처리\n", - "for idx, row in df.iterrows():\n", - " qualification, process = split_process(row['자격요건'])\n", - " \n", - " # location 이 모집직무에 들어간 경우 분리\n", - " job = row['모집직무'] if isinstance(row['모집직무'], str) else ''\n", - " location = None\n", - " if '구' in job or '시' in job or '도' in job:\n", - " location = job\n", - " main_job = None\n", - " else:\n", - " main_job = job\n", - " \n", - " # 세부직무 없으면 NULL\n", - " detail_job = row['세부직무'] if isinstance(row['세부직무'], str) else ''\n", - " \n", - " # 출력 or db insert 준비\n", - " result_rows.append({\n", - " 'company_name': row['회사명'],\n", - " 'company_type': row['기업형태'],\n", - " 'main_job': main_job,\n", - " 'detail_job': detail_job,\n", - " 'location': location,\n", - " 'qualification': qualification,\n", - " 'process': process\n", - " })\n", - "\n", - "result_df = pd.DataFrame(result_rows)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "5b93c938", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "🎉 전처리 완료! CSV 저장됨.\n" - ] - } - ], - "source": [ - "result_df.to_csv('linkareer_processed.csv', index=False, encoding='utf-8-sig')\n", - "print(\"🎉 전처리 완료! CSV 저장됨.\")" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "e25ccbb3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
company_namecompany_typemain_jobdetail_joblocationqualificationprocess
0플랜핏중소기업IT/인터넷None- IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용...[인재 영입 프로세스]\\n- 서류 전형 -> 1차 직무 인터뷰 -> 2차 컬쳐핏 인...
1리얼드로우중소기업NoneSW Engineer서울 마포구- 하단 상세 공고 참조[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n*이메일 접수: people...
2주식회사 화이트큐브스타트업None콘텐츠 디자이너 인턴서울 강남구그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자...[전형 안내]\\n서류전형 - 면접전형 - 최종합격
3주식회사 화이트큐브스타트업None백엔드 개발자 인턴서울 강남구• Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n•...[전형 안내]\\n서류전형 - 면접전형 - 최종합격
4놀유니버스중견기업None브랜드 마케팅 지원 담당자경기 성남시 수정구브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트...[전형 안내]\\n서류전형 - 면접전형 - 최종합격
\n", - "
" - ], - "text/plain": [ - " company_name company_type main_job detail_job location \\\n", - "0 플랜핏 중소기업 IT/인터넷 None \n", - "1 리얼드로우 중소기업 None SW Engineer 서울 마포구 \n", - "2 주식회사 화이트큐브 스타트업 None 콘텐츠 디자이너 인턴 서울 강남구 \n", - "3 주식회사 화이트큐브 스타트업 None 백엔드 개발자 인턴 서울 강남구 \n", - "4 놀유니버스 중견기업 None 브랜드 마케팅 지원 담당자 경기 성남시 수정구 \n", - "\n", - " qualification \\\n", - "0 - IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용... \n", - "1 - 하단 상세 공고 참조 \n", - "2 그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자... \n", - "3 • Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n•... \n", - "4 브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트... \n", - "\n", - " process \n", - "0 [인재 영입 프로세스]\\n- 서류 전형 -> 1차 직무 인터뷰 -> 2차 컬쳐핏 인... \n", - "1 [전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n*이메일 접수: people... \n", - "2 [전형 안내]\\n서류전형 - 면접전형 - 최종합격 \n", - "3 [전형 안내]\\n서류전형 - 면접전형 - 최종합격 \n", - "4 [전형 안내]\\n서류전형 - 면접전형 - 최종합격 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result_df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "bdf304aa", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['company_name', 'company_type', 'main_job', 'detail_job', 'location',\n", - " 'qualification', 'process'],\n", - " dtype='object')" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result_df.columns" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "aa81c8ed", - "metadata": {}, - "outputs": [], - "source": [ - "# # 간단 예시: 특정 키워드만 찾기 - 이렇게 키워드화도 가능하겠지만... 노가다 필요!!\n", - "\n", - "# keywords = ['Python', 'Node.js', 'Go', 'React', 'SQL', 'Flutter']\n", - "\n", - "# def extract_tags(text):\n", - "# if not isinstance(text, str):\n", - "# return []\n", - "# return [kw for kw in keywords if kw.lower() in text.lower()]\n", - "\n", - "# df['qualification_tags'] = df['qualification'].apply(extract_tags)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fcf88a0a", - "metadata": {}, - "outputs": [], - "source": [ - "# 정규화는 나중에 해도 될듯함\n", - "# CREATE TABLE job_postings (\n", - "# id INT AUTO_INCREMENT PRIMARY KEY,\n", - "# company_name VARCHAR(255),\n", - "# company_type VARCHAR(50),\n", - "# main_job VARCHAR(100),\n", - "# detail_job VARCHAR(100),\n", - "# location VARCHAR(100),\n", - "# qualification TEXT,\n", - "# process TEXT,\n", - "# created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n", - "# );" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "hoenv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git "a/backend/crawling/downloads/NHN_\352\263\265\352\263\2408.png" "b/backend/crawling/downloads/NHN_\352\263\265\352\263\2408.png" deleted file mode 100644 index 7ce51dc4b..000000000 Binary files "a/backend/crawling/downloads/NHN_\352\263\265\352\263\2408.png" and /dev/null differ diff --git "a/backend/crawling/downloads/\353\204\244\354\235\264\353\262\204\355\201\264\353\235\274\354\232\260\353\223\234_\352\263\265\352\263\2405.png" "b/backend/crawling/downloads/\353\204\244\354\235\264\353\262\204\355\201\264\353\235\274\354\232\260\353\223\234_\352\263\265\352\263\2405.png" deleted file mode 100644 index 5422dbdad..000000000 Binary files "a/backend/crawling/downloads/\353\204\244\354\235\264\353\262\204\355\201\264\353\235\274\354\232\260\353\223\234_\352\263\265\352\263\2405.png" and /dev/null differ diff --git "a/backend/crawling/downloads/\353\204\244\354\235\264\353\262\204\355\201\264\353\235\274\354\232\260\353\223\234_\352\263\265\352\263\2409.png" "b/backend/crawling/downloads/\353\204\244\354\235\264\353\262\204\355\201\264\353\235\274\354\232\260\353\223\234_\352\263\265\352\263\2409.png" deleted file mode 100644 index 6f7084ded..000000000 Binary files "a/backend/crawling/downloads/\353\204\244\354\235\264\353\262\204\355\201\264\353\235\274\354\232\260\353\223\234_\352\263\265\352\263\2409.png" and /dev/null differ diff --git "a/backend/crawling/downloads/\354\275\224\354\233\250\354\235\264_\352\263\265\352\263\2407.png" "b/backend/crawling/downloads/\354\275\224\354\233\250\354\235\264_\352\263\265\352\263\2407.png" deleted file mode 100644 index 161c3587c..000000000 Binary files "a/backend/crawling/downloads/\354\275\224\354\233\250\354\235\264_\352\263\265\352\263\2407.png" and /dev/null differ diff --git "a/backend/crawling/downloads/\354\277\240\355\214\241_\352\263\265\352\263\2402.png" "b/backend/crawling/downloads/\354\277\240\355\214\241_\352\263\265\352\263\2402.png" deleted file mode 100644 index 14b427300..000000000 Binary files "a/backend/crawling/downloads/\354\277\240\355\214\241_\352\263\265\352\263\2402.png" and /dev/null differ diff --git "a/backend/crawling/downloads/\355\201\264\353\241\234\353\264\207_\352\263\265\352\263\2406.png" "b/backend/crawling/downloads/\355\201\264\353\241\234\353\264\207_\352\263\265\352\263\2406.png" deleted file mode 100644 index 90bb74031..000000000 Binary files "a/backend/crawling/downloads/\355\201\264\353\241\234\353\264\207_\352\263\265\352\263\2406.png" and /dev/null differ diff --git a/backend/crawling/job_classification_applicants.ipynb b/backend/crawling/job_classification_applicants.ipynb deleted file mode 100644 index 316d1477f..000000000 --- a/backend/crawling/job_classification_applicants.ipynb +++ /dev/null @@ -1,859 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 47, - "id": "465c9ae5", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "from sqlalchemy import create_engine" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "f4b8c7ed", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "<>:1: SyntaxWarning: invalid escape sequence '\\l'\n", - "<>:2: SyntaxWarning: invalid escape sequence '\\l'\n", - "<>:3: SyntaxWarning: invalid escape sequence '\\l'\n", - "<>:1: SyntaxWarning: invalid escape sequence '\\l'\n", - "<>:2: SyntaxWarning: invalid escape sequence '\\l'\n", - "<>:3: SyntaxWarning: invalid escape sequence '\\l'\n", - "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\ipykernel_22496\\1950634336.py:1: SyntaxWarning: invalid escape sequence '\\l'\n", - " df_it = pd.read_csv(\"C:\\고급프로그래밍\\linkareear_applicants_crawling_it,internet.csv\")\n", - "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\ipykernel_22496\\1950634336.py:2: SyntaxWarning: invalid escape sequence '\\l'\n", - " df_pro = pd.read_csv(\"C:\\고급프로그래밍\\linkareear_applicants_crawling_production.csv\")\n", - "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\ipykernel_22496\\1950634336.py:3: SyntaxWarning: invalid escape sequence '\\l'\n", - " df_re = pd.read_csv(\"C:\\고급프로그래밍\\linkareear_applicants_crawling_research.csv\")\n" - ] - } - ], - "source": [ - "df_it = pd.read_csv(\"C:\\고급프로그래밍\\linkareear_applicants_crawling_it,internet.csv\") \n", - "df_pro = pd.read_csv(\"C:\\고급프로그래밍\\linkareear_applicants_crawling_production.csv\") \n", - "df_re = pd.read_csv(\"C:\\고급프로그래밍\\linkareear_applicants_crawling_research.csv\") " - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "4ba53ff5", - "metadata": {}, - "outputs": [], - "source": [ - "def classify_it_job(detail):\n", - " detail = str(detail).lower().strip()\n", - "\n", - " # ✅ 서버 / 백엔드\n", - " if any(k in detail for k in ['백엔드', 'backend', 'server', '업무원장개발', '서비스 개발', 'api']):\n", - " return '서버·백엔드'\n", - "\n", - " # ✅ 프론트엔드 / 웹\n", - " elif any(k in detail for k in ['프론트엔드', '퍼블리싱', 'ui', 'ux', '웹', 'frontend']):\n", - " return '프론트엔드 / 웹'\n", - "\n", - " # ✅ IT 기획 / 컨설팅\n", - " elif any(k in detail for k in ['기획', '컨설팅', '신사업', '전략기획', '전략']):\n", - " return 'IT기획 / 컨설팅'\n", - "\n", - " # ✅ IT 운영 / 시스템\n", - " elif any(k in detail for k in ['운영', '전산', 'infra', '인프라', '시스템', '아키텍처']):\n", - " return 'IT운영 / 시스템'\n", - "\n", - " # ✅ 데이터 / AI\n", - " elif any(k in detail for k in ['데이터', 'ai', '머신러닝', 'deep learning', 'r&d', '빅데이터', '금융공학']):\n", - " return '데이터 / AI / R&D'\n", - "\n", - " # ✅ 정보보안\n", - " elif any(k in detail for k in ['보안', 'security', '정보보호', 'cyber']):\n", - " return '정보보안 / 보안엔지니어'\n", - "\n", - " # ✅ 소프트웨어 개발\n", - " elif any(k in detail for k in ['sw', '소프트웨어', '응용', 'programming', '개발', '프로그래머', 'it programmer']):\n", - " return '소프트웨어 개발'\n", - "\n", - " # ✅ QA / 테스트\n", - " elif any(k in detail for k in ['qa', '품질', '검증', '테스트']):\n", - " return 'QA / 테스트'\n", - "\n", - " # ✅ IT 영업\n", - " elif any(k in detail for k in ['영업', 'sales']):\n", - " return 'IT영업 / 기술영업'\n", - "\n", - " # ✅ 디지털 / 스마트IT\n", - " elif any(k in detail for k in ['디지털', 'smart', '스마트', '애자일']):\n", - " return '디지털 / 스마트IT'\n", - "\n", - " # ✅ 네트워크\n", - " elif any(k in detail for k in ['network', 'it infrastructure']):\n", - " return '네트워크 / 인프라'\n", - "\n", - " # ✅ 금융IT\n", - " elif any(k in detail for k in ['금융it', '카드', 'cfo', '금융', '은행', 'it업무혁신']):\n", - " return '금융 IT'\n", - "\n", - " # ✅ 연구 / 학술\n", - " elif any(k in detail for k in ['석박사', '연구개발', '연구', '인재육성', 'academy']):\n", - " return '연구개발 / 학술IT'\n", - "\n", - " # ✅ 전사 지원\n", - " elif any(k in detail for k in ['전사', '사업부문', '지원', 'staff']):\n", - " return '전사 IT 지원'\n", - "\n", - " # ✅ 기타 잡힘 방지용: IT 단어만 있는 경우\n", - " elif detail in ['it', 'it분야', 'it 직무', 'it계열', 'it인재(3급)', 'it서비스', 'it관리', 'it cloud']:\n", - " return 'IT 일반'\n", - "\n", - " else:\n", - " return '기타 IT'\n", - "\n", - "\n", - "def classify_production_job(detail):\n", - " detail = str(detail).lower().strip()\n", - " \n", - " # 생산관리\n", - " if any(k in detail for k in ['생산관리', '생산운영', '생산기획', '생산팀', '생산직무', '생산판매', '출하']):\n", - " return '생산관리'\n", - " \n", - " # 생산기술\n", - " elif any(k in detail for k in ['생산기술', '생산 기술', '공정기술', '제조기술', '제조공정', '공정관리', '생산기술직', '생산 엔지니어']):\n", - " return '생산기술'\n", - " \n", - " # 생산 일반\n", - " elif any(k in detail for k in ['생산', '생산공정', '생산부문', '생산운전', '생산스탭', '생산 직무', '생산(공장)', '생산1팀']):\n", - " return '생산 (일반)'\n", - " \n", - " # 제조 / 생산지원\n", - " elif any(k in detail for k in ['생산지원', '제조', '제조부문', '제조전략', '제조솔루션', '제조지원', '제조원가', '구매', '소싱']):\n", - " return '제조 / 생산지원'\n", - " \n", - " # 품질관리\n", - " elif any(k in detail for k in ['품질', '품질관리', '품질보증', '생산품질', '품질생산', '품진생산']):\n", - " return '품질관리'\n", - " \n", - " # 설비 / 유지보수\n", - " elif any(k in detail for k in ['설비', '정비', '설비관리', '설비운영', '유지보수', 'esh', '전기공무', '기술관리']):\n", - " return '설비 / 유지보수'\n", - " \n", - " # 노무 / 현장\n", - " elif any(k in detail for k in ['노무', '기능직', '현장', '직공', '생산직', '오퍼레이터', '기술직(생산)']):\n", - " return '노무 / 현장'\n", - " \n", - " # R&D\n", - " elif any(k in detail for k in ['r&d', '연구', '연구개발', '기술개발', '연구소']):\n", - " return 'R&D / 연구개발'\n", - " \n", - " # 배터리 / 전지 / 반도체\n", - " elif any(k in detail for k in ['배터리', '전지', '이차전지', '공정생산', '반도체']):\n", - " return '배터리 / 전지'\n", - " \n", - " # 화학 / 바이오 / 소재\n", - " elif any(k in detail for k in ['bio', '생명과학', '정제', '발효', '제약', '화학', '석유', '합성수지', '소재', '기초소재', '첨단소재', '기판소재', '재료', '재료사업부', '산업자재']):\n", - " return '화학 / 바이오 생산'\n", - " \n", - " # 자동차 / 기계\n", - " elif any(k in detail for k in ['자동차', '차량', '기계', '엔진', '파워트레인', '차체']):\n", - " return '자동차 / 기계 생산'\n", - "\n", - " # 기타 엔지니어링 부서 (DS, DX, LED, H&A 등)\n", - " elif any(k in detail for k in ['dx부문', 'ds생산', 'led', 'ce', 'h&a', 'p']):\n", - " return '전자 / 디지털 생산'\n", - "\n", - " # 이상치 / 불분명\n", - " elif detail in ['#name?', 'nan', '']:\n", - " return '기타'\n", - " \n", - " else:\n", - " return '기타'\n", - " \n", - "\n", - "\n", - "def classify_detail_job(detail):\n", - " detail = str(detail).lower().strip()\n", - "\n", - " # 🎯 연구개발\n", - " if any(k in detail for k in ['재료', '소재', 'compound', 'mim', '원료']):\n", - " return '연구개발 - 재료/소재'\n", - " elif any(k in detail for k in ['전기', '전자', '전장', '아날로그']):\n", - " return '연구개발 - 전기/전자'\n", - " elif any(k in detail for k in ['기계', '전동', '액추에이터']) and '설계' not in detail:\n", - " return '연구개발 - 기계'\n", - " elif any(k in detail for k in ['bio', '생명과학', '제약', '정제', '발효']):\n", - " return '연구개발 - 화학/바이오'\n", - " elif any(k in detail for k in ['자율주행', '차량', '전장sw', '제어']):\n", - " return '연구개발 - 차량/자율주행'\n", - " elif any(k in detail for k in ['반도체', 'system lsi', 'lsi', '파운드리']):\n", - " return '연구개발 - 반도체'\n", - " elif any(k in detail for k in ['ai', 'multimodal', 'llm']):\n", - " return '연구개발 - AI/데이터'\n", - " elif any(k in detail for k in ['공정개발', '공정기술', '공정연구']):\n", - " return '연구개발 - 공정'\n", - "\n", - " # 🎯 설계\n", - " elif any(k in detail for k in ['기구설계', '기계설계', '구조설계']):\n", - " return '설계 - 기계/기구'\n", - " elif any(k in detail for k in ['회로설계', 'soc']):\n", - " return '설계 - 회로'\n", - " elif any(k in detail for k in ['전기설계', '제어설계']):\n", - " return '설계 - 전기'\n", - " elif any(k in detail for k in ['건축', '조경', '인테리어', '플랜트', '공사관리', '공조']):\n", - " return '설계 - 건축/플랜트'\n", - " elif any(k in detail for k in ['system', '솔루션', 'solution설계', '신호 및 시스템']):\n", - " return '설계 - 시스템'\n", - "\n", - " # 🎯 소프트웨어 개발\n", - " elif '백엔드' in detail or 'backend' in detail:\n", - " return '소프트웨어 개발 - 백엔드'\n", - " elif '프론트엔드' in detail or 'frontend' in detail:\n", - " return '소프트웨어 개발 - 프론트'\n", - " elif '웹개발' in detail or 'web' in detail:\n", - " return '소프트웨어 개발 - 웹'\n", - " elif any(k in detail for k in ['fw', 'platform', 'ssd']):\n", - " return '소프트웨어 개발 - 플랫폼'\n", - "\n", - " # 🎯 IT 시스템 개발\n", - " elif any(k in detail for k in ['시스템 운영', '서비스 개발', 'ict개발', 'it개발', 'it 개발', '서비스개발', 'plm']):\n", - " return '시스템개발/IT'\n", - " elif any(k in detail for k in ['금융 it', '금융it']):\n", - " return '금융IT'\n", - "\n", - " # 🎯 제품개발\n", - " elif any(k in detail for k in ['제품개발', '상품개발', '양산개발', '패키지개발']):\n", - " return '제품개발'\n", - "\n", - " # 🎯 UX / 콘텐츠 / 인턴\n", - " elif any(k in detail for k in ['ux', 'ui', '콘텐츠', '인턴', '유아동']):\n", - " return 'UX/UI/콘텐츠'\n", - "\n", - " # 🎯 전략 / 사업개발\n", - " elif any(k in detail for k in ['사업개발', 'global', 'trading', '사업팀', '미래전략']):\n", - " return '전략/사업개발'\n", - "\n", - " # 🎯 기술 연구소 / 부서\n", - " elif any(k in detail for k in ['혁신센터', '연구소', 'dx부문', 'ds부문', 'cto']):\n", - " return '기술연구소/센터'\n", - "\n", - " # 🎯 생산 / 공정\n", - " elif any(k in detail for k in ['생산관리', '생산기술']):\n", - " return '생산관리'\n", - " elif detail == '생산':\n", - " return '생산 (일반)'\n", - "\n", - " # 🎯 조사 / 학술\n", - " elif any(k in detail for k in ['학술개발', '조사']):\n", - " return '학술/조사'\n", - "\n", - " # 🎯 HRD\n", - " elif any(k in detail for k in ['hrd', '교육']):\n", - " return 'HRD/교육'\n", - "\n", - " # 🎯 일반 키워드 (잡아주는 용)\n", - " elif any(k in detail for k in ['연구개발', 'r&d', '연구분야', '연구개발팀']):\n", - " return '연구개발 (일반)'\n", - " elif detail == '설계':\n", - " return '설계 (일반)'\n", - " elif detail == '개발' or '개발자' in detail or 'windows 개발' in detail:\n", - " return '개발 (일반)'\n", - " elif any(k in detail for k in ['기술개발', '기술직', '기술연구소']):\n", - " return '기술개발 (일반)'\n", - " elif any(k in detail for k in ['제품', '기구개발']):\n", - " return '제품/기구개발 (일반)'\n", - " \n", - " elif 'esg' in detail:\n", - " return '전략/사업개발'\n", - " elif 'eng설계직' in detail or '조선해양' in detail or '엔진 설계' in detail:\n", - " return '설계 - 기계/기구'\n", - " elif '제제연구' in detail or '과학기술' in detail or '연구 개발' in detail:\n", - " return '연구개발 - 화학/바이오'\n", - " elif '배터리 셀' in detail or '배터리 팩' in detail:\n", - " return '연구개발 - 배터리/전지'\n", - " elif '점포개발' in detail:\n", - " return '전략/사업개발'\n", - " elif any(k in detail for k in ['시스템', 'erp개발', '전산직', 'hw', 'smt', '소프트웨어개발']):\n", - " return '시스템개발/IT'\n", - " elif any(k in detail for k in ['타이어설계', '현가시스템', '타이어 구조']):\n", - " return '연구개발 - 차량/자율주행'\n", - " elif '선행기술' in detail:\n", - " return '기술개발 (일반)'\n", - " elif '공정설계' in detail or '배터리 공정' in detail:\n", - " return '연구개발 - 공정'\n", - " elif any(k in detail for k in ['da사업부', 'tech', 'ds 부문', 'h']):\n", - " return '기술연구소/센터'\n", - " elif '교과서' in detail:\n", - " return 'UX/UI/콘텐츠'\n", - " elif '사이버보안' in detail:\n", - " return '연구개발 - 전기/전자'\n", - " elif 'module' in detail:\n", - " return '제품/기구개발 (일반)'\n", - " elif '글로벌' in detail:\n", - " return '전략/사업개발'\n", - " elif '스마트팩토리' in detail:\n", - " return '시스템개발/IT'\n", - " elif 'back-end 개발' in detail:\n", - " return '소프트웨어 개발 - 백엔드'\n", - " elif '회로 설계' in detail:\n", - " return '설계 - 회로'\n", - " elif '생활가전' in detail:\n", - " return '제품개발'\n", - "\n", - "\n", - " else:\n", - " return '기타'" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "4de68c0d", - "metadata": {}, - "outputs": [], - "source": [ - "# 분류 적용\n", - "df_it['detail_job'] = df_it['detail_job'].apply(classify_it_job)\n", - "df_pro['detail_job'] = df_pro['detail_job'].apply(classify_production_job)\n", - "df_re['detail_job'] = df_re['detail_job'].apply(classify_detail_job)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "a8071bce", - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.concat([df_it, df_pro, df_re])" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "0b0fb876", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['덕성여대', '중앙대', '홍익대학교', '홍익대', '선문대', '건동홍', '인가경', '한양대학교', '동국대',\n", - " '고졸', 'Carnegie Mellon University', '고려대학교', '국숭세단', '인천대',\n", - " '가톨릭대학교', '상명대학교', '국민대학교', '국민대', '인천대학교', '대진전자통신고등학교',\n", - " '한국공학대학교', '지방대', '가톨릭대', '국숭세단라인', '숭실대', '중경외시', '인하대', '인하대학교',\n", - " '금오공대', '한양대 에리카', '서연고', '지거국', '영남대', '건국대', '한국외대', 'SKY',\n", - " '한남대학교', '건홍동', '신라대', '한양대', '해외대', '중앙대학교', '광운대학교, 광운대 대학원',\n", - " '광운대학교', '포항공과대학교', '서울 상위', '중앙', '서성한', '화학과', '지방거점대', nan,\n", - " '세종대학교', '공주대학교', '성균관 대학교', '숭실대학교', '중,경,외,시', '조선대', '조선대학교',\n", - " '과기원', '수도권', 'S대', '광명상가', '단국대학교 일반대학원', '지방4년제', '서울 하위권',\n", - " '아주대', '인서울 S대', '서울과학기술대학교', '공학', '서울 중상위권', '외국', '서울권', '학점 4',\n", - " '서울4년제', '건대', '인서울', '서울 중하위', '건동홍숙', 'sky', '연세대', '서울시립대학교',\n", - " '경기권', '동국대학교', '서울 중위권', '건국대학교', '수도권 4년제', '경북대', '컴퓨터공학',\n", - " '충북대학교', '한동대', '인서울 4년제', '지방국립대', '학점 4.0', '아주대 석사', '서울 4년제',\n", - " '컴퓨터공학과', '서울중위권', '이화여대', '서울하위권', '수도권 사립 4년제', '지방사립', '전자',\n", - " '전북대', '숙명여대', '고대 대학원', '수도권4년제', '지방사립대', '지방4년제사립대', '중경',\n", - " '서울과기대', '가천대학교', '경기대학교', '고려대', '아주대학교', '서울권4년제', '경기', '서울 하위',\n", - " '수도권 4년', '경희대', '지방 국립대', '5공', '중경외', '경북대학교', '서울중상위', '지방 사립',\n", - " '중상위 여대', '광운대', '동건홍', '성균관대학교', '수도권 사립대', '한양대 ERICA', '단국대',\n", - " '부산대', '지방거점국립대', '지거대', '동아대학교', '서울 중상위', '수도권 중위권 대학',\n", - " '한국항공대학교', '전남도립대', '명지대', '창원대', '성균관대', '한양대학교 ERICA', '전남대',\n", - " '충북대', '서울 4년제 대학', '부경대학교', '한국폴리텍대학 대구캠퍼스', '항공대', '국립대',\n", - " '단국대(천안)', '부산대학교', '경기권 대학교', '명지대학교', '금오공대(학력무관)', '동아대', '경기대',\n", - " '대전과기대', '지방 사립대', '배재대', '충남대', '국숭단', '연세대학교', '한국항공대', '계명대',\n", - " '서울 중위', '부경대', '전문대', '미네소타주립대학교', '한양 에리카', '울산대학교', '서울시립대',\n", - " '한서삼', '고려대학교(세종)', '전문대졸', '교통대', '울산대', '서울 전문대졸', '서울대학교',\n", - " '서울대학ㄱ', '인하공전', '영남대학교', '금오공과대학교', '한국산업기술대', '전북대학교', '기계공학',\n", - " '서울 상위권', '수도권 소재', '서울', 'University of Technology,sydney',\n", - " '서울중위', '재료', '지방 과기원', '인서울 상위권', '경상대', '한경대학교', '인서울 하위권',\n", - " '국숭광명', '인하', '서강대학교', '경희대학교', '중상위', '경희', '화학공학', '지거국 공대',\n", - " '화학공학과', '중상위권', '지방국립', '한국기술교육대학교', '수도권 대학', '서울 중상위권 대학',\n", - " '거제대학교', '인턴 1회', '신소재공학과', '수도권 중위', '지방 국립', '인천소재',\n", - " '홍익대학교(서울캠퍼스)', '과학기술원', '서울 중하위권', '인서울4년제', '충남대학교', '서울상위권',\n", - " '한양대학교에리카', '항공대학교', '기계', '성균관', '수도권 하위', '울산 4년제', '연고대', '동국',\n", - " '지방거점 국립대', '수도권 사립', '지방 4년제', '수도권 중하위', '단국대학교', '경기 4년제',\n", - " '경기원 4년제', '건국', '전자전기', '지방k', '충남대햑교', '서울소재 4년', '인서울 중위',\n", - " '기계공학부', '지방', '수도권 공대', '서울소재 대학', '서울 중위권대', '대학교 In 부산',\n", - " '지방거주 사립대', '한국산업기술대학교', '서울과학기술대', '서상한', '지방국립대 4년제', '서강대',\n", - " '서울권 공대', '전남', '지방전문대', '중위권', '지방사립대학교', '경기 K대', '유기응용',\n", - " '지방거점사립대', '수도권 지방대', '경상대학교', '중경시', '경인지역 국립대', '서울4년', '폴리텍대학',\n", - " '고분자공학', '수도권 전문대', '국립부경대학교', '유니스트', '한국과학기술원', '강원대', '산기대',\n", - " '한국공학대', '서울대', '가천대', '인제대학교', '한국공대', '서카포', '오산대학교', '강원대학교',\n", - " '학점은행 전문대', '한성대', '영산대'], dtype=object)" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['university'].unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "1a721d56", - "metadata": {}, - "outputs": [], - "source": [ - "univ_mapping = {\n", - " \"가천대\": \"가천대학교\", \"가천 대\": \"가천대학교\", \"가천대학교\": \"가천대학교\",\n", - " \"홍익대\": \"홍익대학교\", \"홍익대학교(서울캠퍼스)\": \"홍익대학교\",\n", - " \"중앙대\": \"중앙대학교\", \"중앙\": \"중앙대학교\",\n", - " \"한양대\": \"한양대학교\", \"한양대학교 ERICA\": \"한양대학교 에리카\",\n", - " \"한양 에리카\": \"한양대학교 에리카\", \"한양대 에리카\": \"한양대학교 에리카\",\n", - " \"건국대\": \"건국대학교\", \"건국\": \"건국대학교\",\n", - " \"경희대\": \"경희대학교\", \"서강대\": \"서강대학교\", \"서강대학교\": \"서강대학교\",\n", - " \"동국대\": \"동국대학교\", \"숙명여대\": \"숙명여자대학교\", \"이화여대\": \"이화여자대학교\",\n", - " \"서울대\": \"서울대학교\", \"서울대학교\": \"서울대학교\", \"고려대\": \"고려대학교\",\n", - " \"연세대\": \"연세대학교\", \"부경대\": \"부경대학교\", \"전북대\": \"전북대학교\",\n", - " \"충남대\": \"충남대학교\", \"충북대\": \"충북대학교\", \"경북대\": \"경북대학교\",\n", - " \"경상대\": \"경상대학교\", \"인하대\": \"인하대학교\", \"숭실대\": \"숭실대학교\",\n", - " \"광운대\": \"광운대학교\", \"영남대\": \"영남대학교\", \"금오공대\": \"금오공과대학교\",\n", - " \"동아대\": \"동아대학교\", \"명지대\": \"명지대학교\", \"아주대\": \"아주대학교\",\n", - " \"단국대\": \"단국대학교\", \"단국대(천안)\": \"단국대학교\", \"한동대\": \"한동대학교\",\n", - " \"성균관대\": \"성균관대학교\", \"성균관 대학교\": \"성균관대학교\",\n", - " \"경기대\": \"경기대학교\", \"한국항공대\": \"한국항공대학교\", \"항공대\": \"한국항공대학교\",\n", - " \"인천대\": \"인천대학교\", \"국민대\": \"국민대학교\", \"국민대학교\": \"국민대학교\",\n", - " \"숭실대학교\": \"숭실대학교\", \"숙명여자대학교\": \"숙명여자대학교\", \"이화여자대학교\": \"이화여자대학교\",\n", - " \"광운대학교\": \"광운대학교\", \"서울시립대\": \"서울시립대학교\", \"서울시립대학교\": \"서울시립대학교\",\n", - " \"서울과학기술대학교\": \"서울과학기술대학교\", \"서울과기대\": \"서울과학기술대학교\",\n", - " \"한국공학대\": \"한국공학대학교\", \"한국공대\": \"한국공학대학교\",\n", - " \"한국산업기술대\": \"한국산업기술대학교\", \"한국산업기술대학교\": \"한국산업기술대학교\",\n", - " \"유니스트\": \"울산과학기술원\", \"건홍동\": \"건동홍\",\n", - "\"동건홍\": \"건동홍\",\n", - "\"건대\": \"건국대학교\",\n", - "\"건국대\": \"건국대학교\",\n", - "\"국숭세단라인\": \"국숭세단\",\n", - "\"국숭광명\": \"국숭세단\",\n", - "\"국숭단\": \"국숭세단\",\n", - "\"서연고\": \"서성한\",\n", - "\"중앙\": \"중앙대학교\",\n", - "\"중,경,외,시\": \"중경외시\",\n", - "\"중경\": \"중경외시\",\n", - "\"중경시\": \"중경외시\",\n", - "\"서울대학ㄱ\": \"서울대학교\",\n", - "\"서울시립대\": \"서울시립대학교\",\n", - "\"서울과기대\": \"서울과학기술대학교\",\n", - "\"한양대\": \"한양대학교\",\n", - "\"한양대학교 에리카\": \"한양대학교 ERICA\",\n", - "\"한양 에리카\": \"한양대학교 ERICA\",\n", - "'한양대학교에리카': \"한양대학교 ERICA\",\n", - "\"한양대 에리카\": \"한양대학교 ERICA\",\n", - "\"광운대\": \"광운대학교\",\n", - "\"성균관대\": \"성균관대학교\",\n", - "\"경희대\": \"경희대학교\",\n", - "\"연세대\": \"연세대학교\",\n", - "\"고려대\": \"고려대학교\",\n", - "\"인하대\": \"인하대학교\",\n", - "\"숙명여대\": \"숙명여자대학교\",\n", - "\"이화여대\": \"이화여자대학교\",\n", - "\"가천대\": \"가천대학교\",\n", - "\"홍익대\": \"홍익대학교\",\n", - "\"중앙대\": \"중앙대학교\",\n", - "\"한동대\": \"한동대학교\",\n", - "\"금오공대\": \"금오공과대학교\",\n", - "\"동국대\": \"동국대학교\",\n", - "\"명지대\": \"명지대학교\",\n", - "\"아주대\": \"아주대학교\",\n", - "\"단국대\": \"단국대학교\",\n", - "\"단국대(천안)\": \"단국대학교\",\n", - "\"부경대\": \"부경대학교\",\n", - "\"부산대\": \"부산대학교\",\n", - "\"전북대\": \"전북대학교\",\n", - "\"전남대\": \"전남대학교\",\n", - "\"충남대\": \"충남대학교\",\n", - "\"충북대\": \"충북대학교\",\n", - "\"경북대\": \"경북대학교\",\n", - "\"경상대\": \"경상대학교\",\n", - "\"영남대\": \"영남대학교\",\n", - "\"동아대\": \"동아대학교\",\n", - "\"강원대\": \"강원대학교\",\n", - "\"산기대\": \"한국산업기술대학교\",\n", - "\"한국산업기술대\": \"한국산업기술대학교\",\n", - "\"한성대\": \"한성대학교\",\n", - "\"한성대학교\": \"한성대학교\",\n", - "\"한밭대\": \"한밭대학교\",\n", - "\"한밭대학교\": \"한밭대학교\",\n", - "\"창원대\": \"창원대학교\",\n", - "\"영산대\": \"영산대학교\",\n", - " \"건동홍\": \"건국·동국·홍익\",\n", - "\"건동홍숙\": \"건국·동국·홍익\",\n", - "\"국숭세단\": \"국민·숭실·세종·단국\",\n", - "\"서성한\": \"서강·성균관·한양\",\n", - "\"서상한\": \"서강·상명·한성\",\n", - "\"중경외시\": \"중앙·경희·외대·시립\",\n", - "\"중경외\": \"중앙·경희·외대·시립\",\n", - "\"지거국\": \"지방거점국립대\",\n", - "\"지거국 공대\": \"지방거점국립대\",\n", - "'지방거점 국립대': \"지방거점국립대\",\n", - "\"지방 국립\": \"지방거점국립대\",\n", - "\"지방국립\": \"지방거점국립대\",\n", - "\"지거대\": \"지방거점국립대\",\n", - "\"서울4년제\": \"서울 4년제\",\n", - "\"서울 4년제 대학\": \"서울 4년제\",\n", - "\"서울4년\": \"서울 4년제\",\n", - "\"서울소재 4년\": \"서울 4년제\",\n", - "\"서울권4년제\": \"서울 4년제\",\n", - "\"수도권4년제\": \"수도권 4년제\",\n", - "\"수도권 4년\": \"수도권 4년제\",\n", - "\"수도권 중위권 대학\": \"수도권 4년제\",\n", - "\"지방4년제\": \"지방 4년제\",\n", - "\"지방 4년제\": \"지방 4년제\",\n", - "\"지방4년제사립대\": \"지방 4년제\",\n", - "\"지방사립대\": \"지방 사립대\",\n", - "\"지방사립대학교\": \"지방 사립대\",\n", - "\"지방 사립\": \"지방 사립대\",\n", - "\"수도권 사립\": \"수도권 사립대\",\n", - "\"수도권 사립 4년제\": \"수도권 사립대\",\n", - "\"서울권\": \"서울\",\n", - "\"서울소재 대학\": \"서울\",\n", - "\"서울중위권\": \"서울 중위권\",\n", - "\"서울중상위\": \"서울 중상위\",\n", - "\"서울상위권\": \"서울 상위\",\n", - "\"서울하위권\": \"서울 하위\",\n", - "\"서울 중상위권 대학\": \"서울 중상위\",\n", - "\"서울 중위권대\": \"서울 중위권\",\n", - "\"sky\": \"SKY\",\n", - "\"서카포\": \"KAIST·포스텍·UNIST\",\n", - "\"유니스트\": \"KAIST·포스텍·UNIST\",\n", - "\"과기원\": \"KAIST·포스텍·UNIST\",\n", - "\"한국과학기술원\": \"KAIST·포스텍·UNIST\",\n", - "\"포항공과대학교\": \"KAIST·포스텍·UNIST\",\n", - " \"SKY\": \"SKY\",\n", - "\"서울 상위\": \"서울 상위\",\n", - "\"서울 상위권\": \"서울 상위\",\n", - "\"서울 중상위권\": \"서울 중상위\",\n", - "\"서울중상위\": \"서울 중상위\",\n", - "\"서울 중상위\": \"서울 중상위\",\n", - "\"서울 중하위권\": \"서울 중하위\",\n", - "\"서울 중하위\": \"서울 중하위\",\n", - "\"서울 중위권\": \"서울 중위\",\n", - "\"서울중위\": \"서울 중위\",\n", - "\"서울 중위\": \"서울 중위\",\n", - "\"서울 하위권\": \"서울 하위\",\n", - "\"서울 하위\": \"서울 하위\",\n", - "\"서울\": \"서울 기타\",\n", - "'서울과학기술대': \"서울과학기술대학교\",\n", - "\"수도권\": \"수도권 기타\",\n", - "\"수도권 소재\": \"수도권 기타\",\n", - "\"수도권 4년제\": \"수도권 4년제\",\n", - "\"수도권 중위\": \"수도권 4년제\",\n", - "\"수도권 중하위\": \"수도권 4년제\",\n", - "\"수도권 하위\": \"수도권 4년제\",\n", - "\"경기권\": \"경기권 대학\",\n", - "\"경기\": \"경기권 대학\",\n", - "\"경기 4년제\": \"경기권 대학\",\n", - "\"경기원 4년제\": \"경기권 대학\",\n", - "'경인지역 국립대': \"경기권 대학\",\n", - "\"인서울\": \"서울 4년제\",\n", - "'서울권 공대': \"서울 4년제\",\n", - "\"인서울4년제\": \"서울 4년제\",\n", - "\"인서울 4년제\": \"서울 4년제\",\n", - "\"인서울 상위권\": \"서울 4년제\",\n", - "\"인서울 하위권\": \"서울 4년제\",\n", - "\"인서울 중위\": \"서울 4년제\",\n", - "\"서울 4년제\": \"서울 4년제\",\n", - "\"수도권 전문대\":\"수도권 2년제\",\n", - "\"지방사립\": \"지방 사립대\",\n", - "\"지방k\": \"지방 기타\",\n", - "\"지방\": \"지방 기타\",\n", - "\"지방 과기원\": \"지방 기타\",\n", - "\"전남\": \"지방 기타\",\n", - "\"전남도립대\": \"지방 기타\",\n", - "'대학교 In 부산': '부산 4년제',\n", - "\"울산 4년제\":\"지방 기타\",\n", - "\"중상위\": \"기타 그룹대\",\n", - "\"중상위권\": \"기타 그룹대\",\n", - "\"중위권\": \"기타 그룹대\",\n", - "\"유기응용\": \"정보 없음\",\n", - "\"고분자공학\": \"정보 없음\",\n", - "\"전자\": \"정보 없음\",\n", - "\"전자전기\": \"정보 없음\",\n", - "\"기계\": \"정보 없음\",\n", - "\"기계공학\": \"정보 없음\", \"기계공학부\": \"정보 없음\",\n", - "\"화학공학\": \"정보 없음\",\n", - "\"화학공학과\": \"정보 없음\",\n", - "\"신소재공학과\": \"정보 없음\",\n", - "\"재료\": \"정보 없음\",\n", - "\"컴퓨터공학\": \"정보 없음\",\n", - "\"컴퓨터공학과\": \"정보 없음\",\n", - "\"화학과\": \"정보 없음\",\n", - "\"공학\": \"정보 없음\",\n", - "\n", - "\"성균관\": \"성균관대학교\",\n", - "\"경희\": \"경희대학교\",\n", - "\"인하\": \"인하대학교\",\n", - "\"동국\": \"동국대학교\",\n", - "\"과학기술원\": \"KAIST·포스텍·UNIST\",\n", - "\"고졸\": \"고졸\",\n", - "\"외국\": \"기타 해외대\",\n", - "\"광명상가\": \"광운·명지·상명·가톨릭\",\n", - "\"학점 4\": \"정보 없음\",\n", - "\"학점 4.0\": \"정보 없음\",\n", - "\"5공\": \"정보 없음\",\n", - "\"인턴 1회\": \"정보 없음\",\n", - "\"인가경\": \"인천·가천·경기\",\n", - "\"한서삼\": \"한서·서경·삼육\",\n", - "\"인하공전\": \"인하공전\",\n", - "\"인천소재\": \"인천소재\",\n", - "\"선문대\": \"선문대학교\",\n", - " \"선문대학교\": \"선문대학교\",\n", - " \"한밭대\": \"한밭대학교\", \"한밭대학교\": \"한밭대학교\",\n", - " \"충북대학\": \"충북대학교\", \"충북대학교\": \"충북대학교\",\n", - " \"충남대학\": \"충남대학교\", \"충남대학교\": \"충남대학교\",\n", - " \"전남대학\": \"전남대학교\", \"전남대학교\": \"전남대학교\",\n", - " \"전북대학\": \"전북대학교\", \"전북대학교\": \"전북대학교\",\n", - " \"경상대학\": \"경상대학교\", \"경상대학교\": \"경상대학교\",\n", - " \"경북대학\": \"경북대학교\", \"경북대학교\": \"경북대학교\",\n", - " \"부산대학\": \"부산대학교\", \"부산대학교\": \"부산대학교\",\n", - " '서성한' : \"서강·성균관·한양\",\n", - " '건동홍' : \"건국·동국·홍익\",\n", - " '국숭세단' : \"국민·숭실·세종·단국\",\n", - " '광운대학교, 광운대 대학원': \"광운대학교 석사\",\n", - " '중경외시': \"중앙·경희·외대·시립\",\n", - " '중경외': \"중앙·경희·외대·시립\",\n", - " '인서울 S대': \"서울 4년제\",\n", - " '서울': '서울 4년제',\n", - " '고대 대학원': \"고려대학교 석사\",\n", - " '연세대 대학원': \"연세대학교 석사\",\n", - " '창원대': \"창원대학교\", \"창원대학교\": \"창원대학교\",\n", - " \"한밭대학교\": \"한밭대학교\", \"한밭대\": \"한밭대학교\",\n", - " '배재대':'배재대학교','계명대':'계명대학교',\n", - " '울산대':'울산대학교','충남대':'충남대학교',\n", - " '충북대':'충북대학교','전남대':'전남대학교',\n", - " '충냠대햑교':'충남대학교',\n", - " '충남대햑교':'충남대학교',\n", - " 'S대':'기타','신라대':'\"신라대학교','Carnegie Mellon University':'기타 해외대',\n", - " '조선대':'조선대학교','금오공대(학력무관)':'금오공과대학교','대전과기대':'대전과학기술대학교','교통대':'한국교통대학교',\n", - " 'University of Technology,sydney':'기타 해외대','연고대':'연세대학교·고려대학교','경기 K대':'수도권 4년제',\n", - " '수도권 공대':'수도권 4년제', '전문대': '2년제 대학',\n", - " '전문대학': '2년제 대학', '전문대학 졸업': '2년제 대학', '전문대졸': '2년제 대학','서울 전문대졸': '서울 2년제',\n", - " '서울 전문대': '서울 2년제', '서울 전문대학': '서울 2년제', '아주대 석사':'아주대학교 석사'}\n", - "\n", - "\n", - "def unify_univ(name):\n", - " if pd.isna(name):\n", - " return \"정보 없음\"\n", - " name = name.strip()\n", - "\n", - " visited = set()\n", - " while name in univ_mapping and name not in visited:\n", - " visited.add(name)\n", - " name = univ_mapping[name]\n", - "\n", - " if \"대\" in name or \"학교\" in name or \"University\" in name:\n", - " return name\n", - " return \"기타\"" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "e5d3a3fe", - "metadata": {}, - "outputs": [], - "source": [ - "df['university'] = df['university'].apply(unify_univ)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "id": "fcd9746c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['덕성여대', '중앙대학교', '홍익대학교', '선문대학교', '기타', '한양대학교', '동국대학교',\n", - " '기타 해외대', '고려대학교', '인천대학교', '가톨릭대학교', '상명대학교', '국민대학교',\n", - " '대진전자통신고등학교', '한국공학대학교', '지방대', '가톨릭대', '숭실대학교', '중앙·경희·외대·시립',\n", - " '인하대학교', '금오공과대학교', '한양대학교 ERICA', '지방거점국립대', '영남대학교', '건국대학교',\n", - " '한국외대', '한남대학교', '\"신라대학교', '해외대', '광운대학교 석사', '광운대학교', '지방거점대',\n", - " '정보 없음', '세종대학교', '공주대학교', '성균관대학교', '조선대학교', '단국대학교 일반대학원',\n", - " '아주대학교', '서울과학기술대학교', '연세대학교', '서울시립대학교', '경기권 대학', '경북대학교',\n", - " '충북대학교', '한동대학교', '지방국립대', '아주대학교 석사', '이화여자대학교', '수도권 사립대',\n", - " '지방 사립대', '전북대학교', '숙명여자대학교', '고려대학교 석사', '가천대학교', '경기대학교',\n", - " '경희대학교', '지방 국립대', '중상위 여대', '한양대 ERICA', '단국대학교', '부산대학교',\n", - " '동아대학교', '한국항공대학교', '명지대학교', '창원대학교', '전남대학교', '부경대학교',\n", - " '한국폴리텍대학 대구캠퍼스', '국립대', '경기권 대학교', '대전과학기술대학교', '배재대학교', '충남대학교',\n", - " '계명대학교', '2년제 대학', '미네소타주립대학교', '울산대학교', '고려대학교(세종)', '한국교통대학교',\n", - " '서울대학교', '한국산업기술대학교', '경상대학교', '한경대학교', '서강대학교', '기타 그룹대',\n", - " '한국기술교육대학교', '수도권 대학', '거제대학교', '항공대학교', '연세대학교·고려대학교', '지방거주 사립대',\n", - " '지방국립대 4년제', '지방전문대', '지방거점사립대', '수도권 지방대', '폴리텍대학', '국립부경대학교',\n", - " '강원대학교', '인제대학교', '오산대학교', '학점은행 전문대', '한성대학교', '영산대학교'],\n", - " dtype=object)" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['university'].unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "3baead25", - "metadata": {}, - "outputs": [], - "source": [ - "# applicants 테이블에 들어갈 컬럼만 선택\n", - "applicants_cols = [\n", - " 'company', 'detail_job', 'job_title', 'apply_term', 'university',\n", - " 'major', 'gpa', 'gpa_scale', 'toeic', 'opic', 'toeic_speaking',\n", - " 'work_experience', 'job_category', 'other_certifications'\n", - "]\n", - "\n", - "# id 추가 (자동 증가처럼 동작하도록)\n", - "applicants_df = df[applicants_cols].copy()\n", - "applicants_df.insert(0, 'id', range(1, len(applicants_df) + 1))" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "3f9a3018", - "metadata": {}, - "outputs": [], - "source": [ - "certification_rows = []\n", - "\n", - "for idx, row in df.iterrows():\n", - " if pd.notna(row['other_certifications']):\n", - " certs = [c.strip() for c in row['other_certifications'].split(',')]\n", - " for cert in certs:\n", - " # '기타: ' 제거\n", - " cert_clean = cert.replace('기타:', '').strip()\n", - " certification_rows.append({\n", - " 'applicant_id': idx + 1, # applicants_df의 id와 매핑\n", - " 'certification_name': cert_clean\n", - " })\n", - "\n", - "certifications_df = pd.DataFrame(certification_rows)\n", - "certifications_df.insert(0, 'id', range(1, len(certifications_df) + 1))" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "d95033ea", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "📌 Applicants 테이블\n", - " id company detail_job job_title apply_term university major \\\n", - "0 1 대한항공 IT 일반 NaN 2025 상반기 덕성여대 컴퓨터공학전공 \n", - "1 2 현대자동차 정보보안 / 보안엔지니어 NaN 2024 하반기 중앙대학교 산업보안학과 \n", - "2 3 삼성증권 IT 일반 NaN 2024 하반기 홍익대학교 컴퓨터공학과 \n", - "3 4 IBK 기업은행 IT 일반 NaN 2024 하반기 홍익대학교 컴퓨터공학과 \n", - "4 5 캐논코리아 주식회사 IT운영 / 시스템 NaN 2024 하반기 선문대학교 주:정보통신공학과 \n", - "\n", - " gpa gpa_scale toeic opic toeic_speaking \\\n", - "0 3.96 NaN NaN NaN 150 \n", - "1 4.06 NaN NaN IM1 NaN \n", - "2 3.77 4.5 865.0 IH NaN \n", - "3 3.77 4.5 865.0 IH NaN \n", - "4 4.39 4.5 NaN NaN 110 \n", - "\n", - " work_experience job_category \\\n", - "0 인턴 IT/인터넷 \n", - "1 보안 관련 대기업 인턴 6개월 1회, 1개월 1회, 프리랜서 활동 1회 IT/인터넷 \n", - "2 NaN IT/인터넷 \n", - "3 NaN IT/인터넷 \n", - "4 NaN IT/인터넷 \n", - "\n", - " other_certifications \n", - "0 정보처리기사(필기) \n", - "1 취약점 경진대회 수상 3회, 개발 관련 대외활동 2회, 보안 관련 장기 교육 2회 \n", - "2 한국사검정시험: 고급, 컴퓨터활용능력: 2급, 기타: ADSP,SQLD,MOS MA... \n", - "3 한국사검정시험: 고급, 컴퓨터활용능력: 2급, 기타: SQLD,ADSP,MOS MA... \n", - "4 교내수상 : SW 알고리즘 경진대회 대상,금상, 기타: 정보처리기사,CCNA,리눅스... \n", - "📌 Certifications 테이블\n", - " id applicant_id certification_name\n", - "0 1 1 정보처리기사(필기)\n", - "1 2 2 취약점 경진대회 수상 3회\n", - "2 3 2 개발 관련 대외활동 2회\n", - "3 4 2 보안 관련 장기 교육 2회\n", - "4 5 3 한국사검정시험: 고급\n" - ] - } - ], - "source": [ - "print(\"📌 Applicants 테이블\")\n", - "print(applicants_df.head())\n", - "\n", - "print(\"📌 Certifications 테이블\")\n", - "print(certifications_df.head())" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "f0753a77", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "569" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# DB 연결\n", - "DATABASE_URL = \"postgresql+psycopg2://postgres:NYeDWzlUbxoLhlyNwrjnQzWvMPXHnrQZ@metro.proxy.rlwy.net:43060/railway\"\n", - "engine = create_engine(DATABASE_URL)\n", - "\n", - "\n", - "applicants_df.to_sql('applicants', engine, if_exists='append', index=False)\n", - "certifications_df.to_sql('certifications', engine, if_exists='append', index=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "23491c91", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "hoenv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/backend/crawling/linkareer_processed.csv b/backend/crawling/linkareer_processed.csv deleted file mode 100644 index ee477c3e9..000000000 --- a/backend/crawling/linkareer_processed.csv +++ /dev/null @@ -1,272 +0,0 @@ -company_name,company_type,main_job,detail_job,location,qualification,process -플랜핏,중소기업,IT/인터넷,,,"- IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분 -- 사용자와 대화에 두려움이 없으며 사용자 관점에서 생각하며 사용자에게 관심이 많은 분 -- 데이터를 통해 문제를 파악하고 데이터를 측정하여 해당 데이터에 기반한 논리적인 의사 결정을 내릴 수 있는 분 -- 다양한 분야의 이해관계자(팀원 및 외부인)와 효율적인 커뮤니케이션이 가능한 분","[인재 영입 프로세스] -- 서류 전형 -> 1차 직무 인터뷰 -> 2차 컬쳐핏 인터뷰 -> 최종 합격" -리얼드로우,중소기업,,SW Engineer,서울 마포구,- 하단 상세 공고 참조,"[전형 안내] -서류전형 - 면접전형 - 최종합격 - -*이메일 접수: people@realdraw.ai -(이력서, 포트폴리오)" -주식회사 화이트큐브,스타트업,,콘텐츠 디자이너 인턴,서울 강남구,"그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자인이 가능하신 분 -비즈니스 성장을 위한 다양한 프로젝트 기획 및 디자인 가능하신 분 -디자인 결과물의 성과 데이터를 함께 확인하고 개선하여 ’비즈니스 성과’를 달성하고 싶은 분 -ex) 상품 소개서 개선을 통한 B2B 계약 전환율 상승, 광고 소재 효율 테스트 등","[전형 안내] -서류전형 - 면접전형 - 최종합격" -주식회사 화이트큐브,스타트업,,백엔드 개발자 인턴,서울 강남구,"• Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분 -• HTTP, HTML, JSON 등 웹 기본 구조에 대한 이해가 있으신 분 -• 사용자 경험과 고객 가치를 최우선으로 하여 개발을 통해 비즈니스 성장에 기여하고 싶은 열망이 있는 분 -• 진짜 ‘성공’을 만들고자 하는 열망이 강한 분. -• 이 업무를 왜 해야 하는지를 항상 고민하며, 해당 이유를 근거로 팀원들을 설득할 수 있는 분 -• 컴퓨터공학 전공 혹은 이에 준하는 지식 및 활용 역량이 있으신 분","[전형 안내] -서류전형 - 면접전형 - 최종합격" -놀유니버스,중견기업,,브랜드 마케팅 지원 담당자,경기 성남시 수정구,"브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분 -디지털 콘텐츠 트렌드에 민감하고, 다양한 브랜드 활동을 관찰하는 걸 좋아하는 분 -꼼꼼하게 문서와 숫자를 다루며, 정확하게 검토하는 업무에 자신 있는 분 -기본적인 오피스 툴(특히 Excel 또는 Google 스프레드시트) 사용이 가능한 분 -팀과의 커뮤니케이션을 중요하게 생각하며, 협업을 긍정적으로 대하는 분","[전형 안내] -서류전형 - 면접전형 - 최종합격" -진에어,대기업,,,서울 강서구,, -이앤에스글로벌,중견기업,,,서울 강남구,, -CJ푸드빌,대기업,,데이터 전략·분석 전문가,서울 중구,"- 4년제 학사 졸 이상 -- 관련 학과 : 컴퓨터공학, 산업공학, 경영정보, 문헌정보 등 -- Data 분석 역량 및 관련 프로젝트 경력 3년 이상 -- 다양한 Data 분석 Tool 활용 경험 (Python, SQL 등) -- ‘Data’ 기반으로 객관적인 현상 인식과 '분석적 사고'를 통해 솔루션을 도출하는 역량 -- 현장 업무에 대한 이해를 위한 현업과의 협업 역량 -- Data 분석을 위한 Data Engineer 등 관련 전문가들과의 협업 역량","[전형 안내] -서류전형 - 면접전형 - 최종합격" -CJ푸드빌,대기업,,디지털서비스 APP 개발자,서울 중구,"- 4년제 대학 졸업자 이상 -- 컴퓨터공학, 산업공학, 소프트웨어공학 등 관련학과 -- React Native 및 Flutter 개발 경험 (최소 5년 이상) 💻 -- App 설계부터 배포, 서비스 운영까지의 경험이 있으신 분 -- 자기 주도적인 개발과 전체 프로세스를 고려한 설계와 구현이 가능 하신 분","[전형 안내] -서류전형 - 면접전형 - 최종합격" -삼성전자,대기업,,[VD사업부] Product Partnership,경기 수원시 영통구,, -코레일네트웍스,공공기관/공기업,,일반직6급,"서울 용산구, 서울 구로구, 인천 연수구, 경기 과천시, 부산 동래구",하단 상세 공고 참조,"[전형 안내] -서류전형 - 인적성검사 - 필기전형 - 면접전형 - 최종합격" -주식회사 놀유니버스,중견기업,,,경기 성남시 수정구,, -한미그룹,대기업,,[한미약품] Medical,서울 송파구,, -국가정보원,공공기관/공기업,,해외정보,서울 강남구,하단 상세 공고 참조,"[전형 안내] -서류전형 - 면접전형 - 최종합격" -NHN Cloud,중견기업,,,경기 성남시 분당구,, -NHN Cloud,중견기업,,,경기 성남시 분당구,, -NHN Cloud,중견기업,,,경기 성남시 분당구,, -EY한영,외국계기업,,,서울 영등포구,, -Toss,중소기업,"IT/인터넷, 마케팅/광고/홍보, 영업/고객상담, 서비스",,,, -SNOW,대기업,,남미 타겟 EPIK 콘텐츠 마케팅 체험형 인턴,경기 성남시 분당구,, -근로복지공단,공공기관/공기업,,,"울산 중구, 부산 금정구, 대구 중구, 인천 남동구, 강원특별자치도 원주시",, -새만금개발공사,공공기관/공기업,,토지공급,전북특별자치도 군산시,하단 상세 공고 참조,"[전형 안내] -서류전형 - 면접전형 - 최종합격" -해태제과식품,중견기업,,,"충남 아산시, 광주 북구, 경기 양주시, 서울 용산구",, -NHN서비스,중견기업,,,경기 성남시 분당구,"- 초대졸 이상(졸업예정자 포함) -- 서비스앱(혹은웹)에 대한 경험이 많고 이해도가 높은 분 -- 모바일게임에 대한 경험이 많고 이해도가 높은 분", -펄어비스,중견기업,,검은사막 PC 중국 운영 담당자,경기 과천시,"원어민 수준의 중국어 사용이 가능하신 분 -하나의 게임을 오랜 시간 플레이한 경험이 있거나, PC MMORPG에 대한 이해도가 있으신 분 -실시간으로 변화하는 라이브 서비스 환경 흐름에 맞춰 협업하실 수 있는 분 -유저를 최우선으로 생각하는 서비스 마인드와 책임감 있는 직업의식을 갖추신 분 -원만한 커뮤니케이션 능력을 보유하신 분 -업무에 대한 적극성을 갖고 새로운 배움에 주저함이 없으신 분 -해외 출장 결격 사유 없으신 분","[전형 안내] -서류전형 - 필기전형 - 면접전형 - 최종합격" -네이버웹툰,대기업,,퍼포먼스 마케팅 크리에이티브,경기 성남시 분당구,"- 영어 네이티브 또는 해당 수준의 언어 능력을 갖추신 분 -- Adobe Premiere와 After Effects를 능숙하게 다루며 숏폼 영상 제작 경험이 있으신 분 -- 웹툰을 좋아하고, 엔터테인먼트 콘텐츠(영화, 드라마, 게임 등)에 관심이 많으신 분 -- 영미권 국가의 MZ 콘텐츠 트렌드를 잘 캐치하시는 분","[전형 안내] -서류전형 - 면접전형 - 최종합격" -더존비즈온,중견기업,,,강원특별자치도 춘천시,"- HTML, CSS, JavaScript React, DOM 기본 이해도 보유자 -- 컴퓨터공학 또는 소프트웨어 등 관련학과 전공자 -- 관련 업무, 프로젝트 경험 보유자","[전형절차] -- 서류전형 > 1차 실무자면접 > 2차 임원면접 > 경력/평판조회 > 처우협의/채용검진 > 최종합격" -주식회사 누리미디어,중소기업,IT/인터넷,,,, -MBC,중견기업,,,서울 마포구,, -CJ ENM,대기업,,,서울 마포구,, -CJ ENM,대기업,,,서울 마포구,, -CJ ENM,대기업,,,서울 마포구,, -MBC,중견기업,,,서울 마포구,, -타라티피에스,중견기업,,국내사업본부_수주 영업,"서울 마포구, 경기 파주시","- 2025년 7월 입사 가능자 -- 남성의 경우 병역필 또는 면제자 -- 해외 출장에 결격사유 없는 자","[전형 안내] -서류전형 - 면접전형 - 최종합격" -AXA손해보험,금융권,,코어개발팀 자동차보험 시스템 개발자,서울 용산구,- 정규 4년제 대학교 졸업자 또는 졸업 예정자, -세정아이앤씨,중소기업,,IT인프라 운영,부산 금정구,"- 대졸 및 2025년 졸업예정자 -- 이공계 전공 -- H/W 장비에 대한 깊은 관심도","[전형 안내] -서류전형 - 면접전형 - 최종합격" -네이버클라우드,대기업,,,경기 성남시 분당구,, -일동제약,중견기업,,,"서울 서초구, 경기 화성시, 경기 안성시",, -디스트릭트코리아,중소기업,,웹기획/운영,서울 강남구,"- 미디어아트와 디지털 디자인에 관심이 있는 분 -- Figma 사용이 가능하신 분 -- 포토샵, 애프터이펙트, 프리미어, 일러스트레이터 활용이 가능하신 분 -- HTML 및 DNS등의 웹사이트 개발 관련 지식과 활용이 가능하신 분 -- 해외 출장에 결격사유가 없는 분","[전형 안내] -서류전형 - 면접전형 - 최종합격" -SK C&C USA INC,대기업,해외,,,, -라인플러스,대기업,,,경기 성남시 분당구,- 2025년 8월 이내 학사 이상의 학위 취득 예정 또는 경력 2년 미만의 기졸업자, -교보문고,대기업,,,서울 마포구,"• 대졸학력 소지자 -• 대내외 원활한 커뮤니케이션 능력 보유자 -• 능동적이며, 적극적인 사고방식 소유자 -• 웹/모바일 서비스에 대한 지식 보유 -• PostgreSQL 등 RDBMS 관련 지식 보유 -• JAVA 개발 능력, Spring Framework 및 CI/CD에 대한 지식 보유자 -• HTML, CSS, Javascript, JQuery 관련 지식 보유자 - - -● 전형절차 및 일정 -• 서류전형→면접전형→건강검진→최종합격", -진학사,중소기업,,,서울 종로구,, -토스인슈어런스,중소기업,,,서울 강남구,"- React, TypeScript 기반으로 안정적인 서비스를 개발할 수 있는 분을 찾고 있어요. -- 주어진 디자인 시안을 바탕으로 스스로 문제를 정의하고 빠르게 구현해낼 수 있는 분이면 좋아요. -- 단순히 주어진 개발을 해내는 것보다, 주도적으로 문제를 발견하고 분석해 솔루션을 제안할 수 있는 분이 필요해요. -- 레거시 코드를 최신의 개발 환경에 맞게 개선한 경험이나, 잘 모르던 기술 스택을 빠르게 학습해서 개발해나간 경험이 있으신 분이면 좋아요. - -[이력서 작성 추천] -- 그동안의 경험을 단순 나열하는 것이 아닌, 경험 속에서의 임팩트 및 러닝 포인트를 기술해주세요. -- 고객의 보이스를 기반으로 빠르게 제품의 완성도를 높여가기 때문에, 주어진 문제를 스스로 해결해보려고 시도하는지 보고 있어요. -- 복잡도가 높은 서비스나 까다로운 요구사항을 구현한 경험이 있으면 기술해주세요. 특히 복잡하거나 반복되는 문제를 단순한 형태로 추상화한 경험을 설명해주시면 좋아요. -- 기존 소스 코드를 새로운 코드 베이스로 점진적으로 이관한 경험이 있으면 기술해주세요.", -토즈코리아,외국계기업,,E-Commerce Intern,서울 강남구,, -포티투닷,중소기업,,,경기 성남시 수정구,"-오디오 신호 처리 및 전처리 알고리즘 설계 경험 (AGC, AEC, NR 등) --음성 인식 및 신호 분리 관련 경험 또는 이해 --MATLAB, Python, C/C++ 등 신호 처리 및 알고리즘 구현 언어 숙련도 --DSP 관련 개발 경험 및 디버깅 능력 --양산 프로젝트에서 일정 관리 및 요구사항 분석 경험 --팀 내 협업 및 외부 파트너와의 커뮤니케이션 능력 --차량용 오디오 시스템 개발 경험 (또는 유사 도메인 경험) --다중 마이크 환경에서의 음향 기술 연구 또는 적용 경험", -샘표식품,중견기업,,,"서울 중구, 경기 이천시, 충북 영동군, 충북 청주시 흥덕구",, -LG CNS,대기업,,,서울 강서구,, -노르마,중소기업,,QPU 설계,서울 성동구,"- 3학년 이상 재학 중인 학생/대학원생 -- 연관 분야 전공", -SFA반도체,중견기업,,,충남 천안시 서북구,"- 서류전형 > 1차면접 > 2차면접 > 최종합격 - -[접수기간] -- 2025.4.25 ~ 2025.5.6", -PTKOREA,외국계기업,,글로벌 콘텐츠 제작 디자이너 인턴,서울 강남구,"- 전문학사 이상이신 분 (기졸업자, 졸업 예정자, 휴학생) -- Adobe Photoshop, Illustrator, XD, Figma, Premiere 활용이 가능하신 분 -- 그래픽 디자인 및 디자인 디테일 작업 능력이 뛰어나신 분 -- 포트폴리오 제출이 가능하신 분(필수)","[전형 안내] -서류전형 - 면접전형 - 최종합격" -슈어소프트테크,중소기업,,,"경기 성남시 수정구, 대전 유성구",, -orskorea,외국계기업,,,경기 부천시 원미구,, -슈프리마,중소기업,,,경기 성남시 분당구,"- 컴퓨터 공학, 전자공학 또는 관련 분야의 학사 이상 학위를 보유하고 계시며, C/C++ 언어에 대한 깊은 이해와 실무 경험을 갖추신 분 -- 라이브러리 개발 및 API 설계 능력: 동적 라이브러리(dll, so) 개발 경험과 함께, 표준 인터페이스 설계 및 API 문서화를 통해 모듈화된 소프트웨어 구현 경험이 있으신 분 -- 학력 : 학사 이상", -지멘스,외국계기업,,,서울 종로구,, -효림그룹,중견기업,,XE_품질보증팀,"서울 강남구, 대구 달서구, 경북 경산시, 경남 창원시 성산구, 경북 경산시",, -PTKOREA,외국계기업,,글로벌 이러닝 플랫폼 운영관리 서포트 인턴,서울 강남구,"- 학사 이상이신 분 (기졸업자, 졸업 예정자, 휴학생) -- Excel 활용 우수자 -- 영어 커뮤니케이션이 가능하신 분 -- Web/App 플랫폼에 대한 이해도가 있으신 분","[전형 안내] -서류전형 - 면접전형 - 최종합격" -바비톡,중소기업,IT/인터넷,콘텐츠 마케터 체험형 인턴,,"영상 편집 프로그램 사용 능숙자면 좋아요. -Adobe 계열 Premiere Pro, After Effects 등 / 전문 영상 편집 프로그램이 아닌 캡컷 등 영상 제작 어플리케이션 서비스 활용한 영상 제작 스킬도 가능해요. -이미지 제작 능숙자여야해요. -포토샵 및 그 외 프로그램 활용해요. -오프라인 촬영이 가능해야해요. -촬영용품 대여, 촬영 진행 서포트 등 필요해요.","[전형 안내] -서류전형 - 면접전형 - 최종합격" -(사)이에스지노동사회협회,비영리단체/협회/재단,IT/인터넷,,,, -스카이랩스,스타트업,,HW 개발,경기 성남시 분당구,"대학 재학 또는 졸업자, 공학계열(전기/전자/컴퓨터/소프트웨어) -신입 가능","[전형 안내] -서류전형 - 면접전형 - 최종합격" -카카오페이,대기업,"경영/사무, IT/인터넷",카카오페이 보험 운영,,"엑셀을 능숙하게 사용하시는 분을 원해요. -SQL을 활용한 데이터 추출 및 가공을 할 수 있는 분을 원해요. -성실하고 꼼꼼한 분을 원해요.","[전형 안내] -서류 접수 > 면접전형 > 최종 합격" -한국자산관리공사,공공기관/공기업,,,"부산 남구, 강원특별자치도 강릉시, 대전 서구, 광주 서구, 서울 강남구",, -마야크루,스타트업,,,서울 마포구,, -플레이디,중소기업,,,경기 성남시 분당구,, -JYP엔터테인먼트,중소기업,,CTO Staff,서울 강동구,"- 컴퓨터 공학 계열 또는 관련 분야 전공자, 혹은 이에 준하는 경력 보유 -- 최신 기술을 활용해 비즈니스 문제를 해결한 경험 -- 전략적 사고력과 논리적인 문제 해결 능력, 데이터 기반 의사결정 역량 보유 -- 팀 중심 환경에서 효과적으로 협업할 수 있는 커뮤니케이션 능력","[전형 안내] -서류 접수 > 면접전형 > 최종 합격" -비바리퍼블리카,스타트업,IT/인터넷,"Data Assistant (SQL, Tableau)",,"실무 sql을 활용해보신분이 필요해요. -복잡한 추출 요청도 고급 sql 능력을 통해 빠르게 추출해 내실 수 있는 분이 필요해요. -꼼꼼하게 데이터 정합성을 확인 하실 수 있는 분이 필요해요. -Tableau를 능숙하게 활용하실 수 있는 분이 필요해요 -다른 직군의 팀원들과 원활하게 소통할 수 있는 능력이 필요해요.","[전형 안내] -서류 접수 > 사전 과제 > 직무 인터뷰 > 최종 합격" -네이버웹툰,대기업,,- 숏폼 콘텐츠 기획/제작,경기 성남시 분당구,"- 웹툰을 좋아하고, 웹툰 콘텐츠와 웹툰 서비스에 대한 이해가 풍부하신 분 -- 인스타그램, 유튜브, 틱톡의 숏폼 콘텐츠 및 이용자에 대해 이해도가 높으신 분 -- 영상 콘텐츠 제작 경험이 있고, 영상 프로그램 활용에 어려움이 없으신 분", -한국도로교통공단,공공기관/공기업,,정보보호,"서울 서초구, 강원특별자치도 강릉시, 제주특별자치도 제주시, 울산 남구, 전북특별자치도 전주시 완산구",하단 상세 공고 참조,"[전형 안내] -서류전형 > 필기전형 > 면접전형 > 최종합격" -펄어비스,중견기업,,게임플레이,경기 과천시,"졸업자, 졸업예정자", -한국보건의료정보원,공공기관/공기업,,기간제근로자_육휴대체_행정,"서울 중구, 서울 중구, 충북 청주시 흥덕구",하단 상세 공고 참조,"[전형 안내] -서류전형 - 면접전형 - 최종합격" -대구경북첨단의료산업진흥재단,비영리단체/협회/재단,,가.연구직[직속 및 전략기획본부],대구 동구,하단 상세 공고 참조,"[전형 안내] -서류전형 - 필기시험 - 면접전형 - 최종합격" -(주)힐링페이퍼,스타트업,,,서울 강남구,, -주식회사 어썸스쿨,중소기업,,,서울 영등포구,, -현대글로비스,대기업,,,"서울 성동구, 울산 남구, 충남 당진시, 충남 아산시, 경기 화성시",, -IBK기업은행,금융권,,,서울 중구,, -쿠팡,중소기업,,,서울 송파구,- 커뮤니케이션 능력, -토스페이먼츠,스타트업,,Product Designer [Tools],서울 강남구,"사용자가 원하는 제품이 될 때까지 VOC 수집, UX 설계, UI 디자인, Prototype을 통해 개선할 수 있는 역량이 필요해요. -내가 원하는 것이 아닌 사용자의 정성 혹은 정량적인 근거로 문제를 정의한 경험이 필요해요. -우선순위를 고려하여 목표를 설계하고 그 달성 여부를 정성 혹은 정량적으로 끝까지 분석하고 고민한 경험이 필요해요. -Web UI에 대한 이해도가 있는 분이 필요해요. -사용자의 비효율적인 업무 원인을 주도적으로 파악하고 효율적으로 개선하여, 업무 리소스를 단축시킨 경험이 있으면 좋아요. -궁극의 고객 경험을 달성하기 위해 논리적인 커뮤니케이션으로 구성원을 설득하고 협업한 경험이 있으면 좋아요.","[전형 안내] -서류접수 > 직무 인터뷰 > 문화적합성 인터뷰 > 레퍼런스 체크 > 처우협의 > 최종합격 및 입사" -한국지식재산보호원,비영리단체/협회/재단,,채용형 청년인턴,서울 강남구,하단 상세 공고 참조,"[전형 안내] -서류전형 - 필기전형 - 면접전형 - 최종입사" -한국세라믹기술원,비영리단체/협회/재단,,반도체 소재센터,"경영/사무, 연구개발/설계, IT/인터넷","∘ 연령이 만 34세 이하인 자 -∘ 기술원 「인사 규정」 제7조(결격사유)에 해당하지 않는 자", -한국석유공사,공공기관/공기업,,,울산 중구,, -토스뱅크,중소기업,,,서울 강남구,"- Hadoop Ecosystem 환경 기반의 Python, Pyspark 프로그래밍에 능숙하신 분이 필요해요. -- Spark 같은 분산처리 엔지니어링을 활용해 대용량 데이터 처리를 해보신 분이 필요해요. -- Data Mesh/Medallion Architecture를 이해하고 데이터 모델링을 해오신 분이 필요해요. -- 분산 처리 기반 query engine의 동작 원리를 이해하고 튜닝이 가능하신 분이 필요해요. -- ETL 프로세스와 airflow orchestration 최적화를 통해 배치작업의 효율화를 경험해보신 분이 필요해요. -- 단순요청을 처리하는 것이 아닌 명확한 데이터 구조와 효율적인 데이터 활용 관점에서 기준을 제시할 수 있어야 해요. -- 다양한 이해관계자와 소통하여 데이터 요구사항을 구체화하고 정리하는 역량이 있어야 해요. - -[합류 여정] -- 서류접수 > 직무 인터뷰 > 문화적합성 인터뷰 > 레퍼런스 체크 > 처우협의 > 최종합격 및 입사", -LG전자,대기업,,HS사업본부,"서울 영등포구, 경남 창원시 성산구, 경기 평택시",, -카카오,대기업,,,경기 성남시 분당구,, -한전KDN,공공기관/공기업,,,"경영/사무, 건설, 연구개발/설계, IT/인터넷",, -효성,대기업,,R&D_HVDC 시스템 설계/계통해석,경기 안양시 동안구,"학사/석사 학위를 취득하였거나, '25년 8월 졸업예정이신 분","[전형 안내] -서류전형 - 인적성 - 면접전형 - 최종합격" -효성ITX,대기업,,영업_IT솔루션 판매/제안,"서울 영등포구, 경기 평택시","학사/석사 학위를 취득하였거나, '25년 8월 졸업예정이신 분","[전형 안내] -서류전형 - 인적성 - 면접전형 - 최종합격" -에고이즘,중소기업,,AI Creative Specialist,서울 성동구,"생성형 AI 도구(Midjourney, DALL·E, Runway, GPT 등) 사용 경험 -각, 분석, 자동화 등 한 가지 이상 업무에서 AI를 활용한 시도 경험 -툴을 빠르게 익히고, 업무에 바로 적용할 수 있는 실행력 높으신 분 -집협업 디자이너와 유연한 커뮤니케이션 능력 -어떤 역할이든 ‘브랜드를 돋보이게 하는 것’에 관심이 있는 분","[전형 안내] -서류전형 - 면접전형 - 최종합격" -서울에너지공사,공공기관/공기업,,일반직7급(행정),"서울 양천구, 서울 노원구, 서울 강서구",하단 상세 공고 참조,"[전형 안내] -서류전형 - 필기전형 - 면접전형 - 최종합격" -독립기념관,공공기관/공기업,,사무직7급,충남 천안시 동남구,"연령, 성별 제한 없음 (※ 임용일 기준 만 60세 미만인 자에 한함)", -주식회사 인터엑스,스타트업,,,서울 금천구,, -주식회사 인터엑스,스타트업,,,울산 중구,, -주식회사 코드잇,스타트업,,,서울 중구,, -주식회사 인터엑스,스타트업,,,서울 금천구,, -신한은행,금융권,,IB,서울 중구,"해외대 석·박사 학위 보유자 (2025년 8월 이내 학위 취득 예정자 포함) -대한민국 남성의 경우, 군필자 또는 군면제자(군 복무중인 경우 2025년 7월 1일 이전 전역 가능한 자) -외국인의 경우 한국 내 취업에 결격사유가 없는 자 -해외여행에 결격사유가 없는 자 및 당행 내규상 채용에 결격사유가 없는 자","[전형 안내] -서류전형 - 면접전형 - 최종합격" -SK ON,대기업,,,대전 유성구,, -한국하니웰,중견기업,,,서울 마포구,, -스타쉽엔터테인먼트,대기업,,,서울 강남구,"- 학력 : 초대졸 이상 -- 경력 : 무관(신입/경력) -- 엔터테인먼트 및 문화 사업에 관심이 많은 분 -- 맡은 일에 대한 관심과 열정, 책임감이 있으신 분", -경신,대기업,,채용연계형 인턴-영업-원가,"인천 연수구, 인천 연수구, 경기 화성시, 전북특별자치도 군산시, 경기 의왕시",, -앳홈,중소기업,"경영/사무, 마케팅/광고/홍보, IT/인터넷",인플루언서 커머스 AMD,,"유튜브, 인스타그램 등 콘텐츠 플랫폼을 자주 보고, 트렌드에 관심 많은 분 -인플루언서, 뷰티, 라이브 커머스에 흥미 있는 분 -오퍼레이션 업무를 체계적이고 꼼꼼하게 챙길 수 있는 분 -엑셀, 구글스프레드시트 등 기본 툴을 다룰 수 있는 분 -일을 맡았을 때 끝까지 책임감 있게 마무리할 수 있는 분","[전형 안내] -서류전형 - 면접전형 - 최종합격" -현대오토에버,대기업,,-디지털 경험-,"서울 강남구, 울산 북구, 경기 화성시, 충남 아산시, 경기 의왕시","최종학력 4년제 대졸 이상 -남성의 경우 군필 또는 면제자 -해외여행 결격사유가 없는 자 -당사 채용결격사유에 해당되지 않는 자","[전형 안내] -ACT - 과제테스트/코딩테스트 - 1차 면접전형 - 2차 면접전형 - 채용검진 - 최종합격" diff --git a/backend/crawling/selenium_basic/app.py b/backend/crawling/selenium_basic/app.py deleted file mode 100644 index 000847917..000000000 --- a/backend/crawling/selenium_basic/app.py +++ /dev/null @@ -1,19 +0,0 @@ -import time -from selenium import webdriver -from selenium.webdriver.common.by import By -import chromedriver_autoinstaller - -chromedriver_autoinstaller.install() - -driver = webdriver.Chrome() -# 1. 드라이버.get() 메서드를 사용하여 웹 페이지를 연다. -driver.get("https://www.naver.com") -time.sleep(3) - -# 2. 웹 페이지가 열리면, 웹 페이지의 요소를 찾기 위해 find_element() 메서드를 사용한다. -css_selector = "#shortcutArea > ul > li:nth-child(8) > a > span.service_name" -group_navigation = driver.find_element(By.CSS_SELECTOR, css_selector) - -print(group_navigation.text) -group_navigation.click() -input() \ No newline at end of file diff --git a/backend/crawling/selenium_basic/selenium_tools.py b/backend/crawling/selenium_basic/selenium_tools.py deleted file mode 100644 index 620b52e59..000000000 --- a/backend/crawling/selenium_basic/selenium_tools.py +++ /dev/null @@ -1,65 +0,0 @@ -import time -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webrdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC - -import chromedriver_autoinstaller - -chromedriver_autoinstaller.install() - -driver = webdriver.Chrome() -driver.get("https://www.naver.com") - -# # 1. Navigation (웹 페이지 이동) 관련 툴 -# # get, back, forward, refresh 메서드를 사용하여 웹 페이지를 이동하는 방법을 알아보자. - -# # 1-1. get() 원하는 페이지로 이동하는 함수 -# driver.get("https://www.naver.com") -# time.sleep(1) -# driver.get("https://www.google.com") - -# # 1-2. back() 이전 페이지로 이동하는 함수 -# driver.back() -# time.sleep(2) - -# # 1-3. forward() 다음 페이지로 이동하는 함수 -# driver.forward() -# time.sleep(2) - -# # 1-4. refresh() 현재 페이지를 새로고침하는 함수 -# driver.refresh() -# time.sleep(2) -# print("동작 끝") -# input() - -# # 2.browser information -# # 2-1. title ~ 웹 사이트의 제목을 가져오는 함수 -# title = driver.title -# print("제목:", title) -# # 2-2. current_url ~ 현재 웹 페이지의 URL을 가져오는 함수 -# current_url = driver.current_url -# print("현재 URL:", current_url) - -# if "nid.naver.com" in current_url: -# print("지금은 로그인 하는 로직이 필요함") -# else: -# print("네이버 로그인 페이지가 아닙니다.") - - -# 3. Driver Wait (드라이버 대기) -# 3-1. 3초 때 로딩이 끝나서, element가 찾아짐. -# 3-2. 30초 까지는 기다리겠음. -# 3-3. 30초가 넘어가면 에러던짐 - -try: - selector = "#shortcutArea > ul > li:nth-child(8) > a > span.service_name" - WebDriverWait(driver, 30).until(EC.presence_of_element_located( - By.CSS_SELECTOR, selector - )) -except: - print("예외 발생, 예외 처리 코드 실행하기") -print("엘리먼트 로딩 끝") -print("다음 코드 실행") - -input() \ No newline at end of file diff --git a/backend/crawling/succesful_applicants_specs.ipynb b/backend/crawling/succesful_applicants_specs.ipynb deleted file mode 100644 index 812414a00..000000000 --- a/backend/crawling/succesful_applicants_specs.ipynb +++ /dev/null @@ -1,1498 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "09be93c8", - "metadata": {}, - "source": [ - "## 합격자 스펙 크롤링" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "47af1f91", - "metadata": {}, - "outputs": [], - "source": [ - "from selenium import webdriver\n", - "from selenium.webdriver.common.by import By\n", - "from selenium.webdriver.chrome.options import Options\n", - "import pandas as pd\n", - "import time\n", - "import re" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "f09377e5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "카드 개수: 20\n", - "카드 1 URL: https://linkareer.com/cover-letter/34416?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 2 URL: https://linkareer.com/cover-letter/34317?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 3 URL: https://linkareer.com/cover-letter/34229?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 4 URL: https://linkareer.com/cover-letter/34165?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 5 URL: https://linkareer.com/cover-letter/34193?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 6 URL: https://linkareer.com/cover-letter/34025?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 7 URL: https://linkareer.com/cover-letter/33993?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 8 URL: https://linkareer.com/cover-letter/33975?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 9 URL: https://linkareer.com/cover-letter/33936?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 10 URL: https://linkareer.com/cover-letter/33881?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 11 URL: https://linkareer.com/cover-letter/33988?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 12 URL: https://linkareer.com/cover-letter/34345?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 13 URL: https://linkareer.com/cover-letter/33943?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 14 URL: https://linkareer.com/cover-letter/33959?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 15 URL: https://linkareer.com/cover-letter/33887?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 16 URL: https://linkareer.com/cover-letter/33754?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 17 URL: https://linkareer.com/cover-letter/33735?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 18 URL: https://linkareer.com/cover-letter/33733?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 19 URL: https://linkareer.com/cover-letter/33719?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "카드 20 URL: https://linkareer.com/cover-letter/33708?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "\n", - "=== 카드 1 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자DS / 5급 제조직 / 2024 하반기\n", - "스펙: 고졸 / 회계 / 학점 X / 사회생활 경험: 중소기업 사무직 1년 4개월 / 한국사검정시험: 고급, 컴퓨터활용능력: 2급, 기타: 전산회계1,2급/itq 한글,엑셀 A/erp 회계,인사 2급/운전면허 2종\n", - "\n", - "=== 카드 2 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자DS / 패키지개발 / 2024 하반기\n", - "스펙: 중앙대 / 기계공학부 / 학점 4.2 / 오픽: AL / 사회생활 경험: 인턴 / 삼성전자 인턴 / 한국사검정시험: 고급, 기타: 자동차운전면허 2종보통\n", - "\n", - "=== 카드 3 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자서비스 / 경영지원직 / 2024 하반기\n", - "스펙: 인하대 / 산업경영공학, 통계학 / 학점 3.93 / 토익: 725, 오픽: IM2 / AI활용 공모전 수상 2회 / 기타: ADsP\n", - "\n", - "=== 카드 4 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문_혁신센터_SW개발 / 2024 하반기\n", - "스펙: 건동홍 / 융합소프트웨어 / 학점 4.09/4.5 / 토익: 855, 토익스피킹: 140/IH / 사회생활 경험: 중소기업 8개월 / 특허, 네이버부스트캠프, 데이터청년캠퍼스 / 한국사검정시험: 중급, 컴퓨터활용능력: 1급, 기타: 정보처리기사, ADsP, SQLD\n", - "\n", - "=== 카드 5 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문_메모리사업부_반도체공정기술 / 2024 하반기\n", - "스펙: 성균관대학교 / 나노공학과 / 학점 3.84/4.13 / 토익: 880, 오픽: IH / 사회생활 경험: 삼성전자DS 장기현장실습, 삼성전자DS 하계인턴 / SK hynix 청년 hypo 수료, 학과 학술대회 우수상\n", - "\n", - "=== 카드 6 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DX부문 SCSA / 2024 하반기\n", - "스펙: 지거국 / 불어불문학/경영학 / 학점 3.67/4.5 / 토익스피킹: 150 / 마케팅 대형공모전 2회, 기타 마케팅 공모전 다수 / 컴퓨터활용능력: 2급, 기타: SQLD, GAIQ\n", - "\n", - "=== 카드 7 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / 파운드리 사업부 / 2024 하반기\n", - "스펙: 지방사립대 / 산업경영공학 / 학점 4.35 / 토익스피킹: 150 / IH / 사회생활 경험: 차량 제조기업 인턴3개월 / 경진대회 3회 수상(최우수/우수/장려) / 기타: 운전면허 보통1종\n", - "\n", - "=== 카드 8 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / 삼성전자DS 글로벌 제조&인프라총괄 – 인프라기술(Gas/Chemical) / 2024 하반기\n", - "스펙: 한양대학교 ERICA / 기계공학과 / 학점 3.87/4.5 / 오픽: IH\n", - "\n", - "=== 카드 9 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DA사업부_SCM/물류 / 2024 하반기\n", - "스펙: 중앙대 / 국제물류학 / 학점 4.29/4.5 / 오픽: IH / 사회생활 경험: 인턴 3회 / 한국사검정시험: 고급,기타: 물류관리사국제무역사 1급유통관리사 2급무역역어 1급\n", - "\n", - "=== 카드 10 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / Test&System Package총괄_평가및분석 / 2024 하반기\n", - "스펙: 단국대(천안) / 신소재공학과 / 학점 3.71 / 토익스피킹: 130/IM3 / 사회생활 경험: 자동차 부품사 / 품질관리 / 1년6개월 / 반도체 공정실습 5일 (2회 진행) / 컴퓨터활용능력: , 기타: 산업안전기사, 정보처리기능사\n", - "\n", - "=== 카드 11 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS 부문 System LSI사업부_SW개발 / 2024 하반기\n", - "스펙: 지거국 / 전자공학부 / 학점 3.91 / IM2 / 학부연구생 6개월\n", - "\n", - "=== 카드 12 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / 인프라기술 / 2024 하반기\n", - "스펙: 한양대학교 ERICA / 기계공학과 / 학점 3.87 / 오픽 : IH\n", - "\n", - "=== 카드 13 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS 부문 메모리사업부 영업마케팅 / 2024 하반기\n", - "스펙: 연세대 / 불문, 경영 / 학점 4.1/4.3 / 오픽 AL, 토익 915, DELF B2 / 컴활 1급, GTQ 포토샵 & 일러스트 1급, 한능검 1급\n", - "\n", - "=== 카드 14 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DX 부문_MX 사업부 해외영업 / 2024 하반기\n", - "스펙: 가천대 / 영미어문/글로벌경영 / 학점 3.5 / 오픽 al\n", - "\n", - "=== 카드 15 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문_메모리사업부 회로설계 / 2024 상반기\n", - "스펙: 경희대 / 전자공학 / 학점 4.09/4.5 / 오픽: IH\n", - "\n", - "=== 카드 16 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DX부문_생산기술연구소 기구개발 / 2024 상반기\n", - "스펙: 인가경 / 기계공학과 / 학점 4.19/4.5 / 오픽: IM1 / 학부연구생, 학회 구두 발표 / 컴퓨터활용능력: 1급, 기타: 일반기계기사\n", - "\n", - "=== 카드 17 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문 메모리사업부_반도체공정기술 / 2024 상반기\n", - "스펙: 지거국 / X / 학점 3.73/4.5 / 오픽: IH / 사회생활 경험: 포스코 인턴 1개월, 한국재료연구원 현장실습 2개월 / 반도체 관련 학부연구생 6개월, 포스코 스틸브릿지 인턴 1개월, 한국재료연구원 현장실습 2개월, 전공 무관 공모전 우수상 1개, 학회 우수 포스터 발표상 수상, 중앙동아리 창립 맴버\n", - "\n", - "=== 카드 18 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문 CTO-반도체연구소_반도체공정기술 / 2024 상반기\n", - "스펙: 인서울 / 화학공학과 / 학점 3.8/4.5 / 토익: 820, 오픽: IM2\n", - "\n", - "=== 카드 19 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DX부문 DA사업부 SW개발 / 2024 상반기\n", - "스펙: 연세대 / 인공지능학 / 학점 4.09 / 오픽: IL / 사회생활 경험: 인턴 경험 6개월, 경력 1년 10개월 / Samsung-card Data Competition 3등상, CLOVA AI RUSH 2021 2위, CLOVA AI RUSH 2022 3위 / 기타: 정보처리기사\n", - "\n", - "=== 카드 20 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / SW개발 / 2024 상반기\n", - "스펙: 수도권 4년제 / 컴퓨터공학과 / 학점 4.1/4.5 / 오픽: im / sw마에스트로\n", - "\n", - "✅ CSV 저장 완료!\n" - ] - } - ], - "source": [ - "from selenium import webdriver\n", - "from selenium.webdriver.common.by import By\n", - "from selenium.webdriver.chrome.options import Options\n", - "import pandas as pd\n", - "import time\n", - "\n", - "chrome_options = Options()\n", - "chrome_options.add_argument(\"--start-maximized\")\n", - "driver = webdriver.Chrome(options=chrome_options)\n", - "\n", - "start_url = \"https://linkareer.com/cover-letter/34416?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\"\n", - "driver.get(start_url)\n", - "\n", - "time.sleep(2)\n", - "\n", - "data = []\n", - "\n", - "# 카드 a 태그 리스트 가져오기\n", - "cards = driver.find_elements(By.XPATH, '//*[@id=\"__next\"]/div[1]/div[4]/div/div[2]/div/div[1]/div/div[2]/div[1]/div/a')\n", - "print(f\"카드 개수: {len(cards)}\")\n", - "\n", - "# 각 카드의 href 추출\n", - "card_urls = []\n", - "for idx, card in enumerate(cards, start=1):\n", - " url = card.get_attribute(\"href\")\n", - " print(f\"카드 {idx} URL: {url}\")\n", - " card_urls.append(url)\n", - "\n", - "# 각 url 접속하여 정보 추출\n", - "for idx, url in enumerate(card_urls, start=1):\n", - " driver.get(url)\n", - " time.sleep(2)\n", - "\n", - " try:\n", - " # ✅ 상세페이지 전용 xpath로 추출\n", - " company_info = driver.find_element(By.XPATH, '//*[@id=\"__next\"]/div[1]/div[4]/div/div[2]/div/div[2]/div[1]/div/div/h1').text\n", - " spec_elements = driver.find_elements(By.XPATH, '//*[@id=\"__next\"]/div[1]/div[4]/div/div[2]/div/div[2]/div[1]/div/div/h3')\n", - " spec_info = spec_elements[0].text if spec_elements else \"스펙 없음\"\n", - "\n", - " print(f\"\\n=== 카드 {idx} ===\")\n", - " print(\"합격 기업 / 직무 / 지원시기:\", company_info)\n", - " print(\"스펙:\", spec_info)\n", - "\n", - " data.append({\n", - " '합격 기업 / 직무 / 지원시기': company_info,\n", - " '스펙': spec_info\n", - " })\n", - "\n", - " except Exception as e:\n", - " print(f\"카드 {idx} 추출 중 오류: {e}\")\n", - "\n", - " # ✅ 리스트 페이지로 돌아가기\n", - " driver.get(start_url)\n", - " time.sleep(2)\n", - "\n", - "# CSV 저장\n", - "df = pd.DataFrame(data)\n", - "df.to_csv('successful_applicants_specs.csv', index=False, encoding='utf-8-sig')\n", - "print(\"\\n✅ CSV 저장 완료!\")\n", - "\n", - "driver.quit()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "0a951f74", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
합격 기업 / 직무 / 지원시기스펙
0삼성전자DS / 5급 제조직 / 2024 하반기고졸 / 회계 / 학점 X / 사회생활 경험: 중소기업 사무직 1년 4개월 / 한국...
1삼성전자DS / 패키지개발 / 2024 하반기중앙대 / 기계공학부 / 학점 4.2 / 오픽: AL / 사회생활 경험: 인턴 / ...
2삼성전자서비스 / 경영지원직 / 2024 하반기인하대 / 산업경영공학, 통계학 / 학점 3.93 / 토익: 725, 오픽: IM2...
3삼성전자 / DS부문_혁신센터_SW개발 / 2024 하반기건동홍 / 융합소프트웨어 / 학점 4.09/4.5 / 토익: 855, 토익스피킹: ...
4삼성전자 / DS부문_메모리사업부_반도체공정기술 / 2024 하반기성균관대학교 / 나노공학과 / 학점 3.84/4.13 / 토익: 880, 오픽: I...
5삼성전자 / DX부문 SCSA / 2024 하반기지거국 / 불어불문학/경영학 / 학점 3.67/4.5 / 토익스피킹: 150 / 마...
6삼성전자 / 파운드리 사업부 / 2024 하반기지방사립대 / 산업경영공학 / 학점 4.35 / 토익스피킹: 150 / IH / 사...
7삼성전자 / 삼성전자DS 글로벌 제조&인프라총괄 – 인프라기술(Gas/Chemica...한양대학교 ERICA / 기계공학과 / 학점 3.87/4.5 / 오픽: IH
8삼성전자 / DA사업부_SCM/물류 / 2024 하반기중앙대 / 국제물류학 / 학점 4.29/4.5 / 오픽: IH / 사회생활 경험: ...
9삼성전자 / Test&System Package총괄_평가및분석 / 2024 하반기단국대(천안) / 신소재공학과 / 학점 3.71 / 토익스피킹: 130/IM3 / ...
10삼성전자 / DS 부문 System LSI사업부_SW개발 / 2024 하반기지거국 / 전자공학부 / 학점 3.91 / IM2 / 학부연구생 6개월
11삼성전자 / 인프라기술 / 2024 하반기한양대학교 ERICA / 기계공학과 / 학점 3.87 / 오픽 : IH
12삼성전자 / DS 부문 메모리사업부 영업마케팅 / 2024 하반기연세대 / 불문, 경영 / 학점 4.1/4.3 / 오픽 AL, 토익 915, DEL...
13삼성전자 / DX 부문_MX 사업부 해외영업 / 2024 하반기가천대 / 영미어문/글로벌경영 / 학점 3.5 / 오픽 al
14삼성전자 / DS부문_메모리사업부 회로설계 / 2024 상반기경희대 / 전자공학 / 학점 4.09/4.5 / 오픽: IH
15삼성전자 / DX부문_생산기술연구소 기구개발 / 2024 상반기인가경 / 기계공학과 / 학점 4.19/4.5 / 오픽: IM1 / 학부연구생, 학...
16삼성전자 / DS부문 메모리사업부_반도체공정기술 / 2024 상반기지거국 / X / 학점 3.73/4.5 / 오픽: IH / 사회생활 경험: 포스코 ...
17삼성전자 / DS부문 CTO-반도체연구소_반도체공정기술 / 2024 상반기인서울 / 화학공학과 / 학점 3.8/4.5 / 토익: 820, 오픽: IM2
18삼성전자 / DX부문 DA사업부 SW개발 / 2024 상반기연세대 / 인공지능학 / 학점 4.09 / 오픽: IL / 사회생활 경험: 인턴 경...
19삼성전자 / SW개발 / 2024 상반기수도권 4년제 / 컴퓨터공학과 / 학점 4.1/4.5 / 오픽: im / sw마에스트로
\n", - "
" - ], - "text/plain": [ - " 합격 기업 / 직무 / 지원시기 \\\n", - "0 삼성전자DS / 5급 제조직 / 2024 하반기 \n", - "1 삼성전자DS / 패키지개발 / 2024 하반기 \n", - "2 삼성전자서비스 / 경영지원직 / 2024 하반기 \n", - "3 삼성전자 / DS부문_혁신센터_SW개발 / 2024 하반기 \n", - "4 삼성전자 / DS부문_메모리사업부_반도체공정기술 / 2024 하반기 \n", - "5 삼성전자 / DX부문 SCSA / 2024 하반기 \n", - "6 삼성전자 / 파운드리 사업부 / 2024 하반기 \n", - "7 삼성전자 / 삼성전자DS 글로벌 제조&인프라총괄 – 인프라기술(Gas/Chemica... \n", - "8 삼성전자 / DA사업부_SCM/물류 / 2024 하반기 \n", - "9 삼성전자 / Test&System Package총괄_평가및분석 / 2024 하반기 \n", - "10 삼성전자 / DS 부문 System LSI사업부_SW개발 / 2024 하반기 \n", - "11 삼성전자 / 인프라기술 / 2024 하반기 \n", - "12 삼성전자 / DS 부문 메모리사업부 영업마케팅 / 2024 하반기 \n", - "13 삼성전자 / DX 부문_MX 사업부 해외영업 / 2024 하반기 \n", - "14 삼성전자 / DS부문_메모리사업부 회로설계 / 2024 상반기 \n", - "15 삼성전자 / DX부문_생산기술연구소 기구개발 / 2024 상반기 \n", - "16 삼성전자 / DS부문 메모리사업부_반도체공정기술 / 2024 상반기 \n", - "17 삼성전자 / DS부문 CTO-반도체연구소_반도체공정기술 / 2024 상반기 \n", - "18 삼성전자 / DX부문 DA사업부 SW개발 / 2024 상반기 \n", - "19 삼성전자 / SW개발 / 2024 상반기 \n", - "\n", - " 스펙 \n", - "0 고졸 / 회계 / 학점 X / 사회생활 경험: 중소기업 사무직 1년 4개월 / 한국... \n", - "1 중앙대 / 기계공학부 / 학점 4.2 / 오픽: AL / 사회생활 경험: 인턴 / ... \n", - "2 인하대 / 산업경영공학, 통계학 / 학점 3.93 / 토익: 725, 오픽: IM2... \n", - "3 건동홍 / 융합소프트웨어 / 학점 4.09/4.5 / 토익: 855, 토익스피킹: ... \n", - "4 성균관대학교 / 나노공학과 / 학점 3.84/4.13 / 토익: 880, 오픽: I... \n", - "5 지거국 / 불어불문학/경영학 / 학점 3.67/4.5 / 토익스피킹: 150 / 마... \n", - "6 지방사립대 / 산업경영공학 / 학점 4.35 / 토익스피킹: 150 / IH / 사... \n", - "7 한양대학교 ERICA / 기계공학과 / 학점 3.87/4.5 / 오픽: IH \n", - "8 중앙대 / 국제물류학 / 학점 4.29/4.5 / 오픽: IH / 사회생활 경험: ... \n", - "9 단국대(천안) / 신소재공학과 / 학점 3.71 / 토익스피킹: 130/IM3 / ... \n", - "10 지거국 / 전자공학부 / 학점 3.91 / IM2 / 학부연구생 6개월 \n", - "11 한양대학교 ERICA / 기계공학과 / 학점 3.87 / 오픽 : IH \n", - "12 연세대 / 불문, 경영 / 학점 4.1/4.3 / 오픽 AL, 토익 915, DEL... \n", - "13 가천대 / 영미어문/글로벌경영 / 학점 3.5 / 오픽 al \n", - "14 경희대 / 전자공학 / 학점 4.09/4.5 / 오픽: IH \n", - "15 인가경 / 기계공학과 / 학점 4.19/4.5 / 오픽: IM1 / 학부연구생, 학... \n", - "16 지거국 / X / 학점 3.73/4.5 / 오픽: IH / 사회생활 경험: 포스코 ... \n", - "17 인서울 / 화학공학과 / 학점 3.8/4.5 / 토익: 820, 오픽: IM2 \n", - "18 연세대 / 인공지능학 / 학점 4.09 / 오픽: IL / 사회생활 경험: 인턴 경... \n", - "19 수도권 4년제 / 컴퓨터공학과 / 학점 4.1/4.5 / 오픽: im / sw마에스트로 " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df" - ] - }, - { - "cell_type": "markdown", - "id": "9dfe68fc", - "metadata": {}, - "source": [ - "## 페이지네이션 추가" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8ce686db", - "metadata": {}, - "outputs": [], - "source": [ - "chrome_options = Options()\n", - "chrome_options.add_argument(\"--start-maximized\")\n", - "driver = webdriver.Chrome(options=chrome_options)\n", - "\n", - "base_url = \"https://linkareer.com/cover-letter/34416?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page={}&sort=PASSED_AT&tab=all\"\n", - "\n", - "page = 1\n", - "all_card_urls = []\n", - "\n", - "while True:\n", - " url = base_url.format(page)\n", - " driver.get(url)\n", - " time.sleep(2)\n", - "\n", - " # 페이지 카드 가져오기\n", - " cards = driver.find_elements(By.XPATH, '//*[@id=\"__next\"]/div[1]/div[4]/div/div[2]/div/div[1]/div/div[2]/div[1]/div/a')\n", - " if not cards:\n", - " print(f\"페이지 {page}: 카드 없음 → 종료\")\n", - " break\n", - "\n", - " print(f\"페이지 {page}: 카드 {len(cards)}개 발견\")\n", - " for idx, card in enumerate(cards, start=1):\n", - " href = card.get_attribute(\"href\")\n", - " print(f\" 카드 {idx}: {href}\")\n", - " all_card_urls.append(href)\n", - "\n", - " page += 1 # 다음 페이지로 이동\n", - "\n", - "print(f\"\\n총 {len(all_card_urls)}개의 URL 수집 완료!\")\n", - "\n", - "# ✅ 각 URL 접속하여 정보 추출\n", - "data = []\n", - "\n", - "for idx, url in enumerate(all_card_urls, start=1):\n", - " driver.get(url)\n", - " time.sleep(2)\n", - "\n", - " try:\n", - " company_info = driver.find_element(By.XPATH, '//*[@id=\"__next\"]/div[1]/div[4]/div/div[2]/div/div[2]/div[1]/div/div/h1').text\n", - " spec_elements = driver.find_elements(By.XPATH, '//*[@id=\"__next\"]/div[1]/div[4]/div/div[2]/div/div[2]/div[1]/div/div/h3')\n", - " spec_info = spec_elements[0].text if spec_elements else \"스펙 없음\"\n", - "\n", - " print(f\"\\n=== {idx}/{len(all_card_urls)} ===\")\n", - " print(\"합격 기업 / 직무 / 지원시기:\", company_info)\n", - " print(\"스펙:\", spec_info)\n", - "\n", - " data.append({\n", - " '합격 기업 / 직무 / 지원시기': company_info,\n", - " '스펙': spec_info\n", - " })\n", - "\n", - " except Exception as e:\n", - " print(f\"URL {idx} 추출 오류: {e}\")\n", - "\n", - "# ✅ CSV 저장\n", - "df = pd.DataFrame(data)\n", - "df.to_csv('successful_applicants_specs.csv', index=False, encoding='utf-8-sig')\n", - "print(\"\\n✅ CSV 저장 완료!\")\n", - "\n", - "driver.quit()" - ] - }, - { - "cell_type": "markdown", - "id": "654c6504", - "metadata": {}, - "source": [ - "## 페이지 수 제한 추가" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "0ffe1e9f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "페이지 1: 카드 20개 발견\n", - " 카드 1: https://linkareer.com/cover-letter/34416?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 2: https://linkareer.com/cover-letter/34317?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 3: https://linkareer.com/cover-letter/34229?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 4: https://linkareer.com/cover-letter/34165?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 5: https://linkareer.com/cover-letter/34193?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 6: https://linkareer.com/cover-letter/34025?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 7: https://linkareer.com/cover-letter/33993?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 8: https://linkareer.com/cover-letter/33975?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 9: https://linkareer.com/cover-letter/33936?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 10: https://linkareer.com/cover-letter/33881?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 11: https://linkareer.com/cover-letter/33988?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 12: https://linkareer.com/cover-letter/33959?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 13: https://linkareer.com/cover-letter/33943?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 14: https://linkareer.com/cover-letter/34345?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 15: https://linkareer.com/cover-letter/33887?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 16: https://linkareer.com/cover-letter/33754?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 17: https://linkareer.com/cover-letter/33735?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 18: https://linkareer.com/cover-letter/33733?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 19: https://linkareer.com/cover-letter/33719?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - " 카드 20: https://linkareer.com/cover-letter/33708?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=1&sort=PASSED_AT&tab=all\n", - "페이지 2: 카드 20개 발견\n", - " 카드 1: https://linkareer.com/cover-letter/33684?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 2: https://linkareer.com/cover-letter/33611?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 3: https://linkareer.com/cover-letter/30466?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 4: https://linkareer.com/cover-letter/34503?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 5: https://linkareer.com/cover-letter/34283?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 6: https://linkareer.com/cover-letter/33997?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 7: https://linkareer.com/cover-letter/34000?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 8: https://linkareer.com/cover-letter/33776?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 9: https://linkareer.com/cover-letter/33726?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 10: https://linkareer.com/cover-letter/33711?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 11: https://linkareer.com/cover-letter/33583?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 12: https://linkareer.com/cover-letter/33530?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 13: https://linkareer.com/cover-letter/33532?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 14: https://linkareer.com/cover-letter/33549?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 15: https://linkareer.com/cover-letter/33495?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 16: https://linkareer.com/cover-letter/33728?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 17: https://linkareer.com/cover-letter/33729?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 18: https://linkareer.com/cover-letter/33730?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 19: https://linkareer.com/cover-letter/33731?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - " 카드 20: https://linkareer.com/cover-letter/33715?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page=2&sort=PASSED_AT&tab=all\n", - "\n", - "총 40개의 URL 수집 완료!\n", - "\n", - "=== 1/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자DS / 5급 제조직 / 2024 하반기\n", - "스펙: 고졸 / 회계 / 학점 X / 사회생활 경험: 중소기업 사무직 1년 4개월 / 한국사검정시험: 고급, 컴퓨터활용능력: 2급, 기타: 전산회계1,2급/itq 한글,엑셀 A/erp 회계,인사 2급/운전면허 2종\n", - "\n", - "=== 2/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자DS / 패키지개발 / 2024 하반기\n", - "스펙: 중앙대 / 기계공학부 / 학점 4.2 / 오픽: AL / 사회생활 경험: 인턴 / 삼성전자 인턴 / 한국사검정시험: 고급, 기타: 자동차운전면허 2종보통\n", - "\n", - "=== 3/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자서비스 / 경영지원직 / 2024 하반기\n", - "스펙: 인하대 / 산업경영공학, 통계학 / 학점 3.93 / 토익: 725, 오픽: IM2 / AI활용 공모전 수상 2회 / 기타: ADsP\n", - "\n", - "=== 4/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문_혁신센터_SW개발 / 2024 하반기\n", - "스펙: 건동홍 / 융합소프트웨어 / 학점 4.09/4.5 / 토익: 855, 토익스피킹: 140/IH / 사회생활 경험: 중소기업 8개월 / 특허, 네이버부스트캠프, 데이터청년캠퍼스 / 한국사검정시험: 중급, 컴퓨터활용능력: 1급, 기타: 정보처리기사, ADsP, SQLD\n", - "\n", - "=== 5/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문_메모리사업부_반도체공정기술 / 2024 하반기\n", - "스펙: 성균관대학교 / 나노공학과 / 학점 3.84/4.13 / 토익: 880, 오픽: IH / 사회생활 경험: 삼성전자DS 장기현장실습, 삼성전자DS 하계인턴 / SK hynix 청년 hypo 수료, 학과 학술대회 우수상\n", - "\n", - "=== 6/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DX부문 SCSA / 2024 하반기\n", - "스펙: 지거국 / 불어불문학/경영학 / 학점 3.67/4.5 / 토익스피킹: 150 / 마케팅 대형공모전 2회, 기타 마케팅 공모전 다수 / 컴퓨터활용능력: 2급, 기타: SQLD, GAIQ\n", - "\n", - "=== 7/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / 파운드리 사업부 / 2024 하반기\n", - "스펙: 지방사립대 / 산업경영공학 / 학점 4.35 / 토익스피킹: 150 / IH / 사회생활 경험: 차량 제조기업 인턴3개월 / 경진대회 3회 수상(최우수/우수/장려) / 기타: 운전면허 보통1종\n", - "\n", - "=== 8/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / 삼성전자DS 글로벌 제조&인프라총괄 – 인프라기술(Gas/Chemical) / 2024 하반기\n", - "스펙: 한양대학교 ERICA / 기계공학과 / 학점 3.87/4.5 / 오픽: IH\n", - "\n", - "=== 9/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DA사업부_SCM/물류 / 2024 하반기\n", - "스펙: 중앙대 / 국제물류학 / 학점 4.29/4.5 / 오픽: IH / 사회생활 경험: 인턴 3회 / 한국사검정시험: 고급,기타: 물류관리사국제무역사 1급유통관리사 2급무역역어 1급\n", - "\n", - "=== 10/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / Test&System Package총괄_평가및분석 / 2024 하반기\n", - "스펙: 단국대(천안) / 신소재공학과 / 학점 3.71 / 토익스피킹: 130/IM3 / 사회생활 경험: 자동차 부품사 / 품질관리 / 1년6개월 / 반도체 공정실습 5일 (2회 진행) / 컴퓨터활용능력: , 기타: 산업안전기사, 정보처리기능사\n", - "\n", - "=== 11/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS 부문 System LSI사업부_SW개발 / 2024 하반기\n", - "스펙: 지거국 / 전자공학부 / 학점 3.91 / IM2 / 학부연구생 6개월\n", - "\n", - "=== 12/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DX 부문_MX 사업부 해외영업 / 2024 하반기\n", - "스펙: 가천대 / 영미어문/글로벌경영 / 학점 3.5 / 오픽 al\n", - "\n", - "=== 13/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS 부문 메모리사업부 영업마케팅 / 2024 하반기\n", - "스펙: 연세대 / 불문, 경영 / 학점 4.1/4.3 / 오픽 AL, 토익 915, DELF B2 / 컴활 1급, GTQ 포토샵 & 일러스트 1급, 한능검 1급\n", - "\n", - "=== 14/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / 인프라기술 / 2024 하반기\n", - "스펙: 한양대학교 ERICA / 기계공학과 / 학점 3.87 / 오픽 : IH\n", - "\n", - "=== 15/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문_메모리사업부 회로설계 / 2024 상반기\n", - "스펙: 경희대 / 전자공학 / 학점 4.09/4.5 / 오픽: IH\n", - "\n", - "=== 16/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DX부문_생산기술연구소 기구개발 / 2024 상반기\n", - "스펙: 인가경 / 기계공학과 / 학점 4.19/4.5 / 오픽: IM1 / 학부연구생, 학회 구두 발표 / 컴퓨터활용능력: 1급, 기타: 일반기계기사\n", - "\n", - "=== 17/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문 메모리사업부_반도체공정기술 / 2024 상반기\n", - "스펙: 지거국 / X / 학점 3.73/4.5 / 오픽: IH / 사회생활 경험: 포스코 인턴 1개월, 한국재료연구원 현장실습 2개월 / 반도체 관련 학부연구생 6개월, 포스코 스틸브릿지 인턴 1개월, 한국재료연구원 현장실습 2개월, 전공 무관 공모전 우수상 1개, 학회 우수 포스터 발표상 수상, 중앙동아리 창립 맴버\n", - "\n", - "=== 18/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문 CTO-반도체연구소_반도체공정기술 / 2024 상반기\n", - "스펙: 인서울 / 화학공학과 / 학점 3.8/4.5 / 토익: 820, 오픽: IM2\n", - "\n", - "=== 19/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DX부문 DA사업부 SW개발 / 2024 상반기\n", - "스펙: 연세대 / 인공지능학 / 학점 4.09 / 오픽: IL / 사회생활 경험: 인턴 경험 6개월, 경력 1년 10개월 / Samsung-card Data Competition 3등상, CLOVA AI RUSH 2021 2위, CLOVA AI RUSH 2022 3위 / 기타: 정보처리기사\n", - "\n", - "=== 20/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / SW개발 / 2024 상반기\n", - "스펙: 수도권 4년제 / 컴퓨터공학과 / 학점 4.1/4.5 / 오픽: im / sw마에스트로\n", - "\n", - "=== 21/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / 평가 및 분석 / 2024 상반기\n", - "스펙: 중경외시 / 전기공학 / 학점 4.2/4.5 / 오픽: IH / 탄소중립 ESG\n", - "\n", - "=== 22/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문 System LSI사업부_신호및시스템설계 / 2024 상반기\n", - "스펙: 연세대 / 기계공학과 / 학점 3.48/4.3 / 토익: 895,오픽: AL / 사회생활 경험: 씨드로닉스(6개월), HD현대로보틱스(3개월), 넥스트랩(2개월) / 자율주행 대회 2회 / 한국사검정시험: 고급\n", - "\n", - "=== 23/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문 반도체연구소 공정설계 / 2024 상반기\n", - "스펙: 숭실대 / 전기공학부 / 학점 4.15/4.5 / 토익: 900,오픽: IH / 사회생활 경험: 한창코퍼레이션 인턴 / 숭실공학상 / 한국사검정시험: 고급, 컴퓨터활용능력: , 기타: 전기기사\n", - "\n", - "=== 24/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자DS / 제조&기술담당_반도체공정기술 / 2024 상반기\n", - "스펙: 서성한 / 이과 / 학점 3.44/4.5 , 4.25/4.5 / 오픽: IM1 / 기타: ADsP\n", - "\n", - "=== 25/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / [연구개발/설계] 반도체공정설계 / 2024 상반기\n", - "스펙: 지거국 / 광메카트로닉스공학과 / 학점 3.79 / 오픽: IM2 / 사회생활 경험: 학부연구생 6개월 / SK LOOKIE / SKCE / SK HYPO / LG 메이크어 위시 / 한국전력공사 기자단 / 한국사검정시험: 고급, 기타: 6 시그마 GB/BB , ADSP\n", - "\n", - "=== 26/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / 메모리 사업부 / 2024 상반기\n", - "스펙: 수도권 하위 4년제 / 화학공학과 / 학점 4.32 / 토익스피킹: 160/AL\n", - "\n", - "=== 27/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문 S.LSI사업부 회로설계 / 2024 상반기\n", - "스펙: 성균관대학교 / 전자전기공학부 / 학점 3.91/4.5 / 토익: 860, 오픽: IH / 인공지능반도체설계 공모전 우수상\n", - "\n", - "=== 28/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문 제조&기술담당_반도체공정기술 / 2024 상반기\n", - "스펙: 홍익대학교 / 화학공학과 / 학점 4.39/4.5 / 토익: 905, 오픽: IH / 데이터분석, 공정실습\n", - "URL 29 추출 오류: Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"//*[@id=\"__next\"]/div[1]/div[4]/div/div[2]/div/div[2]/div[1]/div/div/h1\"}\n", - " (Session info: chrome=135.0.7049.115); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception\n", - "Stacktrace:\n", - "\tGetHandleVerifier [0x00007FF62F02EFA5+77893]\n", - "\tGetHandleVerifier [0x00007FF62F02F000+77984]\n", - "\t(No symbol) [0x00007FF62EDF91BA]\n", - "\t(No symbol) [0x00007FF62EE4F16D]\n", - "\t(No symbol) [0x00007FF62EE4F41C]\n", - "\t(No symbol) [0x00007FF62EEA2237]\n", - "\t(No symbol) [0x00007FF62EE7716F]\n", - "\t(No symbol) [0x00007FF62EE9F07F]\n", - "\t(No symbol) [0x00007FF62EE76F03]\n", - "\t(No symbol) [0x00007FF62EE40328]\n", - "\t(No symbol) [0x00007FF62EE41093]\n", - "\tGetHandleVerifier [0x00007FF62F2E7B6D+2931725]\n", - "\tGetHandleVerifier [0x00007FF62F2E2132+2908626]\n", - "\tGetHandleVerifier [0x00007FF62F3000F3+3031443]\n", - "\tGetHandleVerifier [0x00007FF62F0491EA+184970]\n", - "\tGetHandleVerifier [0x00007FF62F05086F+215311]\n", - "\tGetHandleVerifier [0x00007FF62F036EC4+110436]\n", - "\tGetHandleVerifier [0x00007FF62F037072+110866]\n", - "\tGetHandleVerifier [0x00007FF62F01D479+5401]\n", - "\tBaseThreadInitThunk [0x00007FFDF22E7374+20]\n", - "\tRtlUserThreadStart [0x00007FFDF303CC91+33]\n", - "\n", - "\n", - "=== 30/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DA사업부 SW개발 / 2024 상반기\n", - "스펙: 인하대학교 / 컴퓨터공학과 / 학점 3.47 / 오픽: IM2 / 프로그래밍 동아리 활동 / 기타: SQLD, 리눅스마스터 2급, 정보처리기사\n", - "\n", - "=== 31/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / AVP 사업팀_패키지 개발 / 2024 상반기\n", - "스펙: 산기대 / 생명화학공학과 / 학점 3.69 / 토익: 750, 오픽: IM2 / 사회생활 경험: 앰코코리아 1년\n", - "\n", - "=== 32/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS 평가 및 분석 / 2024 상반기\n", - "스펙: 서성한 / 기계공학 / 학점 4.13/4.5 / 오픽: IM2 / 사회생활 경험: 삼성전자DS 장기현장실습 / 학부연구생, 삼성전자DS 장기현장실습, 교환학생\n", - "\n", - "=== 33/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS부문 Test&System Package총괄_패키지개발 / 2024 상반기\n", - "스펙: 중앙대 / 기계공학과 / 학점 4.31/4.5 / 오픽: AL / 한국사검정시험: 고급, 컴퓨터활용능력: 1급, 기타: 운전면허\n", - "\n", - "=== 34/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / DS 제조&기술담당_반도체공정기술 / 2024 상반기\n", - "스펙: 홍익대학교 / 화학공학과 / 학점 4.39/4.5 / 토익: 905, 오픽: Ih / 공정실습, 데이터분석 교육\n", - "\n", - "=== 35/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / 파운드리사업부_회로설계 / 2024 상반기\n", - "스펙: 인하대학교 / 정보통신공학과 / 학점 3.85/4.5 / 오픽: IH / 사회생활 경험: 한국철도기술연구원 인턴 1회 / 우수논문상 수상, VE경진대회 입상\n", - "URL 36 추출 오류: Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"//*[@id=\"__next\"]/div[1]/div[4]/div/div[2]/div/div[2]/div[1]/div/div/h1\"}\n", - " (Session info: chrome=135.0.7049.115); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception\n", - "Stacktrace:\n", - "\tGetHandleVerifier [0x00007FF62F02EFA5+77893]\n", - "\tGetHandleVerifier [0x00007FF62F02F000+77984]\n", - "\t(No symbol) [0x00007FF62EDF91BA]\n", - "\t(No symbol) [0x00007FF62EE4F16D]\n", - "\t(No symbol) [0x00007FF62EE4F41C]\n", - "\t(No symbol) [0x00007FF62EEA2237]\n", - "\t(No symbol) [0x00007FF62EE7716F]\n", - "\t(No symbol) [0x00007FF62EE9F07F]\n", - "\t(No symbol) [0x00007FF62EE76F03]\n", - "\t(No symbol) [0x00007FF62EE40328]\n", - "\t(No symbol) [0x00007FF62EE41093]\n", - "\tGetHandleVerifier [0x00007FF62F2E7B6D+2931725]\n", - "\tGetHandleVerifier [0x00007FF62F2E2132+2908626]\n", - "\tGetHandleVerifier [0x00007FF62F3000F3+3031443]\n", - "\tGetHandleVerifier [0x00007FF62F0491EA+184970]\n", - "\tGetHandleVerifier [0x00007FF62F05086F+215311]\n", - "\tGetHandleVerifier [0x00007FF62F036EC4+110436]\n", - "\tGetHandleVerifier [0x00007FF62F037072+110866]\n", - "\tGetHandleVerifier [0x00007FF62F01D479+5401]\n", - "\tBaseThreadInitThunk [0x00007FFDF22E7374+20]\n", - "\tRtlUserThreadStart [0x00007FFDF303CC91+33]\n", - "\n", - "\n", - "=== 37/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / AVP사업팀_반도체공정기술 / 2024 상반기\n", - "스펙: 숭실대 / 전기공학부 / 학점 3.82/4.5 / 오픽: IM1 / 캡스톤,특허유니버시아드 / 컴퓨터활용능력: 1급\n", - "URL 38 추출 오류: Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"//*[@id=\"__next\"]/div[1]/div[4]/div/div[2]/div/div[2]/div[1]/div/div/h1\"}\n", - " (Session info: chrome=135.0.7049.115); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception\n", - "Stacktrace:\n", - "\tGetHandleVerifier [0x00007FF62F02EFA5+77893]\n", - "\tGetHandleVerifier [0x00007FF62F02F000+77984]\n", - "\t(No symbol) [0x00007FF62EDF91BA]\n", - "\t(No symbol) [0x00007FF62EE4F16D]\n", - "\t(No symbol) [0x00007FF62EE4F41C]\n", - "\t(No symbol) [0x00007FF62EEA2237]\n", - "\t(No symbol) [0x00007FF62EE7716F]\n", - "\t(No symbol) [0x00007FF62EE9F07F]\n", - "\t(No symbol) [0x00007FF62EE76F03]\n", - "\t(No symbol) [0x00007FF62EE40328]\n", - "\t(No symbol) [0x00007FF62EE41093]\n", - "\tGetHandleVerifier [0x00007FF62F2E7B6D+2931725]\n", - "\tGetHandleVerifier [0x00007FF62F2E2132+2908626]\n", - "\tGetHandleVerifier [0x00007FF62F3000F3+3031443]\n", - "\tGetHandleVerifier [0x00007FF62F0491EA+184970]\n", - "\tGetHandleVerifier [0x00007FF62F05086F+215311]\n", - "\tGetHandleVerifier [0x00007FF62F036EC4+110436]\n", - "\tGetHandleVerifier [0x00007FF62F037072+110866]\n", - "\tGetHandleVerifier [0x00007FF62F01D479+5401]\n", - "\tBaseThreadInitThunk [0x00007FFDF22E7374+20]\n", - "\tRtlUserThreadStart [0x00007FFDF303CC91+33]\n", - "\n", - "\n", - "=== 39/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / CTO_반도체연구소_반도체공정기술 / 2024 상반기\n", - "스펙: 건동홍 / 화학공학 / 학점 3.5/4.5 / 오픽: AL / 사회생활 경험: 장비사 1년\n", - "\n", - "=== 40/40 ===\n", - "합격 기업 / 직무 / 지원시기: 삼성전자 / SW개발 / 2024 상반기\n", - "스펙: 지방 / 전자공학, 컴퓨터공학 / 학점 4.04/4.5 / 토익스피킹: 140/레벨6 / SSAFY\n", - "\n", - "✅ CSV 저장 완료!\n" - ] - } - ], - "source": [ - "chrome_options = Options()\n", - "chrome_options.add_argument(\"--start-maximized\")\n", - "driver = webdriver.Chrome(options=chrome_options)\n", - "\n", - "# ✅ 기본 URL 템플릿\n", - "base_url = \"https://linkareer.com/cover-letter/34416?organizationName=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&page={}&sort=PASSED_AT&tab=all\"\n", - "\n", - "# ✅ 가져올 최대 페이지 수 설정 (여기서 숫자 바꿔서 조절 가능!)\n", - "max_page = 2\n", - "\n", - "all_card_urls = []\n", - "\n", - "for page in range(1, max_page + 1):\n", - " url = base_url.format(page)\n", - " driver.get(url)\n", - " time.sleep(2)\n", - "\n", - " # 카드 a 태그 찾기\n", - " cards = driver.find_elements(By.XPATH, '//*[@id=\"__next\"]/div[1]/div[4]/div/div[2]/div/div[1]/div/div[2]/div[1]/div/a')\n", - "\n", - " if not cards:\n", - " print(f\"페이지 {page}: 카드 없음 → 중단\")\n", - " break\n", - "\n", - " print(f\"페이지 {page}: 카드 {len(cards)}개 발견\")\n", - " for idx, card in enumerate(cards, start=1):\n", - " href = card.get_attribute(\"href\")\n", - " print(f\" 카드 {idx}: {href}\")\n", - " all_card_urls.append(href)\n", - "\n", - "print(f\"\\n총 {len(all_card_urls)}개의 URL 수집 완료!\")\n", - "\n", - "# ✅ 각 URL 접속하여 정보 추출\n", - "data = []\n", - "\n", - "for idx, url in enumerate(all_card_urls, start=1):\n", - " driver.get(url)\n", - " time.sleep(2)\n", - "\n", - " try:\n", - " company_info = driver.find_element(By.XPATH, '//*[@id=\"__next\"]/div[1]/div[4]/div/div[2]/div/div[2]/div[1]/div/div/h1').text\n", - " spec_elements = driver.find_elements(By.XPATH, '//*[@id=\"__next\"]/div[1]/div[4]/div/div[2]/div/div[2]/div[1]/div/div/h3')\n", - " spec_info = spec_elements[0].text if spec_elements else \"스펙 없음\"\n", - "\n", - " print(f\"\\n=== {idx}/{len(all_card_urls)} ===\")\n", - " print(\"합격 기업 / 직무 / 지원시기:\", company_info)\n", - " print(\"스펙:\", spec_info)\n", - "\n", - " data.append({\n", - " '합격 기업 / 직무 / 지원시기': company_info,\n", - " '스펙': spec_info\n", - " })\n", - "\n", - " except Exception as e:\n", - " print(f\"URL {idx} 추출 오류: {e}\")\n", - "\n", - "# ✅ CSV 저장\n", - "df = pd.DataFrame(data)\n", - "df.to_csv('successful_applicants_specs.csv', index=False, encoding='utf-8-sig')\n", - "print(\"\\n✅ CSV 저장 완료!\")\n", - "\n", - "driver.quit()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "c446d9cf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'합격 기업 / 직무 / 지원시기': '삼성전자 / DS부문 제조&기술담당_반도체공정기술 / 2024 상반기',\n", - " '스펙': '홍익대학교 / 화학공학과 / 학점 4.39/4.5 / 토익: 905, 오픽: IH / 데이터분석, 공정실습'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / DA사업부 SW개발 / 2024 상반기',\n", - " '스펙': '인하대학교 / 컴퓨터공학과 / 학점 3.47 / 오픽: IM2 / 프로그래밍 동아리 활동 / 기타: SQLD, 리눅스마스터 2급, 정보처리기사'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / AVP 사업팀_패키지 개발 / 2024 상반기',\n", - " '스펙': '산기대 / 생명화학공학과 / 학점 3.69 / 토익: 750, 오픽: IM2 / 사회생활 경험: 앰코코리아 1년'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / DS 평가 및 분석 / 2024 상반기',\n", - " '스펙': '서성한 / 기계공학 / 학점 4.13/4.5 / 오픽: IM2 / 사회생활 경험: 삼성전자DS 장기현장실습 / 학부연구생, 삼성전자DS 장기현장실습, 교환학생'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / DS부문 Test&System Package총괄_패키지개발 / 2024 상반기',\n", - " '스펙': '중앙대 / 기계공학과 / 학점 4.31/4.5 / 오픽: AL / 한국사검정시험: 고급, 컴퓨터활용능력: 1급, 기타: 운전면허'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / DS 제조&기술담당_반도체공정기술 / 2024 상반기',\n", - " '스펙': '홍익대학교 / 화학공학과 / 학점 4.39/4.5 / 토익: 905, 오픽: Ih / 공정실습, 데이터분석 교육'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / 파운드리사업부_회로설계 / 2024 상반기',\n", - " '스펙': '인하대학교 / 정보통신공학과 / 학점 3.85/4.5 / 오픽: IH / 사회생활 경험: 한국철도기술연구원 인턴 1회 / 우수논문상 수상, VE경진대회 입상'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / AVP사업팀_반도체공정기술 / 2024 상반기',\n", - " '스펙': '숭실대 / 전기공학부 / 학점 3.82/4.5 / 오픽: IM1 / 캡스톤,특허유니버시아드 / 컴퓨터활용능력: 1급'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / CTO_반도체연구소_반도체공정기술 / 2024 상반기',\n", - " '스펙': '건동홍 / 화학공학 / 학점 3.5/4.5 / 오픽: AL / 사회생활 경험: 장비사 1년'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / SW개발 / 2024 상반기',\n", - " '스펙': '지방 / 전자공학, 컴퓨터공학 / 학점 4.04/4.5 / 토익스피킹: 140/레벨6 / SSAFY'}]" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data[-10:]" - ] - }, - { - "cell_type": "markdown", - "id": "5a87ab1c", - "metadata": {}, - "source": [ - "### 전처리를 위한 sample data 형성" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "96ec8ff3", - "metadata": {}, - "outputs": [], - "source": [ - "example_data = [{'합격 기업 / 직무 / 지원시기': '삼성전자 / DS부문 제조&기술담당_반도체공정기술 / 2024 상반기',\n", - " '스펙': '홍익대학교 / 화학공학과 / 학점 4.39/4.5 / 토익: 905, 오픽: IH / 데이터분석, 공정실습'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / DA사업부 SW개발 / 2024 상반기',\n", - " '스펙': '인하대학교 / 컴퓨터공학과 / 학점 3.47 / 오픽: IM2 / 프로그래밍 동아리 활동 / 기타: SQLD, 리눅스마스터 2급, 정보처리기사'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / AVP 사업팀_패키지 개발 / 2024 상반기',\n", - " '스펙': '산기대 / 생명화학공학과 / 학점 3.69 / 토익: 750, 오픽: IM2 / 사회생활 경험: 앰코코리아 1년'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / DS 평가 및 분석 / 2024 상반기',\n", - " '스펙': '서성한 / 기계공학 / 학점 4.13/4.5 / 오픽: IM2 / 사회생활 경험: 삼성전자DS 장기현장실습 / 학부연구생, 삼성전자DS 장기현장실습, 교환학생'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / DS부문 Test&System Package총괄_패키지개발 / 2024 상반기',\n", - " '스펙': '중앙대 / 기계공학과 / 학점 4.31/4.5 / 오픽: AL / 한국사검정시험: 고급, 컴퓨터활용능력: 1급, 기타: 운전면허'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / DS 제조&기술담당_반도체공정기술 / 2024 상반기',\n", - " '스펙': '홍익대학교 / 화학공학과 / 학점 4.39/4.5 / 토익: 905, 오픽: Ih / 공정실습, 데이터분석 교육'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / 파운드리사업부_회로설계 / 2024 상반기',\n", - " '스펙': '인하대학교 / 정보통신공학과 / 학점 3.85/4.5 / 오픽: IH / 사회생활 경험: 한국철도기술연구원 인턴 1회 / 우수논문상 수상, VE경진대회 입상'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / AVP사업팀_반도체공정기술 / 2024 상반기',\n", - " '스펙': '숭실대 / 전기공학부 / 학점 3.82/4.5 / 오픽: IM1 / 캡스톤,특허유니버시아드 / 컴퓨터활용능력: 1급'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / CTO_반도체연구소_반도체공정기술 / 2024 상반기',\n", - " '스펙': '건동홍 / 화학공학 / 학점 3.5/4.5 / 오픽: AL / 사회생활 경험: 장비사 1년'},\n", - " {'합격 기업 / 직무 / 지원시기': '삼성전자 / SW개발 / 2024 상반기',\n", - " '스펙': '지방 / 전자공학, 컴퓨터공학 / 학점 4.04/4.5 / 토익스피킹: 140/레벨6 / SSAFY'}]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "2291dbb2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'company': '삼성전자', 'division': 'DS부문 제조&기술담당', 'job_title': '반도체공정기술', 'apply_term': '2024 상반기', 'university': '홍익대학교', 'major': '화학공학과', 'gpa': '4.39', 'gpa_scale': '4.5', 'toeic': '905', 'opic': 'IH', 'toeic_speaking': '', 'work_experience': '', 'other_certifications': ''}\n", - "{'company': '삼성전자', 'division': 'DA사업부 SW개발', 'job_title': '', 'apply_term': '2024 상반기', 'university': '인하대학교', 'major': '컴퓨터공학과', 'gpa': '3.47', 'gpa_scale': '', 'toeic': '', 'opic': 'IM2', 'toeic_speaking': '', 'work_experience': '', 'other_certifications': '기타: SQLD, 리눅스마스터 2급, 정보처리기사'}\n", - "{'company': '삼성전자', 'division': 'AVP 사업팀', 'job_title': '패키지 개발', 'apply_term': '2024 상반기', 'university': '산기대', 'major': '생명화학공학과', 'gpa': '3.69', 'gpa_scale': '', 'toeic': '750', 'opic': 'IM2', 'toeic_speaking': '', 'work_experience': '앰코코리아 1년', 'other_certifications': ''}\n", - "{'company': '삼성전자', 'division': 'DS 평가 및 분석', 'job_title': '', 'apply_term': '2024 상반기', 'university': '서성한', 'major': '기계공학', 'gpa': '4.13', 'gpa_scale': '4.5', 'toeic': '', 'opic': 'IM2', 'toeic_speaking': '', 'work_experience': '삼성전자DS 장기현장실습 ', 'other_certifications': ''}\n", - "{'company': '삼성전자', 'division': 'DS부문 Test&System Package총괄', 'job_title': '패키지개발', 'apply_term': '2024 상반기', 'university': '중앙대', 'major': '기계공학과', 'gpa': '4.31', 'gpa_scale': '4.5', 'toeic': '', 'opic': 'AL', 'toeic_speaking': '', 'work_experience': '', 'other_certifications': '한국사검정시험: 고급, 컴퓨터활용능력: 1급, 기타: 운전면허'}\n", - "{'company': '삼성전자', 'division': 'DS 제조&기술담당', 'job_title': '반도체공정기술', 'apply_term': '2024 상반기', 'university': '홍익대학교', 'major': '화학공학과', 'gpa': '4.39', 'gpa_scale': '4.5', 'toeic': '905', 'opic': 'Ih', 'toeic_speaking': '', 'work_experience': '', 'other_certifications': '공정실습, 데이터분석 교육'}\n", - "{'company': '삼성전자', 'division': '파운드리사업부', 'job_title': '회로설계', 'apply_term': '2024 상반기', 'university': '인하대학교', 'major': '정보통신공학과', 'gpa': '3.85', 'gpa_scale': '4.5', 'toeic': '', 'opic': 'IH', 'toeic_speaking': '', 'work_experience': '한국철도기술연구원 인턴 1회 ', 'other_certifications': '우수논문상 수상, VE경진대회 입상'}\n", - "{'company': '삼성전자', 'division': 'AVP사업팀', 'job_title': '반도체공정기술', 'apply_term': '2024 상반기', 'university': '숭실대', 'major': '전기공학부', 'gpa': '3.82', 'gpa_scale': '4.5', 'toeic': '', 'opic': 'IM1', 'toeic_speaking': '', 'work_experience': '', 'other_certifications': '캡스톤,특허유니버시아드, 컴퓨터활용능력: 1급'}\n", - "{'company': '삼성전자', 'division': 'CTO_반도체연구소_반도체공정기술', 'job_title': '', 'apply_term': '2024 상반기', 'university': '건동홍', 'major': '화학공학', 'gpa': '3.5', 'gpa_scale': '4.5', 'toeic': '', 'opic': 'AL', 'toeic_speaking': '', 'work_experience': '장비사 1년', 'other_certifications': ''}\n", - "{'company': '삼성전자', 'division': 'SW개발', 'job_title': '', 'apply_term': '2024 상반기', 'university': '지방', 'major': '전자공학, 컴퓨터공학', 'gpa': '4.04', 'gpa_scale': '4.5', 'toeic': '', 'opic': '', 'toeic_speaking': '140', 'work_experience': '', 'other_certifications': ''}\n" - ] - } - ], - "source": [ - "cleaned_data = []\n", - "\n", - "for item in example_data:\n", - " # 1. 합격 기업/직무/지원시기\n", - " parts = [p.strip() for p in item['합격 기업 / 직무 / 지원시기'].split('/')]\n", - " company = parts[0]\n", - " division_job = parts[1].split('_')\n", - " if len(division_job) == 2:\n", - " division, job_title = division_job\n", - " else:\n", - " division, job_title = parts[1], ''\n", - " apply_term = parts[-1]\n", - " \n", - " # 2. 스펙 분해\n", - " spec = item['스펙']\n", - " spec_parts = [p.strip() for p in spec.split('/')]\n", - " university = spec_parts[0]\n", - " major = spec_parts[1] if len(spec_parts) > 1 else ''\n", - " \n", - " # 학점 찾기\n", - " gpa_match = re.search(r'학점\\s*([\\d.]+)(?:/([\\d.]+))?', spec)\n", - " gpa = gpa_match.group(1) if gpa_match else ''\n", - " gpa_scale = gpa_match.group(2) if gpa_match and gpa_match.lastindex == 2 else ''\n", - " \n", - " # 토익\n", - " toeic_match = re.search(r'토익[:]? (\\d+)', spec)\n", - " toeic = toeic_match.group(1) if toeic_match else ''\n", - " \n", - " # 오픽\n", - " opic_match = re.search(r'오픽[:]? (\\w+)', spec)\n", - " opic = opic_match.group(1) if opic_match else ''\n", - " \n", - " # 토익스피킹\n", - " ts_match = re.search(r'토익스피킹[:]? ([^/]+)', spec)\n", - " toeic_speaking = ts_match.group(1) if ts_match else ''\n", - " \n", - " # 사회생활\n", - " work_match = re.search(r'사회생활 경험[:]? ([^/]+)', spec)\n", - " work_experience = work_match.group(1) if work_match else ''\n", - " \n", - " # 기타 (나머지 자격증 등)\n", - " other = []\n", - " for s in spec_parts:\n", - " if any(keyword in s for keyword in ['자격', '활용능력', 'SQLD', '기사', '운전', '교육', '캡스톤', '논문상', '수상', 'VE', '특허']):\n", - " other.append(s)\n", - " \n", - " cleaned_data.append({\n", - " 'company': company,\n", - " 'division': division.strip(),\n", - " 'job_title': job_title.strip(),\n", - " 'apply_term': apply_term,\n", - " 'university': university,\n", - " 'major': major,\n", - " 'gpa': gpa,\n", - " 'gpa_scale': gpa_scale,\n", - " 'toeic': toeic,\n", - " 'opic': opic,\n", - " 'toeic_speaking': toeic_speaking,\n", - " 'work_experience': work_experience,\n", - " 'other_certifications': ', '.join(other)\n", - " })\n", - "\n", - "# 결과 확인\n", - "for c in cleaned_data:\n", - " print(c)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "cf7e2495", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
companydivisionjob_titleapply_termuniversitymajorgpagpa_scaletoeicopictoeic_speakingwork_experienceother_certifications
0삼성전자DS부문 제조&기술담당반도체공정기술2024 상반기홍익대학교화학공학과4.394.5905IH
1삼성전자DA사업부 SW개발2024 상반기인하대학교컴퓨터공학과3.47IM2기타: SQLD, 리눅스마스터 2급, 정보처리기사
2삼성전자AVP 사업팀패키지 개발2024 상반기산기대생명화학공학과3.69750IM2앰코코리아 1년
3삼성전자DS 평가 및 분석2024 상반기서성한기계공학4.134.5IM2삼성전자DS 장기현장실습
4삼성전자DS부문 Test&System Package총괄패키지개발2024 상반기중앙대기계공학과4.314.5AL한국사검정시험: 고급, 컴퓨터활용능력: 1급, 기타: 운전면허
5삼성전자DS 제조&기술담당반도체공정기술2024 상반기홍익대학교화학공학과4.394.5905Ih공정실습, 데이터분석 교육
6삼성전자파운드리사업부회로설계2024 상반기인하대학교정보통신공학과3.854.5IH한국철도기술연구원 인턴 1회우수논문상 수상, VE경진대회 입상
7삼성전자AVP사업팀반도체공정기술2024 상반기숭실대전기공학부3.824.5IM1캡스톤,특허유니버시아드, 컴퓨터활용능력: 1급
8삼성전자CTO_반도체연구소_반도체공정기술2024 상반기건동홍화학공학3.54.5AL장비사 1년
9삼성전자SW개발2024 상반기지방전자공학, 컴퓨터공학4.044.5140
\n", - "
" - ], - "text/plain": [ - " company division job_title apply_term university \\\n", - "0 삼성전자 DS부문 제조&기술담당 반도체공정기술 2024 상반기 홍익대학교 \n", - "1 삼성전자 DA사업부 SW개발 2024 상반기 인하대학교 \n", - "2 삼성전자 AVP 사업팀 패키지 개발 2024 상반기 산기대 \n", - "3 삼성전자 DS 평가 및 분석 2024 상반기 서성한 \n", - "4 삼성전자 DS부문 Test&System Package총괄 패키지개발 2024 상반기 중앙대 \n", - "5 삼성전자 DS 제조&기술담당 반도체공정기술 2024 상반기 홍익대학교 \n", - "6 삼성전자 파운드리사업부 회로설계 2024 상반기 인하대학교 \n", - "7 삼성전자 AVP사업팀 반도체공정기술 2024 상반기 숭실대 \n", - "8 삼성전자 CTO_반도체연구소_반도체공정기술 2024 상반기 건동홍 \n", - "9 삼성전자 SW개발 2024 상반기 지방 \n", - "\n", - " major gpa gpa_scale toeic opic toeic_speaking work_experience \\\n", - "0 화학공학과 4.39 4.5 905 IH \n", - "1 컴퓨터공학과 3.47 IM2 \n", - "2 생명화학공학과 3.69 750 IM2 앰코코리아 1년 \n", - "3 기계공학 4.13 4.5 IM2 삼성전자DS 장기현장실습 \n", - "4 기계공학과 4.31 4.5 AL \n", - "5 화학공학과 4.39 4.5 905 Ih \n", - "6 정보통신공학과 3.85 4.5 IH 한국철도기술연구원 인턴 1회 \n", - "7 전기공학부 3.82 4.5 IM1 \n", - "8 화학공학 3.5 4.5 AL 장비사 1년 \n", - "9 전자공학, 컴퓨터공학 4.04 4.5 140 \n", - "\n", - " other_certifications \n", - "0 \n", - "1 기타: SQLD, 리눅스마스터 2급, 정보처리기사 \n", - "2 \n", - "3 \n", - "4 한국사검정시험: 고급, 컴퓨터활용능력: 1급, 기타: 운전면허 \n", - "5 공정실습, 데이터분석 교육 \n", - "6 우수논문상 수상, VE경진대회 입상 \n", - "7 캡스톤,특허유니버시아드, 컴퓨터활용능력: 1급 \n", - "8 \n", - "9 " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame(cleaned_data)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "6e1bb77a", - "metadata": {}, - "outputs": [], - "source": [ - "pd.DataFrame(cleaned_data).to_csv('cleaned_successful_applicants_specs.csv', index=False, encoding='utf-8-sig')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "7c0c9981", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " main_id certification_name\n", - "0 1 SQLD\n", - "1 1 리눅스마스터 2급\n", - "2 1 정보처리기사\n", - "3 4 한국사검정시험: 고급\n", - "4 4 컴퓨터활용능력: 1급\n", - "5 4 운전면허\n", - "6 5 공정실습\n", - "7 5 데이터분석 교육\n", - "8 6 우수논문상 수상\n", - "9 6 VE경진대회 입상\n", - "10 7 캡스톤\n", - "11 7 특허유니버시아드\n", - "12 7 컴퓨터활용능력: 1급\n" - ] - } - ], - "source": [ - "# 예시: 앞에서 만든 DataFrame\n", - "df = pd.DataFrame(cleaned_data)\n", - "\n", - "# 새로운 테이블용 데이터\n", - "certification_rows = []\n", - "\n", - "for idx, row in df.iterrows():\n", - " if row['other_certifications']:\n", - " certs = [c.strip() for c in row['other_certifications'].split(',')]\n", - " for cert in certs:\n", - " if cert: # 빈칸 거르기\n", - " certification_rows.append({\n", - " 'main_id': idx, # 이건 나중에 PK/FK 맞춰서 쓰면 돼요\n", - " 'certification_name': cert\n", - " })\n", - "\n", - "# certification_rows 리스트를 DataFrame으로 변환\n", - "cert_df = pd.DataFrame(certification_rows)\n", - "\n", - "# '기타: ' 삭제\n", - "cert_df['certification_name'] = cert_df['certification_name'].str.replace(r'^기타:\\s*', '', regex=True)\n", - "\n", - "# 확인\n", - "print(cert_df)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "2847ae43", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
main_idcertification_name
01SQLD
11리눅스마스터 2급
21정보처리기사
34한국사검정시험: 고급
44컴퓨터활용능력: 1급
54운전면허
65공정실습
75데이터분석 교육
86우수논문상 수상
96VE경진대회 입상
\n", - "
" - ], - "text/plain": [ - " main_id certification_name\n", - "0 1 SQLD\n", - "1 1 리눅스마스터 2급\n", - "2 1 정보처리기사\n", - "3 4 한국사검정시험: 고급\n", - "4 4 컴퓨터활용능력: 1급\n", - "5 4 운전면허\n", - "6 5 공정실습\n", - "7 5 데이터분석 교육\n", - "8 6 우수논문상 수상\n", - "9 6 VE경진대회 입상" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cert_df.head(10) # 자격증 테이블 하나 더 만들어야 할듯." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "644fdfe2", - "metadata": {}, - "outputs": [], - "source": [ - "cert_df.to_csv('certifications.csv', index=False, encoding='utf-8-sig')\n", - "# 자격증 테이블 CSV 저장" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5935812e", - "metadata": {}, - "outputs": [], - "source": [ - "# # 테이블 1: 합격자 정보\n", - "# CREATE TABLE applicants (\n", - "# id INT PRIMARY KEY AUTO_INCREMENT,\n", - "# company VARCHAR(255),\n", - "# division VARCHAR(255),\n", - "# job_title VARCHAR(255),\n", - "# apply_term VARCHAR(100),\n", - "# university VARCHAR(255),\n", - "# major VARCHAR(255),\n", - "# gpa DECIMAL(3,2),\n", - "# gpa_scale DECIMAL(3,2),\n", - "# toeic INT,\n", - "# opic VARCHAR(20),\n", - "# toeic_speaking VARCHAR(50),\n", - "# work_experience TEXT\n", - "# );" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2afbfdf1", - "metadata": {}, - "outputs": [], - "source": [ - "# # 테이블 2: 자격증 정보\n", - "# CREATE TABLE certifications (\n", - "# id INT PRIMARY KEY AUTO_INCREMENT,\n", - "# applicant_id INT,\n", - "# certification_name VARCHAR(255),\n", - "# FOREIGN KEY (applicant_id) REFERENCES applicants(id)\n", - "# );" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "hoenv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git "a/backend/crawling/\354\247\201\355\226\211_\355\201\254\353\241\244\353\247\201_\352\262\260\352\263\274.xlsx" "b/backend/crawling/\354\247\201\355\226\211_\355\201\254\353\241\244\353\247\201_\352\262\260\352\263\274.xlsx" deleted file mode 100644 index 23ae1e6c0..000000000 Binary files "a/backend/crawling/\354\247\201\355\226\211_\355\201\254\353\241\244\353\247\201_\352\262\260\352\263\274.xlsx" and /dev/null differ diff --git "a/backend/crawling/\354\261\204\354\232\251\352\263\265\352\263\240_\355\201\254\353\241\244\353\247\201\352\262\260\352\263\274.xlsx" "b/backend/crawling/\354\261\204\354\232\251\352\263\265\352\263\240_\355\201\254\353\241\244\353\247\201\352\262\260\352\263\274.xlsx" deleted file mode 100644 index 62c298565..000000000 Binary files "a/backend/crawling/\354\261\204\354\232\251\352\263\265\352\263\240_\355\201\254\353\241\244\353\247\201\352\262\260\352\263\274.xlsx" and /dev/null differ diff --git a/backend/test_crawl/applicant_crawler.py b/backend/test_crawl/applicant_crawler.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/backend/test_crawl/certification_crawler.py b/backend/test_crawl/certification_crawler.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/backend/test_crawl/insert_to_db.py b/backend/test_crawl/insert_to_db.py deleted file mode 100644 index 59a17801c..000000000 --- a/backend/test_crawl/insert_to_db.py +++ /dev/null @@ -1,26 +0,0 @@ -import os -from dotenv import load_dotenv -from sqlalchemy import create_engine, text -import pandas as pd - - -# 1. 환경변수 불러오기 -load_dotenv() -DATABASE_URL = os.getenv("DATABASE_URL") -print("🔗 DATABASE_URL:", DATABASE_URL) - -# 2. DB 연결 -engine = create_engine(DATABASE_URL) - -# 3. 연결 테스트 + 데이터 조회 -try: - with engine.connect() as conn: - conn.execute(text("SELECT 1;")) # SQLAlchemy 2.0+에서는 text() 필요 - print("✅ DB 연결 성공") - - # 실제 테이블에서 5개만 조회 - df = pd.read_sql("SELECT * FROM certifications LIMIT 5;", con=engine) - print("📦 certifications 테이블 샘플:\n", df) - -except Exception as e: - print("❌ DB 연결 실패:", e) \ No newline at end of file diff --git a/backend/test_crawl/recruit_crawler.py b/backend/test_crawl/recruit_crawler.py deleted file mode 100644 index 0ae280578..000000000 --- a/backend/test_crawl/recruit_crawler.py +++ /dev/null @@ -1,173 +0,0 @@ -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.chrome.options import Options -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -import pandas as pd -import time - -def crawl_zighang(job_name="서버·백엔드", max_clicks=10): - options = Options() - options.add_argument("--headless") # 필요 시 제거 가능 - options.add_argument("--no-sandbox") - options.add_argument("--disable-dev-shm-usage") - driver = webdriver.Chrome(options=options) - driver.set_window_size(1280, 1024) - wait = WebDriverWait(driver, 20) - - try: - driver.get("https://zighang.com/it") - time.sleep(2) - - arrow_xpath = '//*[@id="root"]/main/div[3]/div/div/div/div/div[2]/div/section/button[2]/div/img' - wait.until(EC.element_to_be_clickable((By.XPATH, arrow_xpath))).click() - time.sleep(1) - - job_button_xpath = f'//button[normalize-space()="{job_name}"]' - wait.until(EC.element_to_be_clickable((By.XPATH, job_button_xpath))).click() - time.sleep(1) - - confirm_button = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.sticky.bottom-0 button.bg-primary'))) - driver.execute_script("arguments[0].scrollIntoView(true);", confirm_button) - driver.execute_script("arguments[0].click();", confirm_button) - wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'p.ds-web-title2'))) - - original_tab = driver.current_window_handle - results = [] - - for i in range(2, max_clicks + 1): - try: - title_xpath = f'(//p[contains(@class, "ds-web-title2")])[{i}]' - title_elem = wait.until(EC.presence_of_element_located((By.XPATH, title_xpath))) - driver.execute_script("arguments[0].scrollIntoView(true);", title_elem) - driver.execute_script("window.scrollBy(0, -200);") - time.sleep(0.3) - - parent_link = title_elem.find_element(By.XPATH, "./ancestor::a[1]") - driver.execute_script("arguments[0].click();", parent_link) - time.sleep(2) - - new_tab = [tab for tab in driver.window_handles if tab != original_tab][0] - driver.switch_to.window(new_tab) - - data = {} - data["회사명"] = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[1]/div[1]/div/a').text - data["경력"] = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[1]/div/div').text - data["학력"] = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[3]/div/div').text - data["근무지"] = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[2]/div/div').text - data["직군"] = job_name - - try: - data["우대사항"] = driver.find_element(By.XPATH, '//h2[text()="우대사항"]/following-sibling::p').text - except: - data["우대사항"] = "" - - try: - data["자격요건"] = driver.find_element(By.XPATH, '//h2[text()="자격요건"]/following-sibling::p').text - except: - data["자격요건"] = "" - - if data["우대사항"] == "" and data["자격요건"] == "": - try: - img_elem = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[4]/img') - data["이미지경로"] = img_elem.get_attribute("src") - except: - data["이미지경로"] = "" - else: - data["이미지경로"] = "" - - results.append(data) - driver.close() - driver.switch_to.window(original_tab) - - except Exception as e: - print(f"❌ [{i}]번째 공고 실패: {e}") - continue - - return pd.DataFrame(results) - - finally: - driver.quit() - - - - -def crawl_linkareer(max_pages=5): - chrome_options = Options() - chrome_options.add_experimental_option("detach", True) - chrome_options.add_argument("--no-sandbox") - chrome_options.add_argument("--disable-dev-shm-usage") - # chrome_options.add_argument("--headless") # 필요 시 주석 제거 - driver = webdriver.Chrome(options=chrome_options) - wait = WebDriverWait(driver, 10) - - results = [] - - try: - for page in range(1, max_pages + 1): - list_url = f"https://linkareer.com/list/recruit?filterBy_activityTypeID=5&filterBy_categoryIDs=58&filterBy_status=OPEN&orderBy_direction=DESC&orderBy_field=RECENT&page={page}" - driver.get(list_url) - time.sleep(2) - print(f"📄 {page}페이지 접속 완료") - - main_window = driver.current_window_handle - row_count = len(driver.find_elements(By.XPATH, '//*[@id="__next"]/div[1]/div/main/div/section/div[2]/table/tbody/tr')) - print(f"🔍 {row_count}개의 공고 탐색 예정") - - for i in range(1, row_count + 1): - try: - link_element = driver.find_element(By.XPATH, f'//*[@id="__next"]/div[1]/div/main/div/section/div[2]/table/tbody/tr[{i}]/td[2]/div/a/div/p') - link_element.click() - - driver.switch_to.window(driver.window_handles[-1]) - - company_name = wait.until(EC.presence_of_element_located( - (By.XPATH, '//*[@id="__next"]/div[1]/div/main/div/div/section[1]/div/article/header/h2'))).text.strip() - company_type = wait.until(EC.presence_of_element_located( - (By.XPATH, '//*[@id="__next"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[1]/dd'))).text.strip() - position_element = wait.until(EC.presence_of_element_located( - (By.XPATH, '//*[@id="__next"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[5]/dd'))) - position = position_element.text.strip() - - p_elements = driver.find_elements(By.XPATH, '//*[@id="DETAIL"]/section[1]/div/p') - p_texts = [p.text.strip() for p in p_elements] - - qual_idx = next((idx for idx, text in enumerate(p_texts) if '자격요건' in text or '자격 요건' in text), None) - pos_idx = next((idx for idx, text in enumerate(p_texts) if '모집 직무' in text or '세부 직무' in text), None) - - qualification_texts = [] - if qual_idx is not None: - for t in p_texts[qual_idx + 1:]: - if any(keyword in t for keyword in ['지원', '혜택', '우대', '다음', '근무']): - break - qualification_texts.append(t) - qualification = "\n".join(qualification_texts) - - detail_position = '' - if pos_idx is not None and pos_idx + 1 < len(p_texts): - detail_position = p_texts[pos_idx + 1] - - results.append({ - '회사명': company_name, - '기업형태': company_type, - '모집직무': position, - '세부직무': detail_position, - '자격요건': qualification - }) - - print(f"✅ {company_name} ({i}/{row_count}, page {page}) 크롤링 완료") - driver.close() - driver.switch_to.window(main_window) - time.sleep(1) - - except Exception as e: - print(f"❌ {page}페이지 {i}번째 공고 오류: {e}") - if len(driver.window_handles) > 1: - driver.close() - driver.switch_to.window(main_window) - continue - - return pd.DataFrame(results) - - finally: - driver.quit() \ No newline at end of file diff --git a/backend/test_crawl/selenium_basic/app.py b/backend/test_crawl/selenium_basic/app.py deleted file mode 100644 index 000847917..000000000 --- a/backend/test_crawl/selenium_basic/app.py +++ /dev/null @@ -1,19 +0,0 @@ -import time -from selenium import webdriver -from selenium.webdriver.common.by import By -import chromedriver_autoinstaller - -chromedriver_autoinstaller.install() - -driver = webdriver.Chrome() -# 1. 드라이버.get() 메서드를 사용하여 웹 페이지를 연다. -driver.get("https://www.naver.com") -time.sleep(3) - -# 2. 웹 페이지가 열리면, 웹 페이지의 요소를 찾기 위해 find_element() 메서드를 사용한다. -css_selector = "#shortcutArea > ul > li:nth-child(8) > a > span.service_name" -group_navigation = driver.find_element(By.CSS_SELECTOR, css_selector) - -print(group_navigation.text) -group_navigation.click() -input() \ No newline at end of file diff --git a/backend/test_crawl/selenium_basic/selenium_tools.py b/backend/test_crawl/selenium_basic/selenium_tools.py deleted file mode 100644 index 620b52e59..000000000 --- a/backend/test_crawl/selenium_basic/selenium_tools.py +++ /dev/null @@ -1,65 +0,0 @@ -import time -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webrdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC - -import chromedriver_autoinstaller - -chromedriver_autoinstaller.install() - -driver = webdriver.Chrome() -driver.get("https://www.naver.com") - -# # 1. Navigation (웹 페이지 이동) 관련 툴 -# # get, back, forward, refresh 메서드를 사용하여 웹 페이지를 이동하는 방법을 알아보자. - -# # 1-1. get() 원하는 페이지로 이동하는 함수 -# driver.get("https://www.naver.com") -# time.sleep(1) -# driver.get("https://www.google.com") - -# # 1-2. back() 이전 페이지로 이동하는 함수 -# driver.back() -# time.sleep(2) - -# # 1-3. forward() 다음 페이지로 이동하는 함수 -# driver.forward() -# time.sleep(2) - -# # 1-4. refresh() 현재 페이지를 새로고침하는 함수 -# driver.refresh() -# time.sleep(2) -# print("동작 끝") -# input() - -# # 2.browser information -# # 2-1. title ~ 웹 사이트의 제목을 가져오는 함수 -# title = driver.title -# print("제목:", title) -# # 2-2. current_url ~ 현재 웹 페이지의 URL을 가져오는 함수 -# current_url = driver.current_url -# print("현재 URL:", current_url) - -# if "nid.naver.com" in current_url: -# print("지금은 로그인 하는 로직이 필요함") -# else: -# print("네이버 로그인 페이지가 아닙니다.") - - -# 3. Driver Wait (드라이버 대기) -# 3-1. 3초 때 로딩이 끝나서, element가 찾아짐. -# 3-2. 30초 까지는 기다리겠음. -# 3-3. 30초가 넘어가면 에러던짐 - -try: - selector = "#shortcutArea > ul > li:nth-child(8) > a > span.service_name" - WebDriverWait(driver, 30).until(EC.presence_of_element_located( - By.CSS_SELECTOR, selector - )) -except: - print("예외 발생, 예외 처리 코드 실행하기") -print("엘리먼트 로딩 끝") -print("다음 코드 실행") - -input() \ No newline at end of file diff --git a/backend/test_crawl/test.ipynb b/backend/test_crawl/test.ipynb deleted file mode 100644 index d03af762e..000000000 --- a/backend/test_crawl/test.ipynb +++ /dev/null @@ -1,542 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "id": "c10a33ae", - "metadata": {}, - "outputs": [], - "source": [ - "from recruit_crawler import crawl_linkareer, crawl_zighang" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "85e1eaf8", - "metadata": {}, - "outputs": [], - "source": [ - "df = crawl_zighang(max_clicks=10)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "cc84c195", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
회사명경력학력근무지직군우대사항자격요건이미지경로
0쿠팡신입학사서울서버·백엔드https://d2juy7qzamcf56.cloudfront.net/2025-06-...
1팀리부뜨3~8년차학력 무관기타서버·백엔드
2팀리부뜨2~8년차학력 무관서울서버·백엔드
3네이버클라우드경력 무관학사경기서버·백엔드https://d2juy7qzamcf56.cloudfront.net/2025-06-...
4클로봇10년차 이상학력 무관서울서버·백엔드https://d2juy7qzamcf56.cloudfront.net/2025-06-...
5코웨이7년차 이상학력 무관서울서버·백엔드https://d2juy7qzamcf56.cloudfront.net/2025-06-...
6NHN5년차 이상학력 무관경기서버·백엔드https://d2juy7qzamcf56.cloudfront.net/2025-06-...
7네이버클라우드3년차, 10년차학력 무관경기서버·백엔드https://d2juy7qzamcf56.cloudfront.net/2025-06-...
8액티부키3~10년차학력 무관전북서버·백엔드• 지도 관련 개발 경험자\\n• 결제 관련 개발 경험자\\n• B2C 플랫폼 개발 경...• 개발 3년 이상 경력의 중급개발자\\n• IntelliJ 가능\\n• Spring ...
\n", - "
" - ], - "text/plain": [ - " 회사명 경력 학력 근무지 직군 \\\n", - "0 쿠팡 신입 학사 서울 서버·백엔드 \n", - "1 팀리부뜨 3~8년차 학력 무관 기타 서버·백엔드 \n", - "2 팀리부뜨 2~8년차 학력 무관 서울 서버·백엔드 \n", - "3 네이버클라우드 경력 무관 학사 경기 서버·백엔드 \n", - "4 클로봇 10년차 이상 학력 무관 서울 서버·백엔드 \n", - "5 코웨이 7년차 이상 학력 무관 서울 서버·백엔드 \n", - "6 NHN 5년차 이상 학력 무관 경기 서버·백엔드 \n", - "7 네이버클라우드 3년차, 10년차 학력 무관 경기 서버·백엔드 \n", - "8 액티부키 3~10년차 학력 무관 전북 서버·백엔드 \n", - "\n", - " 우대사항 \\\n", - "0 \n", - "1 \n", - "2 \n", - "3 \n", - "4 \n", - "5 \n", - "6 \n", - "7 \n", - "8 • 지도 관련 개발 경험자\\n• 결제 관련 개발 경험자\\n• B2C 플랫폼 개발 경... \n", - "\n", - " 자격요건 \\\n", - "0 \n", - "1 \n", - "2 \n", - "3 \n", - "4 \n", - "5 \n", - "6 \n", - "7 \n", - "8 • 개발 3년 이상 경력의 중급개발자\\n• IntelliJ 가능\\n• Spring ... \n", - "\n", - " 이미지경로 \n", - "0 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n", - "1 \n", - "2 \n", - "3 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n", - "4 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n", - "5 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n", - "6 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n", - "7 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n", - "8 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "44657c9c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "📄 1페이지 접속 완료\n", - "🔍 20개의 공고 탐색 예정\n", - "✅ 주식회사 마카롱팩토리 (1/20, page 1) 크롤링 완료\n", - "✅ Deloitte 안진회계법인 (2/20, page 1) 크롤링 완료\n", - "✅ SK엠앤서비스 (3/20, page 1) 크롤링 완료\n", - "✅ 스타쉽엔터테인먼트 (4/20, page 1) 크롤링 완료\n", - "✅ 일동제약 (5/20, page 1) 크롤링 완료\n", - "✅ 휴비츠 (6/20, page 1) 크롤링 완료\n", - "✅ 핏펫 (7/20, page 1) 크롤링 완료\n", - "✅ 펄어비스 (8/20, page 1) 크롤링 완료\n", - "✅ 쎄믹스 (9/20, page 1) 크롤링 완료\n", - "✅ 주식회사 퍼포즈드 (10/20, page 1) 크롤링 완료\n", - "✅ SM엔터테인먼트 (11/20, page 1) 크롤링 완료\n", - "✅ 한국사회보장정보원 (12/20, page 1) 크롤링 완료\n", - "✅ 알세미 (13/20, page 1) 크롤링 완료\n", - "✅ 컴투스 (14/20, page 1) 크롤링 완료\n", - "✅ 컴투스 (15/20, page 1) 크롤링 완료\n", - "✅ SNOW (16/20, page 1) 크롤링 완료\n", - "✅ 컴투스 (17/20, page 1) 크롤링 완료\n", - "✅ Deloitte 안진회계법인 (18/20, page 1) 크롤링 완료\n", - "✅ 화승코퍼레이션 (19/20, page 1) 크롤링 완료\n", - "✅ 테슬라코리아 (20/20, page 1) 크롤링 완료\n" - ] - } - ], - "source": [ - "df2 = crawl_linkareer(max_pages=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "d30ce1fd", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
회사명기업형태모집직무세부직무자격요건
0주식회사 마카롱팩토리스타트업경기 성남시 분당구
1Deloitte 안진회계법인외국계기업서울 영등포구
2SK엠앤서비스대기업서울 중구
3스타쉽엔터테인먼트중소기업서울 강남구온라인 쇼핑몰 운영 및 CS 담당자학력 : 초대졸 이상\\n경력 : 무관(신입/경력)\\n엔터테인먼트 및 문화 사업에 관...
4일동제약중견기업서울 서초구
5휴비츠중소기업경기 안양시 동안구- 대졸 이상(전자 관련 전공)\\n- 비즈니스 영어 회화 가능자(TOEIC 700점...
6핏펫중소기업서울 강남구
7펄어비스중견기업IT/인터넷QA BeginnerMMORPG 플레이 경험이 많으신 분\\n원활한 커뮤니케이션이 가능하신 분\\n\\n[전...
8쎄믹스중소기업경기 성남시 분당구- 신입 / 경력 1년 이상 5년 이하\\n- 초대졸 이상\\n\\n[합류여정]\\n- 서...
9주식회사 퍼포즈드중소기업서울 강남구콘텐츠 마케터디자인 및 영상 제작 툴 사용 경험 포토샵, 어도비 프리미어, 어도비 일러스트레이터...
10SM엔터테인먼트대기업서울 성동구
11한국사회보장정보원공공기관/공기업서울 광진구
12알세미중소기업서울 강남구Software Engineer• 컴퓨터 과학 또는 관련 공학 학사 또는 이와 동등한 경험\\n• 기본적인 자바(J...
13컴투스중견기업서울 금천구
14컴투스중견기업서울 금천구
15SNOW대기업경기 성남시 분당구
16컴투스중견기업서울 금천구
17Deloitte 안진회계법인중견기업서울 영등포구
18화승코퍼레이션대기업해외, 서울 영등포구, 경남 양산시, 부산 기장군, 부산 연제구화승코퍼레이션_자금- 학사 이상
19테슬라코리아외국계기업서울 강남구
\n", - "
" - ], - "text/plain": [ - " 회사명 기업형태 모집직무 \\\n", - "0 주식회사 마카롱팩토리 스타트업 경기 성남시 분당구 \n", - "1 Deloitte 안진회계법인 외국계기업 서울 영등포구 \n", - "2 SK엠앤서비스 대기업 서울 중구 \n", - "3 스타쉽엔터테인먼트 중소기업 서울 강남구 \n", - "4 일동제약 중견기업 서울 서초구 \n", - "5 휴비츠 중소기업 경기 안양시 동안구 \n", - "6 핏펫 중소기업 서울 강남구 \n", - "7 펄어비스 중견기업 IT/인터넷 \n", - "8 쎄믹스 중소기업 경기 성남시 분당구 \n", - "9 주식회사 퍼포즈드 중소기업 서울 강남구 \n", - "10 SM엔터테인먼트 대기업 서울 성동구 \n", - "11 한국사회보장정보원 공공기관/공기업 서울 광진구 \n", - "12 알세미 중소기업 서울 강남구 \n", - "13 컴투스 중견기업 서울 금천구 \n", - "14 컴투스 중견기업 서울 금천구 \n", - "15 SNOW 대기업 경기 성남시 분당구 \n", - "16 컴투스 중견기업 서울 금천구 \n", - "17 Deloitte 안진회계법인 중견기업 서울 영등포구 \n", - "18 화승코퍼레이션 대기업 해외, 서울 영등포구, 경남 양산시, 부산 기장군, 부산 연제구 \n", - "19 테슬라코리아 외국계기업 서울 강남구 \n", - "\n", - " 세부직무 자격요건 \n", - "0 \n", - "1 \n", - "2 \n", - "3 온라인 쇼핑몰 운영 및 CS 담당자 학력 : 초대졸 이상\\n경력 : 무관(신입/경력)\\n엔터테인먼트 및 문화 사업에 관... \n", - "4 \n", - "5 - 대졸 이상(전자 관련 전공)\\n- 비즈니스 영어 회화 가능자(TOEIC 700점... \n", - "6 \n", - "7 QA Beginner MMORPG 플레이 경험이 많으신 분\\n원활한 커뮤니케이션이 가능하신 분\\n\\n[전... \n", - "8 - 신입 / 경력 1년 이상 5년 이하\\n- 초대졸 이상\\n\\n[합류여정]\\n- 서... \n", - "9 콘텐츠 마케터 디자인 및 영상 제작 툴 사용 경험 포토샵, 어도비 프리미어, 어도비 일러스트레이터... \n", - "10 \n", - "11 \n", - "12 Software Engineer • 컴퓨터 과학 또는 관련 공학 학사 또는 이와 동등한 경험\\n• 기본적인 자바(J... \n", - "13 \n", - "14 \n", - "15 \n", - "16 \n", - "17 \n", - "18 화승코퍼레이션_자금 - 학사 이상 \n", - "19 " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "405b7b7f", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "python313", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -}