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",
- " company_name | \n",
- " company_type | \n",
- " main_job | \n",
- " detail_job | \n",
- " location | \n",
- " qualification | \n",
- " process | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 삼성전자 | \n",
- " 대기업 | \n",
- " 반도체 | \n",
- " 공정 엔지니어 | \n",
- " 수원 | \n",
- " 학사 이상 | \n",
- " 서류-면접-최종 | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " LG전자 | \n",
- " 대기업 | \n",
- " 가전 | \n",
- " R&D | \n",
- " 서울 | \n",
- " 학사 이상 | \n",
- " 서류-코딩-면접 | \n",
- "
\n",
- " \n",
- "
\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",
- " id | \n",
- " company_name | \n",
- " company_type | \n",
- " main_job | \n",
- " detail_job | \n",
- " location | \n",
- " qualification | \n",
- " process | \n",
- " created_at | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 1 | \n",
- " 삼성전자 | \n",
- " 대기업 | \n",
- " 반도체 공정 | \n",
- " 회로 설계 | \n",
- " 수원 | \n",
- " 학사 이상, 전공 무관 | \n",
- " 서류 - 면접 - 최종 | \n",
- " 2025-05-08 11:04:51.605152 | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 2 | \n",
- " 삼성전자 | \n",
- " 대기업 | \n",
- " 반도체 공정 | \n",
- " 회로 설계 | \n",
- " 수원 | \n",
- " 학사 이상, 전공 무관 | \n",
- " 서류 - 면접 - 최종 | \n",
- " 2025-05-08 11:05:35.465879 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 3 | \n",
- " 삼성전자 | \n",
- " 대기업 | \n",
- " 반도체 | \n",
- " 공정 엔지니어 | \n",
- " 수원 | \n",
- " 학사 이상 | \n",
- " 서류-면접-최종 | \n",
- " 2025-05-08 11:26:08.031186 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 4 | \n",
- " LG전자 | \n",
- " 대기업 | \n",
- " 가전 | \n",
- " R&D | \n",
- " 서울 | \n",
- " 학사 이상 | \n",
- " 서류-코딩-면접 | \n",
- " 2025-05-08 11:26:08.031186 | \n",
- "
\n",
- " \n",
- "
\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",
- " id | \n",
- " company | \n",
- " division | \n",
- " job_title | \n",
- " apply_term | \n",
- " university | \n",
- " major | \n",
- " gpa | \n",
- " gpa_scale | \n",
- " toeic | \n",
- " opic | \n",
- " toeic_speaking | \n",
- " work_experience | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 1 | \n",
- " 삼성전자 | \n",
- " DS부문 | \n",
- " 반도체공정기술 | \n",
- " 2024 상반기 | \n",
- " 홍익대학교 | \n",
- " 화학공학과 | \n",
- " 4.39 | \n",
- " 4.5 | \n",
- " 905 | \n",
- " IH | \n",
- " None | \n",
- " None | \n",
- "
\n",
- " \n",
- "
\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",
- " id | \n",
- " applicant_id | \n",
- " certification_name | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 1 | \n",
- " 1 | \n",
- " SQLD | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 2 | \n",
- " 1 | \n",
- " 리눅스마스터 2급 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 3 | \n",
- " 1 | \n",
- " 정보처리기사 | \n",
- "
\n",
- " \n",
- "
\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",
- " | 0 | \n",
- " 쿠팡 | \n",
- " 신입 | \n",
- " 학사 | \n",
- " 서울 | \n",
- " 서버·백엔드, 안드로이드, iOS | \n",
- " downloads/쿠팡_공고2.png | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 팀리부뜨 | \n",
- " 3~8년차 | \n",
- " 학력 무관 | \n",
- " 기타 | \n",
- " 서버·백엔드, DevOps·SRE | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 팀리부뜨 | \n",
- " 2~8년차 | \n",
- " 학력 무관 | \n",
- " 서울 | \n",
- " 서버·백엔드 | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 네이버클라우드 | \n",
- " 경력 무관 | \n",
- " 학사 | \n",
- " 경기 | \n",
- " 기타교육, 서버·백엔드 | \n",
- " downloads/네이버클라우드_공고5.png | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 클로봇 | \n",
- " 10년차 이상 | \n",
- " 학력 무관 | \n",
- " 서울 | \n",
- " 기타엔지니어링·R&D, 로봇SW, 서버·백엔드, 프론트엔드 | \n",
- " downloads/클로봇_공고6.png | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 5 | \n",
- " 코웨이 | \n",
- " 7년차 이상 | \n",
- " 학력 무관 | \n",
- " 서울 | \n",
- " 서버·백엔드, 사물인터넷(IoT), DevOps·SRE | \n",
- " downloads/코웨이_공고7.png | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 6 | \n",
- " NHN | \n",
- " 5년차 이상 | \n",
- " 학력 무관 | \n",
- " 경기 | \n",
- " 서버·백엔드, 소프트웨어 엔지니어, 게임개발(서버) | \n",
- " downloads/NHN_공고8.png | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 7 | \n",
- " 네이버클라우드 | \n",
- " 3년차, 10년차 | \n",
- " 학력 무관 | \n",
- " 경기 | \n",
- " 안드로이드, iOS, 프론트엔드, 서버·백엔드 | \n",
- " downloads/네이버클라우드_공고9.png | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 8 | \n",
- " 액티부키 | \n",
- " 3~10년차 | \n",
- " 학력 무관 | \n",
- " 전북 | \n",
- " 서버·백엔드, 백엔드, 웹풀스택 | \n",
- " | \n",
- " • 지도 관련 개발 경험자\\n• 결제 관련 개발 경험자\\n• B2C 플랫폼 개발 경... | \n",
- " • 개발 3년 이상 경력의 중급개발자\\n• IntelliJ 가능\\n• Spring ... | \n",
- "
\n",
- " \n",
- "
\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",
- " | 0 | \n",
- " 쿠팡 | \n",
- " 신입 | \n",
- " 학사 | \n",
- " 서울 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 팀리부뜨 | \n",
- " 3~8년차 | \n",
- " 학력 무관 | \n",
- " 기타 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 팀리부뜨 | \n",
- " 2~8년차 | \n",
- " 학력 무관 | \n",
- " 서울 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 네이버클라우드 | \n",
- " 경력 무관 | \n",
- " 학사 | \n",
- " 경기 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 클로봇 | \n",
- " 10년차 이상 | \n",
- " 학력 무관 | \n",
- " 서울 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
- "
\n",
- " \n",
- " | 5 | \n",
- " 코웨이 | \n",
- " 7년차 이상 | \n",
- " 학력 무관 | \n",
- " 서울 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
- "
\n",
- " \n",
- " | 6 | \n",
- " NHN | \n",
- " 5년차 이상 | \n",
- " 학력 무관 | \n",
- " 경기 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
- "
\n",
- " \n",
- " | 7 | \n",
- " 네이버클라우드 | \n",
- " 3년차, 10년차 | \n",
- " 학력 무관 | \n",
- " 경기 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
- "
\n",
- " \n",
- " | 8 | \n",
- " 액티부키 | \n",
- " 3~10년차 | \n",
- " 학력 무관 | \n",
- " 전북 | \n",
- " 서버·백엔드 | \n",
- " • 지도 관련 개발 경험자\\n• 결제 관련 개발 경험자\\n• B2C 플랫폼 개발 경... | \n",
- " • 개발 3년 이상 경력의 중급개발자\\n• IntelliJ 가능\\n• Spring ... | \n",
- " | \n",
- "
\n",
- " \n",
- "
\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",
- " | 0 | \n",
- " 플랜핏 | \n",
- " 중소기업 | \n",
- " IT/인터넷 | \n",
- " | \n",
- " - IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용... | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 리얼드로우 | \n",
- " 중소기업 | \n",
- " 서울 마포구 | \n",
- " SW Engineer | \n",
- " - 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n... | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 주식회사 화이트큐브 | \n",
- " 스타트업 | \n",
- " 서울 강남구 | \n",
- " 콘텐츠 디자이너 인턴 | \n",
- " 그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자... | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 주식회사 화이트큐브 | \n",
- " 스타트업 | \n",
- " 서울 강남구 | \n",
- " 백엔드 개발자 인턴 | \n",
- " • Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n•... | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 놀유니버스 | \n",
- " 중견기업 | \n",
- " 경기 성남시 수정구 | \n",
- " 브랜드 마케팅 지원 담당자 | \n",
- " 브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트... | \n",
- "
\n",
- " \n",
- " | 5 | \n",
- " 진에어 | \n",
- " 대기업 | \n",
- " 서울 강서구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 6 | \n",
- " 이앤에스글로벌 | \n",
- " 중견기업 | \n",
- " 서울 강남구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 7 | \n",
- " CJ푸드빌 | \n",
- " 대기업 | \n",
- " 서울 중구 | \n",
- " 데이터 전략·분석 전문가 | \n",
- " - 4년제 학사 졸 이상\\n- 관련 학과 : 컴퓨터공학, 산업공학, 경영정보, 문헌... | \n",
- "
\n",
- " \n",
- " | 8 | \n",
- " CJ푸드빌 | \n",
- " 대기업 | \n",
- " 서울 중구 | \n",
- " 디지털서비스 APP 개발자 | \n",
- " - 4년제 대학 졸업자 이상\\n- 컴퓨터공학, 산업공학, 소프트웨어공학 등 관련학과... | \n",
- "
\n",
- " \n",
- " | 9 | \n",
- " 삼성전자 | \n",
- " 대기업 | \n",
- " 경기 수원시 영통구 | \n",
- " [VD사업부] Product Partnership | \n",
- " | \n",
- "
\n",
- " \n",
- " | 10 | \n",
- " 코레일네트웍스 | \n",
- " 공공기관/공기업 | \n",
- " 서울 용산구, 서울 구로구, 인천 연수구, 경기 과천시, 부산 동래구 | \n",
- " 일반직6급 | \n",
- " 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 인적성검사 - 필기전형 - ... | \n",
- "
\n",
- " \n",
- " | 11 | \n",
- " 주식회사 놀유니버스 | \n",
- " 중견기업 | \n",
- " 경기 성남시 수정구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 12 | \n",
- " 한미그룹 | \n",
- " 대기업 | \n",
- " 서울 송파구 | \n",
- " [한미약품] Medical | \n",
- " | \n",
- "
\n",
- " \n",
- " | 13 | \n",
- " 국가정보원 | \n",
- " 공공기관/공기업 | \n",
- " 서울 강남구 | \n",
- " 해외정보 | \n",
- " 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n... | \n",
- "
\n",
- " \n",
- " | 14 | \n",
- " NHN Cloud | \n",
- " 중견기업 | \n",
- " 경기 성남시 분당구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 15 | \n",
- " NHN Cloud | \n",
- " 중견기업 | \n",
- " 경기 성남시 분당구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 16 | \n",
- " NHN Cloud | \n",
- " 중견기업 | \n",
- " 경기 성남시 분당구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 17 | \n",
- " EY한영 | \n",
- " 외국계기업 | \n",
- " 서울 영등포구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 18 | \n",
- " Toss | \n",
- " 중소기업 | \n",
- " IT/인터넷, 마케팅/광고/홍보, 영업/고객상담, 서비스 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 19 | \n",
- " SNOW | \n",
- " 대기업 | \n",
- " 경기 성남시 분당구 | \n",
- " 남미 타겟 EPIK 콘텐츠 마케팅 체험형 인턴 | \n",
- " | \n",
- "
\n",
- " \n",
- "
\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",
- " | 0 | \n",
- " 플랜핏 | \n",
- " 중소기업 | \n",
- " IT/인터넷 | \n",
- " | \n",
- " - IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용... | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 리얼드로우 | \n",
- " 중소기업 | \n",
- " 서울 마포구 | \n",
- " SW Engineer | \n",
- " - 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n... | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 주식회사 화이트큐브 | \n",
- " 스타트업 | \n",
- " 서울 강남구 | \n",
- " 콘텐츠 디자이너 인턴 | \n",
- " 그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자... | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 주식회사 화이트큐브 | \n",
- " 스타트업 | \n",
- " 서울 강남구 | \n",
- " 백엔드 개발자 인턴 | \n",
- " • Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n•... | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 놀유니버스 | \n",
- " 중견기업 | \n",
- " 경기 성남시 수정구 | \n",
- " 브랜드 마케팅 지원 담당자 | \n",
- " 브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트... | \n",
- "
\n",
- " \n",
- " | ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- "
\n",
- " \n",
- " | 95 | \n",
- " 한국하니웰 | \n",
- " 중견기업 | \n",
- " 서울 마포구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 96 | \n",
- " 스타쉽엔터테인먼트 | \n",
- " 대기업 | \n",
- " 서울 강남구 | \n",
- " | \n",
- " - 학력 : 초대졸 이상\\n- 경력 : 무관(신입/경력)\\n- 엔터테인먼트 및 문화... | \n",
- "
\n",
- " \n",
- " | 97 | \n",
- " 경신 | \n",
- " 대기업 | \n",
- " 인천 연수구, 인천 연수구, 경기 화성시, 전북특별자치도 군산시, 경기 의왕시 | \n",
- " 채용연계형 인턴-영업-원가 | \n",
- " | \n",
- "
\n",
- " \n",
- " | 98 | \n",
- " 앳홈 | \n",
- " 중소기업 | \n",
- " 경영/사무, 마케팅/광고/홍보, IT/인터넷 | \n",
- " 인플루언서 커머스 AMD | \n",
- " 유튜브, 인스타그램 등 콘텐츠 플랫폼을 자주 보고, 트렌드에 관심 많은 분\\n인플루... | \n",
- "
\n",
- " \n",
- " | 99 | \n",
- " 현대오토에버 | \n",
- " 대기업 | \n",
- " 서울 강남구, 울산 북구, 경기 화성시, 충남 아산시, 경기 의왕시 | \n",
- " -디지털 경험- | \n",
- " 최종학력 4년제 대졸 이상\\n남성의 경우 군필 또는 면제자\\n해외여행 결격사유가 없... | \n",
- "
\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",
- " | 0 | \n",
- " 플랜핏 | \n",
- " 중소기업 | \n",
- " IT/인터넷 | \n",
- " NaN | \n",
- " - IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용... | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 리얼드로우 | \n",
- " 중소기업 | \n",
- " 서울 마포구 | \n",
- " SW Engineer | \n",
- " - 하단 상세 공고 참조\\n\\n[전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n... | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 주식회사 화이트큐브 | \n",
- " 스타트업 | \n",
- " 서울 강남구 | \n",
- " 콘텐츠 디자이너 인턴 | \n",
- " 그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자... | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 주식회사 화이트큐브 | \n",
- " 스타트업 | \n",
- " 서울 강남구 | \n",
- " 백엔드 개발자 인턴 | \n",
- " • Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n•... | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 놀유니버스 | \n",
- " 중견기업 | \n",
- " 경기 성남시 수정구 | \n",
- " 브랜드 마케팅 지원 담당자 | \n",
- " 브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트... | \n",
- "
\n",
- " \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",
- " company_name | \n",
- " company_type | \n",
- " main_job | \n",
- " detail_job | \n",
- " location | \n",
- " qualification | \n",
- " process | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 플랜핏 | \n",
- " 중소기업 | \n",
- " IT/인터넷 | \n",
- " | \n",
- " None | \n",
- " - IT 서비스 PM & PO 관련된 업무에 관해 실제로 경험이 있는 분\\n- 사용... | \n",
- " [인재 영입 프로세스]\\n- 서류 전형 -> 1차 직무 인터뷰 -> 2차 컬쳐핏 인... | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 리얼드로우 | \n",
- " 중소기업 | \n",
- " None | \n",
- " SW Engineer | \n",
- " 서울 마포구 | \n",
- " - 하단 상세 공고 참조 | \n",
- " [전형 안내]\\n서류전형 - 면접전형 - 최종합격\\n\\n*이메일 접수: people... | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 주식회사 화이트큐브 | \n",
- " 스타트업 | \n",
- " None | \n",
- " 콘텐츠 디자이너 인턴 | \n",
- " 서울 강남구 | \n",
- " 그래픽 툴(Figma, Photoshop, Illustrator 등)을 활용한 디자... | \n",
- " [전형 안내]\\n서류전형 - 면접전형 - 최종합격 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 주식회사 화이트큐브 | \n",
- " 스타트업 | \n",
- " None | \n",
- " 백엔드 개발자 인턴 | \n",
- " 서울 강남구 | \n",
- " • Python 또는 Node.js, Go 등 하나 이상의 언어에 익숙하신 분\\n•... | \n",
- " [전형 안내]\\n서류전형 - 면접전형 - 최종합격 | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 놀유니버스 | \n",
- " 중견기업 | \n",
- " None | \n",
- " 브랜드 마케팅 지원 담당자 | \n",
- " 경기 성남시 수정구 | \n",
- " 브랜드 콘텐츠와 마케팅에 관심이 많고, 즐겁게 배워보고 싶은 분\\n디지털 콘텐츠 트... | \n",
- " [전형 안내]\\n서류전형 - 면접전형 - 최종합격 | \n",
- "
\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",
- " | 0 | \n",
- " 삼성전자DS / 5급 제조직 / 2024 하반기 | \n",
- " 고졸 / 회계 / 학점 X / 사회생활 경험: 중소기업 사무직 1년 4개월 / 한국... | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 삼성전자DS / 패키지개발 / 2024 하반기 | \n",
- " 중앙대 / 기계공학부 / 학점 4.2 / 오픽: AL / 사회생활 경험: 인턴 / ... | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 삼성전자서비스 / 경영지원직 / 2024 하반기 | \n",
- " 인하대 / 산업경영공학, 통계학 / 학점 3.93 / 토익: 725, 오픽: IM2... | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 삼성전자 / DS부문_혁신센터_SW개발 / 2024 하반기 | \n",
- " 건동홍 / 융합소프트웨어 / 학점 4.09/4.5 / 토익: 855, 토익스피킹: ... | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 삼성전자 / DS부문_메모리사업부_반도체공정기술 / 2024 하반기 | \n",
- " 성균관대학교 / 나노공학과 / 학점 3.84/4.13 / 토익: 880, 오픽: I... | \n",
- "
\n",
- " \n",
- " | 5 | \n",
- " 삼성전자 / DX부문 SCSA / 2024 하반기 | \n",
- " 지거국 / 불어불문학/경영학 / 학점 3.67/4.5 / 토익스피킹: 150 / 마... | \n",
- "
\n",
- " \n",
- " | 6 | \n",
- " 삼성전자 / 파운드리 사업부 / 2024 하반기 | \n",
- " 지방사립대 / 산업경영공학 / 학점 4.35 / 토익스피킹: 150 / IH / 사... | \n",
- "
\n",
- " \n",
- " | 7 | \n",
- " 삼성전자 / 삼성전자DS 글로벌 제조&인프라총괄 – 인프라기술(Gas/Chemica... | \n",
- " 한양대학교 ERICA / 기계공학과 / 학점 3.87/4.5 / 오픽: IH | \n",
- "
\n",
- " \n",
- " | 8 | \n",
- " 삼성전자 / DA사업부_SCM/물류 / 2024 하반기 | \n",
- " 중앙대 / 국제물류학 / 학점 4.29/4.5 / 오픽: IH / 사회생활 경험: ... | \n",
- "
\n",
- " \n",
- " | 9 | \n",
- " 삼성전자 / Test&System Package총괄_평가및분석 / 2024 하반기 | \n",
- " 단국대(천안) / 신소재공학과 / 학점 3.71 / 토익스피킹: 130/IM3 / ... | \n",
- "
\n",
- " \n",
- " | 10 | \n",
- " 삼성전자 / DS 부문 System LSI사업부_SW개발 / 2024 하반기 | \n",
- " 지거국 / 전자공학부 / 학점 3.91 / IM2 / 학부연구생 6개월 | \n",
- "
\n",
- " \n",
- " | 11 | \n",
- " 삼성전자 / 인프라기술 / 2024 하반기 | \n",
- " 한양대학교 ERICA / 기계공학과 / 학점 3.87 / 오픽 : IH | \n",
- "
\n",
- " \n",
- " | 12 | \n",
- " 삼성전자 / DS 부문 메모리사업부 영업마케팅 / 2024 하반기 | \n",
- " 연세대 / 불문, 경영 / 학점 4.1/4.3 / 오픽 AL, 토익 915, DEL... | \n",
- "
\n",
- " \n",
- " | 13 | \n",
- " 삼성전자 / DX 부문_MX 사업부 해외영업 / 2024 하반기 | \n",
- " 가천대 / 영미어문/글로벌경영 / 학점 3.5 / 오픽 al | \n",
- "
\n",
- " \n",
- " | 14 | \n",
- " 삼성전자 / DS부문_메모리사업부 회로설계 / 2024 상반기 | \n",
- " 경희대 / 전자공학 / 학점 4.09/4.5 / 오픽: IH | \n",
- "
\n",
- " \n",
- " | 15 | \n",
- " 삼성전자 / DX부문_생산기술연구소 기구개발 / 2024 상반기 | \n",
- " 인가경 / 기계공학과 / 학점 4.19/4.5 / 오픽: IM1 / 학부연구생, 학... | \n",
- "
\n",
- " \n",
- " | 16 | \n",
- " 삼성전자 / DS부문 메모리사업부_반도체공정기술 / 2024 상반기 | \n",
- " 지거국 / X / 학점 3.73/4.5 / 오픽: IH / 사회생활 경험: 포스코 ... | \n",
- "
\n",
- " \n",
- " | 17 | \n",
- " 삼성전자 / DS부문 CTO-반도체연구소_반도체공정기술 / 2024 상반기 | \n",
- " 인서울 / 화학공학과 / 학점 3.8/4.5 / 토익: 820, 오픽: IM2 | \n",
- "
\n",
- " \n",
- " | 18 | \n",
- " 삼성전자 / DX부문 DA사업부 SW개발 / 2024 상반기 | \n",
- " 연세대 / 인공지능학 / 학점 4.09 / 오픽: IL / 사회생활 경험: 인턴 경... | \n",
- "
\n",
- " \n",
- " | 19 | \n",
- " 삼성전자 / SW개발 / 2024 상반기 | \n",
- " 수도권 4년제 / 컴퓨터공학과 / 학점 4.1/4.5 / 오픽: im / sw마에스트로 | \n",
- "
\n",
- " \n",
- "
\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",
- " company | \n",
- " division | \n",
- " job_title | \n",
- " apply_term | \n",
- " university | \n",
- " major | \n",
- " gpa | \n",
- " gpa_scale | \n",
- " toeic | \n",
- " opic | \n",
- " toeic_speaking | \n",
- " work_experience | \n",
- " other_certifications | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 삼성전자 | \n",
- " DS부문 제조&기술담당 | \n",
- " 반도체공정기술 | \n",
- " 2024 상반기 | \n",
- " 홍익대학교 | \n",
- " 화학공학과 | \n",
- " 4.39 | \n",
- " 4.5 | \n",
- " 905 | \n",
- " IH | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 삼성전자 | \n",
- " DA사업부 SW개발 | \n",
- " | \n",
- " 2024 상반기 | \n",
- " 인하대학교 | \n",
- " 컴퓨터공학과 | \n",
- " 3.47 | \n",
- " | \n",
- " | \n",
- " IM2 | \n",
- " | \n",
- " | \n",
- " 기타: SQLD, 리눅스마스터 2급, 정보처리기사 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 삼성전자 | \n",
- " AVP 사업팀 | \n",
- " 패키지 개발 | \n",
- " 2024 상반기 | \n",
- " 산기대 | \n",
- " 생명화학공학과 | \n",
- " 3.69 | \n",
- " | \n",
- " 750 | \n",
- " IM2 | \n",
- " | \n",
- " 앰코코리아 1년 | \n",
- " | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 삼성전자 | \n",
- " DS 평가 및 분석 | \n",
- " | \n",
- " 2024 상반기 | \n",
- " 서성한 | \n",
- " 기계공학 | \n",
- " 4.13 | \n",
- " 4.5 | \n",
- " | \n",
- " IM2 | \n",
- " | \n",
- " 삼성전자DS 장기현장실습 | \n",
- " | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 삼성전자 | \n",
- " DS부문 Test&System Package총괄 | \n",
- " 패키지개발 | \n",
- " 2024 상반기 | \n",
- " 중앙대 | \n",
- " 기계공학과 | \n",
- " 4.31 | \n",
- " 4.5 | \n",
- " | \n",
- " AL | \n",
- " | \n",
- " | \n",
- " 한국사검정시험: 고급, 컴퓨터활용능력: 1급, 기타: 운전면허 | \n",
- "
\n",
- " \n",
- " | 5 | \n",
- " 삼성전자 | \n",
- " DS 제조&기술담당 | \n",
- " 반도체공정기술 | \n",
- " 2024 상반기 | \n",
- " 홍익대학교 | \n",
- " 화학공학과 | \n",
- " 4.39 | \n",
- " 4.5 | \n",
- " 905 | \n",
- " Ih | \n",
- " | \n",
- " | \n",
- " 공정실습, 데이터분석 교육 | \n",
- "
\n",
- " \n",
- " | 6 | \n",
- " 삼성전자 | \n",
- " 파운드리사업부 | \n",
- " 회로설계 | \n",
- " 2024 상반기 | \n",
- " 인하대학교 | \n",
- " 정보통신공학과 | \n",
- " 3.85 | \n",
- " 4.5 | \n",
- " | \n",
- " IH | \n",
- " | \n",
- " 한국철도기술연구원 인턴 1회 | \n",
- " 우수논문상 수상, VE경진대회 입상 | \n",
- "
\n",
- " \n",
- " | 7 | \n",
- " 삼성전자 | \n",
- " AVP사업팀 | \n",
- " 반도체공정기술 | \n",
- " 2024 상반기 | \n",
- " 숭실대 | \n",
- " 전기공학부 | \n",
- " 3.82 | \n",
- " 4.5 | \n",
- " | \n",
- " IM1 | \n",
- " | \n",
- " | \n",
- " 캡스톤,특허유니버시아드, 컴퓨터활용능력: 1급 | \n",
- "
\n",
- " \n",
- " | 8 | \n",
- " 삼성전자 | \n",
- " CTO_반도체연구소_반도체공정기술 | \n",
- " | \n",
- " 2024 상반기 | \n",
- " 건동홍 | \n",
- " 화학공학 | \n",
- " 3.5 | \n",
- " 4.5 | \n",
- " | \n",
- " AL | \n",
- " | \n",
- " 장비사 1년 | \n",
- " | \n",
- "
\n",
- " \n",
- " | 9 | \n",
- " 삼성전자 | \n",
- " SW개발 | \n",
- " | \n",
- " 2024 상반기 | \n",
- " 지방 | \n",
- " 전자공학, 컴퓨터공학 | \n",
- " 4.04 | \n",
- " 4.5 | \n",
- " | \n",
- " | \n",
- " 140 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- "
\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",
- " main_id | \n",
- " certification_name | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " 1 | \n",
- " SQLD | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 1 | \n",
- " 리눅스마스터 2급 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 1 | \n",
- " 정보처리기사 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 4 | \n",
- " 한국사검정시험: 고급 | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 4 | \n",
- " 컴퓨터활용능력: 1급 | \n",
- "
\n",
- " \n",
- " | 5 | \n",
- " 4 | \n",
- " 운전면허 | \n",
- "
\n",
- " \n",
- " | 6 | \n",
- " 5 | \n",
- " 공정실습 | \n",
- "
\n",
- " \n",
- " | 7 | \n",
- " 5 | \n",
- " 데이터분석 교육 | \n",
- "
\n",
- " \n",
- " | 8 | \n",
- " 6 | \n",
- " 우수논문상 수상 | \n",
- "
\n",
- " \n",
- " | 9 | \n",
- " 6 | \n",
- " VE경진대회 입상 | \n",
- "
\n",
- " \n",
- "
\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",
- " | 0 | \n",
- " 쿠팡 | \n",
- " 신입 | \n",
- " 학사 | \n",
- " 서울 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " 팀리부뜨 | \n",
- " 3~8년차 | \n",
- " 학력 무관 | \n",
- " 기타 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " 팀리부뜨 | \n",
- " 2~8년차 | \n",
- " 학력 무관 | \n",
- " 서울 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 네이버클라우드 | \n",
- " 경력 무관 | \n",
- " 학사 | \n",
- " 경기 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 클로봇 | \n",
- " 10년차 이상 | \n",
- " 학력 무관 | \n",
- " 서울 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
- "
\n",
- " \n",
- " | 5 | \n",
- " 코웨이 | \n",
- " 7년차 이상 | \n",
- " 학력 무관 | \n",
- " 서울 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
- "
\n",
- " \n",
- " | 6 | \n",
- " NHN | \n",
- " 5년차 이상 | \n",
- " 학력 무관 | \n",
- " 경기 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
- "
\n",
- " \n",
- " | 7 | \n",
- " 네이버클라우드 | \n",
- " 3년차, 10년차 | \n",
- " 학력 무관 | \n",
- " 경기 | \n",
- " 서버·백엔드 | \n",
- " | \n",
- " | \n",
- " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
- "
\n",
- " \n",
- " | 8 | \n",
- " 액티부키 | \n",
- " 3~10년차 | \n",
- " 학력 무관 | \n",
- " 전북 | \n",
- " 서버·백엔드 | \n",
- " • 지도 관련 개발 경험자\\n• 결제 관련 개발 경험자\\n• B2C 플랫폼 개발 경... | \n",
- " • 개발 3년 이상 경력의 중급개발자\\n• IntelliJ 가능\\n• Spring ... | \n",
- " | \n",
- "
\n",
- " \n",
- "
\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",
- " | 0 | \n",
- " 주식회사 마카롱팩토리 | \n",
- " 스타트업 | \n",
- " 경기 성남시 분당구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " Deloitte 안진회계법인 | \n",
- " 외국계기업 | \n",
- " 서울 영등포구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " SK엠앤서비스 | \n",
- " 대기업 | \n",
- " 서울 중구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " 스타쉽엔터테인먼트 | \n",
- " 중소기업 | \n",
- " 서울 강남구 | \n",
- " 온라인 쇼핑몰 운영 및 CS 담당자 | \n",
- " 학력 : 초대졸 이상\\n경력 : 무관(신입/경력)\\n엔터테인먼트 및 문화 사업에 관... | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " 일동제약 | \n",
- " 중견기업 | \n",
- " 서울 서초구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 5 | \n",
- " 휴비츠 | \n",
- " 중소기업 | \n",
- " 경기 안양시 동안구 | \n",
- " | \n",
- " - 대졸 이상(전자 관련 전공)\\n- 비즈니스 영어 회화 가능자(TOEIC 700점... | \n",
- "
\n",
- " \n",
- " | 6 | \n",
- " 핏펫 | \n",
- " 중소기업 | \n",
- " 서울 강남구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 7 | \n",
- " 펄어비스 | \n",
- " 중견기업 | \n",
- " IT/인터넷 | \n",
- " QA Beginner | \n",
- " MMORPG 플레이 경험이 많으신 분\\n원활한 커뮤니케이션이 가능하신 분\\n\\n[전... | \n",
- "
\n",
- " \n",
- " | 8 | \n",
- " 쎄믹스 | \n",
- " 중소기업 | \n",
- " 경기 성남시 분당구 | \n",
- " | \n",
- " - 신입 / 경력 1년 이상 5년 이하\\n- 초대졸 이상\\n\\n[합류여정]\\n- 서... | \n",
- "
\n",
- " \n",
- " | 9 | \n",
- " 주식회사 퍼포즈드 | \n",
- " 중소기업 | \n",
- " 서울 강남구 | \n",
- " 콘텐츠 마케터 | \n",
- " 디자인 및 영상 제작 툴 사용 경험 포토샵, 어도비 프리미어, 어도비 일러스트레이터... | \n",
- "
\n",
- " \n",
- " | 10 | \n",
- " SM엔터테인먼트 | \n",
- " 대기업 | \n",
- " 서울 성동구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 11 | \n",
- " 한국사회보장정보원 | \n",
- " 공공기관/공기업 | \n",
- " 서울 광진구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 12 | \n",
- " 알세미 | \n",
- " 중소기업 | \n",
- " 서울 강남구 | \n",
- " Software Engineer | \n",
- " • 컴퓨터 과학 또는 관련 공학 학사 또는 이와 동등한 경험\\n• 기본적인 자바(J... | \n",
- "
\n",
- " \n",
- " | 13 | \n",
- " 컴투스 | \n",
- " 중견기업 | \n",
- " 서울 금천구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 14 | \n",
- " 컴투스 | \n",
- " 중견기업 | \n",
- " 서울 금천구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 15 | \n",
- " SNOW | \n",
- " 대기업 | \n",
- " 경기 성남시 분당구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 16 | \n",
- " 컴투스 | \n",
- " 중견기업 | \n",
- " 서울 금천구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 17 | \n",
- " Deloitte 안진회계법인 | \n",
- " 중견기업 | \n",
- " 서울 영등포구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " | 18 | \n",
- " 화승코퍼레이션 | \n",
- " 대기업 | \n",
- " 해외, 서울 영등포구, 경남 양산시, 부산 기장군, 부산 연제구 | \n",
- " 화승코퍼레이션_자금 | \n",
- " - 학사 이상 | \n",
- "
\n",
- " \n",
- " | 19 | \n",
- " 테슬라코리아 | \n",
- " 외국계기업 | \n",
- " 서울 강남구 | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- "
\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
-}