From 0caedf8f3b9bed576594925544ab6c6b8379f022 Mon Sep 17 00:00:00 2001 From: HanbinKim1004 <77422840+HanbinKim1004@users.noreply.github.com> Date: Fri, 4 Feb 2022 00:45:30 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=ED=81=AC=EB=A1=A4=EB=A7=81=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=9C=20=EC=9E=AC=EC=97=85=EB=A1=9C=EB=93=9C=ED=95=A9?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 크롤링 과제 재업로드합니다. --- ...352\271\200\355\225\234\353\271\210.ipynb" | 682 ++++++++++++++++++ 1 file changed, 682 insertions(+) create mode 100644 "[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" diff --git "a/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" "b/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" new file mode 100644 index 0000000..3d2c789 --- /dev/null +++ "b/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" @@ -0,0 +1,682 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "#크롬드라이버 경로 설정\n", + "import sys\n", + "sys.path.insert(0, '/usr/lib/chromium-browser/chromedriver')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\rlagk\\anaconda3\\lib\\site-packages\\requests\\__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.8) or chardet (3.0.4) doesn't match a supported version!\n", + " warnings.warn(\"urllib3 ({}) or chardet ({}) doesn't match a supported \"\n" + ] + } + ], + "source": [ + "#정보요청 라이브러리 import\n", + "import requests\n", + "\n", + "#크롤링 라이브러리 import|\n", + "from bs4 import BeautifulSoup " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 기본과제(필수) : \n", + "\n", + "사람인의 채용정보 페이지에서 추천 지역의 아래의 회사명, 제목을 40개 뽑아 데이터프레임으로 생성하세요. (beautifulsoup 활용)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "200" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#사람인에 정보요청\n", + "saramin = requests.get(\"https://www.saramin.co.kr/zf_user/\")\n", + "\n", + "# 사람인 응답코드 확인\n", + "saramin.status_code" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "#User-Agent 지정\n", + "headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#크롤링 할 대상 url 지정\n", + "url = 'https://www.saramin.co.kr/zf_user/jobs/list/domestic'\n", + "\n", + "#크롤링 대상 url과 headers를 기반으로 정보 요청\n", + "res = requests.get(url, headers = headers)\n", + "\n", + "#정상적으로 정보를 받은 경우 지속, 그렇지 않은 경우 중지\n", + "res.raise_for_status()\n", + "\n", + "#html문서를 beautifulsoup의 lxml 형태로 변환\n", + "soup = BeautifulSoup(res.text, 'lxml') " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# 추천지역 섹션을 find해서 list_body로 할당 \n", + "list_body = soup.find('div', attrs = {'class' : 'list_body'})\n", + "\n", + "# listbody 중 회사명 정보가 있는 col company_nm부분을 company_nm에 할당 \n", + "company_nm = list_body.findAll('div', attrs = {'class' : 'col company_nm'})\n", + "\n", + "# listbody 중 제목정보가 있는 col notification_info부분을 company_info에 할당 \n", + "company_info = list_body.findAll('div', attrs = {'class' : 'col notification_info'})" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# 기업명 정보 corp_list를 생성 \n", + "corp_list = []\n", + "\n", + "# 제목에 해당하는 title데이터를 for문으로 corp_list에 추가해줌\n", + "for i in company_nm:\n", + " corp = i.a['title']\n", + " corp_list.append(corp)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# 제목 정보 info_list를 생성 \n", + "info_list = []\n", + "\n", + "# 제목에 해당하는 title데이터를 for문으로 info_list에 추가해줌\n", + "for i in company_info:\n", + " info = i.a['title']\n", + " info_list.append(info)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
기업명제목
0(주)튜링빠르게 성장 중인 스타트업 [경영지원 매니저]
1(주)미창2022년 상반기 신입·경력직 채용공고(영업/연구/AS직)
2케이에스엠(주)[경력/학력 무관] 생산부 직원 채용
3엠엠엠인터내셔널(주)KAGE 영재교육원 송도원 사고력/인문/수학/과학 교사 모집
4(주)아시안스타인사총무 담당자(경력) 채용 (사원~대리)
5주식회사 카델컨텐츠 매니저 경력무관 채용(정규직)
6주)앤돌핀디지털마케팅 AE 모집합니다.
7(주)에이아이스페라[경력] 마케팅팀(해외 영어) 채용 공고
8선린테크(주)기업부설연구소 회로파트 정규직 채용
9피씨엔오티(주)Java, 머신비전 개발 Setup/PLC제어/ 전장설계,배선 채용
10티알웹디자이너 (포토샵 능숙자) + html /css 가능 (경력우대)
11제이피스(주)[주5일/망포] 삼성전자 VOC 담당자 채용
12(주)제이앤와이스타일[쇼핑몰] 분홍코끼리 웹디자인팀 경력사원 채용(성수동 근무)
13웨비지(주)사이트 제작 영업 신입 및 경력 사원을 모집합니다
14(주)키스템프[역삼/영어]나이키 자회사 외국계 패션기업 마케팅팀(VMD) 채용
15(주) EVC PLAZA전기차 충전시설 구축관련 행정사무 및 공정사무원을 모집
16(주)드림파트너스[암호화폐/업계수익률1위] 드림파트너스 영업 신입/경력 채용
17정함한의원한의원 치료실 선생님 (연봉2,600~ / 주5일 선택휴무 압구정
18(주)레시펫반려견 자연식 사료 생산팀(장) 채용 모집
19(주)에프앤피[이케아 동부산점/환경좋음] 배송품포장 및 배차/CS 직원모집
20주식회사 금강대부중개2022 상반기 대출상담/인바운드/대출상담사外 경력직 채용 공고
21스탭스 (주)애니텍 기계설계 업무 정규직 채용
22(주)키스템프[별내역] 유명건설 社 현장사무직 채용
23(주)바이오액츠 (BioActs)바이오사업부 직원 모집 (바이오 시약개발 / 유기합성 / 인허가)
24(주)백향목교육미사소마 사고력수학 전임(주5일) 구인
25(주)애피제네시스부티크 UI/UX 역량을 갖춘 웹퍼블리셔 공고
26(주)포인트모바일S/W 사업본부 각 부문 신입/경력 채용
27(주)맨파워그룹코리아[시청역/복지우수] 한국화웨이 본사 중한통번역사 &amp; Team Assist
28유정산업[ PCB ] 신규 구미 사업장 3조 2교대 사원 모집
29(주)스칼라데이터프론트엔드(React Native) APP 개발자 모집
30(주)파인솔루션대부대출심사 신입 및 경력 채용(부동산 담보대출)
31(주)헬로우미스터리[셀프미] 재고관리/CS관리/오픈마켓 외 정규직 채용(경력무관)
32(주)키스템프[포천/정규직전환] 유명기업 사무직 채용(신입가능/연령무관)
33(주)위드엘씨기업부설연구소 연구원 모집
34(주)디젠트2022년 상반기 전략영업팀 경력직 모집 공고
35(주)윈큐브마케팅(주)윈큐브마케팅 자사몰 운영자 모집 (신입/경력)
36(주)시영산업현대車 1차밴드 사내협력사 CNC가공 모집
37퍼시픽워터기계 엔지니어 경력 및 신입 채용 - 정규직
38마스터콘라인(주)[신입] 콘솔/포워딩 수입 업무팀
39시에스타스포츠구미김천칠곡왜관 대구 어린이스포츠유아체육/유아축구 교사모집
\n", + "
" + ], + "text/plain": [ + " 기업명 제목\n", + "0 (주)튜링 빠르게 성장 중인 스타트업 [경영지원 매니저]\n", + "1 (주)미창 2022년 상반기 신입·경력직 채용공고(영업/연구/AS직)\n", + "2 케이에스엠(주) [경력/학력 무관] 생산부 직원 채용\n", + "3 엠엠엠인터내셔널(주) KAGE 영재교육원 송도원 사고력/인문/수학/과학 교사 모집\n", + "4 (주)아시안스타 인사총무 담당자(경력) 채용 (사원~대리)\n", + "5 주식회사 카델 컨텐츠 매니저 경력무관 채용(정규직)\n", + "6 주)앤돌핀 디지털마케팅 AE 모집합니다.\n", + "7 (주)에이아이스페라 [경력] 마케팅팀(해외 영어) 채용 공고\n", + "8 선린테크(주) 기업부설연구소 회로파트 정규직 채용\n", + "9 피씨엔오티(주) Java, 머신비전 개발 Setup/PLC제어/ 전장설계,배선 채용\n", + "10 티알 웹디자이너 (포토샵 능숙자) + html /css 가능 (경력우대)\n", + "11 제이피스(주) [주5일/망포] 삼성전자 VOC 담당자 채용\n", + "12 (주)제이앤와이스타일 [쇼핑몰] 분홍코끼리 웹디자인팀 경력사원 채용(성수동 근무)\n", + "13 웨비지(주) 사이트 제작 영업 신입 및 경력 사원을 모집합니다\n", + "14 (주)키스템프 [역삼/영어]나이키 자회사 외국계 패션기업 마케팅팀(VMD) 채용\n", + "15 (주) EVC PLAZA 전기차 충전시설 구축관련 행정사무 및 공정사무원을 모집\n", + "16 (주)드림파트너스 [암호화폐/업계수익률1위] 드림파트너스 영업 신입/경력 채용\n", + "17 정함한의원 한의원 치료실 선생님 (연봉2,600~ / 주5일 선택휴무 압구정\n", + "18 (주)레시펫 반려견 자연식 사료 생산팀(장) 채용 모집\n", + "19 (주)에프앤피 [이케아 동부산점/환경좋음] 배송품포장 및 배차/CS 직원모집\n", + "20 주식회사 금강대부중개 2022 상반기 대출상담/인바운드/대출상담사外 경력직 채용 공고\n", + "21 스탭스 (주) 애니텍 기계설계 업무 정규직 채용\n", + "22 (주)키스템프 [별내역] 유명건설 社 현장사무직 채용\n", + "23 (주)바이오액츠 (BioActs) 바이오사업부 직원 모집 (바이오 시약개발 / 유기합성 / 인허가)\n", + "24 (주)백향목교육 미사소마 사고력수학 전임(주5일) 구인\n", + "25 (주)애피 제네시스부티크 UI/UX 역량을 갖춘 웹퍼블리셔 공고\n", + "26 (주)포인트모바일 S/W 사업본부 각 부문 신입/경력 채용\n", + "27 (주)맨파워그룹코리아 [시청역/복지우수] 한국화웨이 본사 중한통번역사 & Team Assist\n", + "28 유정산업 [ PCB ] 신규 구미 사업장 3조 2교대 사원 모집\n", + "29 (주)스칼라데이터 프론트엔드(React Native) APP 개발자 모집\n", + "30 (주)파인솔루션대부 대출심사 신입 및 경력 채용(부동산 담보대출)\n", + "31 (주)헬로우미스터리 [셀프미] 재고관리/CS관리/오픈마켓 외 정규직 채용(경력무관)\n", + "32 (주)키스템프 [포천/정규직전환] 유명기업 사무직 채용(신입가능/연령무관)\n", + "33 (주)위드엘씨 기업부설연구소 연구원 모집\n", + "34 (주)디젠트 2022년 상반기 전략영업팀 경력직 모집 공고\n", + "35 (주)윈큐브마케팅 (주)윈큐브마케팅 자사몰 운영자 모집 (신입/경력)\n", + "36 (주)시영산업 현대車 1차밴드 사내협력사 CNC가공 모집\n", + "37 퍼시픽워터 기계 엔지니어 경력 및 신입 채용 - 정규직\n", + "38 마스터콘라인(주) [신입] 콘솔/포워딩 수입 업무팀\n", + "39 시에스타스포츠 구미김천칠곡왜관 대구 어린이스포츠유아체육/유아축구 교사모집" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# pandas 로드\n", + "import pandas as pd\n", + "\n", + "# df에 기업명, 제목 데이터를 40개씩 뽑아 추가하여 데이터프레임으로 생성\n", + "df = pd.DataFrame({'기업명' : corp_list[:40], \n", + " '제목': info_list[:40]})\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 심화과제(선택) : \n", + "커리어연세의 취업정보 - 채용공고에 올라오는 회사명, 제목을 40개 뽑아 데이터프레임으로 생성하세요. (selenium 활용)\n", + "\n", + "단, 커리어연세 과제 제출 시 코드 실행 후 자신의 아이디, 비밀번호 작성한 notebook cell은 삭제해서 제출해주세요." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "#셀레늄 라이브러리 불러오기\n", + "from selenium import webdriver\n", + "\n", + "#셀레늄에서 html문서가 생성될 때까지 대기하는 함수 불러오기\n", + "from selenium.webdriver.support.ui import WebDriverWait\n", + "\n", + "#셀레늄에서 조건을 걸어줄 수 있는 함수 불러오기\n", + "from selenium.webdriver.support import expected_conditions as EC\n", + "from selenium.webdriver.common.by import By\n", + "\n", + "\n", + "#키보드 자판을 입력할 수 있는 셀레늄 함수 불러오기\n", + "from selenium.webdriver.common.keys import Keys\n", + "\n", + "#시간에 따른 컨트롤이 가능한 라이브러리 불러오기\n", + "import time\n", + "\n", + "#크롬드라이버 경로 설정\n", + "import sys\n", + "sys.path.insert(0, '/usr/lib/chromium-browser/chromedriver')\n", + "\n", + "from selenium import webdriver\n", + "options = webdriver.ChromeOptions()\n", + "options.add_argument('-headless')\n", + "options.add_argument('-no-sandbox')\n", + "options.add_argument('-disable-dev-shm-usage')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: DeprecationWarning: executable_path has been deprecated, please pass in a Service object\n", + " browser = webdriver.Chrome(executable_path = 'C:/chromedriver_win32/chromedriver.exe')\n" + ] + } + ], + "source": [ + "#드라이버 객체 생성\n", + "browser = webdriver.Chrome(executable_path = 'C:/chromedriver_win32/chromedriver.exe')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "#커리어 연세 사이트로 접속\n", + "browser.get('https://career.yonsei.ac.kr/')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "usr = \"2017123206\"\n", + "pwd = \"sk@qmwisk97'\"" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('/html/body/div/div/div[2]/div/ul/li[1]/a').click()\n", + ":6: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('//*[@id=\"loginId\"]').send_keys(usr)\n", + ":10: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('//*[@id=\"loginPasswd\"]').send_keys(pwd)\n" + ] + } + ], + "source": [ + "#포털계정 로그인\n", + "browser.find_element_by_xpath('/html/body/div/div/div[2]/div/ul/li[1]/a').click()\n", + "browser.implicitly_wait(time_to_wait=2)\n", + "\n", + "#ID 입력\n", + "browser.find_element_by_xpath('//*[@id=\"loginId\"]').send_keys(usr)\n", + "browser.implicitly_wait(time_to_wait=2)\n", + "\n", + "#PW 입력\n", + "browser.find_element_by_xpath('//*[@id=\"loginPasswd\"]').send_keys(pwd)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('//*[@id=\"loginBtn\"]').click()\n" + ] + } + ], + "source": [ + "# 로그인 버튼 클릭 \n", + "browser.find_element_by_xpath('//*[@id=\"loginBtn\"]').click()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('/html/body/div[4]/div[3]/div/button[3]').click()\n" + ] + }, + { + "ename": "NoSuchElementException", + "evalue": "Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"/html/body/div[4]/div[3]/div/button[3]\"}\n (Session info: chrome=97.0.4692.71)\nStacktrace:\nBacktrace:\n\tOrdinal0 [0x0102FDC3+2555331]\n\tOrdinal0 [0x00FC77F1+2127857]\n\tOrdinal0 [0x00EC2E08+1060360]\n\tOrdinal0 [0x00EEE49E+1238174]\n\tOrdinal0 [0x00EEE69B+1238683]\n\tOrdinal0 [0x00F19252+1413714]\n\tOrdinal0 [0x00F07B54+1342292]\n\tOrdinal0 [0x00F175FA+1406458]\n\tOrdinal0 [0x00F07976+1341814]\n\tOrdinal0 [0x00EE36B6+1193654]\n\tOrdinal0 [0x00EE4546+1197382]\n\tGetHandleVerifier [0x011C9622+1619522]\n\tGetHandleVerifier [0x0127882C+2336844]\n\tGetHandleVerifier [0x010C23E1+541697]\n\tGetHandleVerifier [0x010C1443+537699]\n\tOrdinal0 [0x00FCD18E+2150798]\n\tOrdinal0 [0x00FD1518+2168088]\n\tOrdinal0 [0x00FD1660+2168416]\n\tOrdinal0 [0x00FDB330+2208560]\n\tBaseThreadInitThunk [0x7749FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A6E+238]\n", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNoSuchElementException\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# 공지사항 닫기 클릭\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mbrowser\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfind_element_by_xpath\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'/html/body/div[4]/div[3]/div/button[3]'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclick\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mfind_element_by_xpath\u001b[1;34m(self, xpath)\u001b[0m\n\u001b[0;32m 518\u001b[0m \u001b[0mstacklevel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 519\u001b[0m )\n\u001b[1;32m--> 520\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfind_element\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mby\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mBy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mXPATH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mxpath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 521\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 522\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mfind_elements_by_xpath\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mxpath\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[0mWebElement\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mfind_element\u001b[1;34m(self, by, value)\u001b[0m\n\u001b[0;32m 1242\u001b[0m \u001b[0mvalue\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'[name=\"%s\"]'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1243\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1244\u001b[1;33m return self.execute(Command.FIND_ELEMENT, {\n\u001b[0m\u001b[0;32m 1245\u001b[0m \u001b[1;34m'using'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mby\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1246\u001b[0m 'value': value})['value']\n", + "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mexecute\u001b[1;34m(self, driver_command, params)\u001b[0m\n\u001b[0;32m 422\u001b[0m \u001b[0mresponse\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcommand_executor\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdriver_command\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 423\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mresponse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 424\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0merror_handler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcheck_response\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 425\u001b[0m response['value'] = self._unwrap_value(\n\u001b[0;32m 426\u001b[0m response.get('value', None))\n", + "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\errorhandler.py\u001b[0m in \u001b[0;36mcheck_response\u001b[1;34m(self, response)\u001b[0m\n\u001b[0;32m 245\u001b[0m \u001b[0malert_text\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'alert'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'text'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 246\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mexception_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscreen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstacktrace\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malert_text\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# type: ignore[call-arg] # mypy is not smart enough here\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 247\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mexception_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscreen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstacktrace\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 248\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 249\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_value_or_default\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mMapping\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0m_KT\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0m_KT\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNoSuchElementException\u001b[0m: Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"/html/body/div[4]/div[3]/div/button[3]\"}\n (Session info: chrome=97.0.4692.71)\nStacktrace:\nBacktrace:\n\tOrdinal0 [0x0102FDC3+2555331]\n\tOrdinal0 [0x00FC77F1+2127857]\n\tOrdinal0 [0x00EC2E08+1060360]\n\tOrdinal0 [0x00EEE49E+1238174]\n\tOrdinal0 [0x00EEE69B+1238683]\n\tOrdinal0 [0x00F19252+1413714]\n\tOrdinal0 [0x00F07B54+1342292]\n\tOrdinal0 [0x00F175FA+1406458]\n\tOrdinal0 [0x00F07976+1341814]\n\tOrdinal0 [0x00EE36B6+1193654]\n\tOrdinal0 [0x00EE4546+1197382]\n\tGetHandleVerifier [0x011C9622+1619522]\n\tGetHandleVerifier [0x0127882C+2336844]\n\tGetHandleVerifier [0x010C23E1+541697]\n\tGetHandleVerifier [0x010C1443+537699]\n\tOrdinal0 [0x00FCD18E+2150798]\n\tOrdinal0 [0x00FD1518+2168088]\n\tOrdinal0 [0x00FD1660+2168416]\n\tOrdinal0 [0x00FDB330+2208560]\n\tBaseThreadInitThunk [0x7749FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A6E+238]\n" + ] + } + ], + "source": [ + "# 공지사항 닫기 클릭 \n", + "browser.find_element_by_xpath('/html/body/div[4]/div[3]/div/button[3]').click()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# 채용공고 클릭 \n", + "browser.find_element_by_xpath('//*[@id=\"mainWidgetUseLstWrap\"]/li[5]/div/a').click()\n", + "browser.implicitly_wait(time_to_wait=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 73d0c1ff2ee677b74a787bc142619dd5b9a061db Mon Sep 17 00:00:00 2001 From: HanbinKim1004 <77422840+HanbinKim1004@users.noreply.github.com> Date: Fri, 4 Feb 2022 00:46:09 +0900 Subject: [PATCH 2/5] =?UTF-8?q?Delete=20[DSL]Session=5F3=5FCrawling=5F?= =?UTF-8?q?=EA=B3=BC=EC=A0=9C=5F=EA=B9=80=ED=95=9C=EB=B9=88.ipynb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...352\271\200\355\225\234\353\271\210.ipynb" | 682 ------------------ 1 file changed, 682 deletions(-) delete mode 100644 "[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" diff --git "a/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" "b/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" deleted file mode 100644 index 3d2c789..0000000 --- "a/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" +++ /dev/null @@ -1,682 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "#크롬드라이버 경로 설정\n", - "import sys\n", - "sys.path.insert(0, '/usr/lib/chromium-browser/chromedriver')" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\rlagk\\anaconda3\\lib\\site-packages\\requests\\__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.8) or chardet (3.0.4) doesn't match a supported version!\n", - " warnings.warn(\"urllib3 ({}) or chardet ({}) doesn't match a supported \"\n" - ] - } - ], - "source": [ - "#정보요청 라이브러리 import\n", - "import requests\n", - "\n", - "#크롤링 라이브러리 import|\n", - "from bs4 import BeautifulSoup " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 기본과제(필수) : \n", - "\n", - "사람인의 채용정보 페이지에서 추천 지역의 아래의 회사명, 제목을 40개 뽑아 데이터프레임으로 생성하세요. (beautifulsoup 활용)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "200" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#사람인에 정보요청\n", - "saramin = requests.get(\"https://www.saramin.co.kr/zf_user/\")\n", - "\n", - "# 사람인 응답코드 확인\n", - "saramin.status_code" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "#User-Agent 지정\n", - "headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "#크롤링 할 대상 url 지정\n", - "url = 'https://www.saramin.co.kr/zf_user/jobs/list/domestic'\n", - "\n", - "#크롤링 대상 url과 headers를 기반으로 정보 요청\n", - "res = requests.get(url, headers = headers)\n", - "\n", - "#정상적으로 정보를 받은 경우 지속, 그렇지 않은 경우 중지\n", - "res.raise_for_status()\n", - "\n", - "#html문서를 beautifulsoup의 lxml 형태로 변환\n", - "soup = BeautifulSoup(res.text, 'lxml') " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# 추천지역 섹션을 find해서 list_body로 할당 \n", - "list_body = soup.find('div', attrs = {'class' : 'list_body'})\n", - "\n", - "# listbody 중 회사명 정보가 있는 col company_nm부분을 company_nm에 할당 \n", - "company_nm = list_body.findAll('div', attrs = {'class' : 'col company_nm'})\n", - "\n", - "# listbody 중 제목정보가 있는 col notification_info부분을 company_info에 할당 \n", - "company_info = list_body.findAll('div', attrs = {'class' : 'col notification_info'})" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# 기업명 정보 corp_list를 생성 \n", - "corp_list = []\n", - "\n", - "# 제목에 해당하는 title데이터를 for문으로 corp_list에 추가해줌\n", - "for i in company_nm:\n", - " corp = i.a['title']\n", - " corp_list.append(corp)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# 제목 정보 info_list를 생성 \n", - "info_list = []\n", - "\n", - "# 제목에 해당하는 title데이터를 for문으로 info_list에 추가해줌\n", - "for i in company_info:\n", - " info = i.a['title']\n", - " info_list.append(info)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
기업명제목
0(주)튜링빠르게 성장 중인 스타트업 [경영지원 매니저]
1(주)미창2022년 상반기 신입·경력직 채용공고(영업/연구/AS직)
2케이에스엠(주)[경력/학력 무관] 생산부 직원 채용
3엠엠엠인터내셔널(주)KAGE 영재교육원 송도원 사고력/인문/수학/과학 교사 모집
4(주)아시안스타인사총무 담당자(경력) 채용 (사원~대리)
5주식회사 카델컨텐츠 매니저 경력무관 채용(정규직)
6주)앤돌핀디지털마케팅 AE 모집합니다.
7(주)에이아이스페라[경력] 마케팅팀(해외 영어) 채용 공고
8선린테크(주)기업부설연구소 회로파트 정규직 채용
9피씨엔오티(주)Java, 머신비전 개발 Setup/PLC제어/ 전장설계,배선 채용
10티알웹디자이너 (포토샵 능숙자) + html /css 가능 (경력우대)
11제이피스(주)[주5일/망포] 삼성전자 VOC 담당자 채용
12(주)제이앤와이스타일[쇼핑몰] 분홍코끼리 웹디자인팀 경력사원 채용(성수동 근무)
13웨비지(주)사이트 제작 영업 신입 및 경력 사원을 모집합니다
14(주)키스템프[역삼/영어]나이키 자회사 외국계 패션기업 마케팅팀(VMD) 채용
15(주) EVC PLAZA전기차 충전시설 구축관련 행정사무 및 공정사무원을 모집
16(주)드림파트너스[암호화폐/업계수익률1위] 드림파트너스 영업 신입/경력 채용
17정함한의원한의원 치료실 선생님 (연봉2,600~ / 주5일 선택휴무 압구정
18(주)레시펫반려견 자연식 사료 생산팀(장) 채용 모집
19(주)에프앤피[이케아 동부산점/환경좋음] 배송품포장 및 배차/CS 직원모집
20주식회사 금강대부중개2022 상반기 대출상담/인바운드/대출상담사外 경력직 채용 공고
21스탭스 (주)애니텍 기계설계 업무 정규직 채용
22(주)키스템프[별내역] 유명건설 社 현장사무직 채용
23(주)바이오액츠 (BioActs)바이오사업부 직원 모집 (바이오 시약개발 / 유기합성 / 인허가)
24(주)백향목교육미사소마 사고력수학 전임(주5일) 구인
25(주)애피제네시스부티크 UI/UX 역량을 갖춘 웹퍼블리셔 공고
26(주)포인트모바일S/W 사업본부 각 부문 신입/경력 채용
27(주)맨파워그룹코리아[시청역/복지우수] 한국화웨이 본사 중한통번역사 &amp; Team Assist
28유정산업[ PCB ] 신규 구미 사업장 3조 2교대 사원 모집
29(주)스칼라데이터프론트엔드(React Native) APP 개발자 모집
30(주)파인솔루션대부대출심사 신입 및 경력 채용(부동산 담보대출)
31(주)헬로우미스터리[셀프미] 재고관리/CS관리/오픈마켓 외 정규직 채용(경력무관)
32(주)키스템프[포천/정규직전환] 유명기업 사무직 채용(신입가능/연령무관)
33(주)위드엘씨기업부설연구소 연구원 모집
34(주)디젠트2022년 상반기 전략영업팀 경력직 모집 공고
35(주)윈큐브마케팅(주)윈큐브마케팅 자사몰 운영자 모집 (신입/경력)
36(주)시영산업현대車 1차밴드 사내협력사 CNC가공 모집
37퍼시픽워터기계 엔지니어 경력 및 신입 채용 - 정규직
38마스터콘라인(주)[신입] 콘솔/포워딩 수입 업무팀
39시에스타스포츠구미김천칠곡왜관 대구 어린이스포츠유아체육/유아축구 교사모집
\n", - "
" - ], - "text/plain": [ - " 기업명 제목\n", - "0 (주)튜링 빠르게 성장 중인 스타트업 [경영지원 매니저]\n", - "1 (주)미창 2022년 상반기 신입·경력직 채용공고(영업/연구/AS직)\n", - "2 케이에스엠(주) [경력/학력 무관] 생산부 직원 채용\n", - "3 엠엠엠인터내셔널(주) KAGE 영재교육원 송도원 사고력/인문/수학/과학 교사 모집\n", - "4 (주)아시안스타 인사총무 담당자(경력) 채용 (사원~대리)\n", - "5 주식회사 카델 컨텐츠 매니저 경력무관 채용(정규직)\n", - "6 주)앤돌핀 디지털마케팅 AE 모집합니다.\n", - "7 (주)에이아이스페라 [경력] 마케팅팀(해외 영어) 채용 공고\n", - "8 선린테크(주) 기업부설연구소 회로파트 정규직 채용\n", - "9 피씨엔오티(주) Java, 머신비전 개발 Setup/PLC제어/ 전장설계,배선 채용\n", - "10 티알 웹디자이너 (포토샵 능숙자) + html /css 가능 (경력우대)\n", - "11 제이피스(주) [주5일/망포] 삼성전자 VOC 담당자 채용\n", - "12 (주)제이앤와이스타일 [쇼핑몰] 분홍코끼리 웹디자인팀 경력사원 채용(성수동 근무)\n", - "13 웨비지(주) 사이트 제작 영업 신입 및 경력 사원을 모집합니다\n", - "14 (주)키스템프 [역삼/영어]나이키 자회사 외국계 패션기업 마케팅팀(VMD) 채용\n", - "15 (주) EVC PLAZA 전기차 충전시설 구축관련 행정사무 및 공정사무원을 모집\n", - "16 (주)드림파트너스 [암호화폐/업계수익률1위] 드림파트너스 영업 신입/경력 채용\n", - "17 정함한의원 한의원 치료실 선생님 (연봉2,600~ / 주5일 선택휴무 압구정\n", - "18 (주)레시펫 반려견 자연식 사료 생산팀(장) 채용 모집\n", - "19 (주)에프앤피 [이케아 동부산점/환경좋음] 배송품포장 및 배차/CS 직원모집\n", - "20 주식회사 금강대부중개 2022 상반기 대출상담/인바운드/대출상담사外 경력직 채용 공고\n", - "21 스탭스 (주) 애니텍 기계설계 업무 정규직 채용\n", - "22 (주)키스템프 [별내역] 유명건설 社 현장사무직 채용\n", - "23 (주)바이오액츠 (BioActs) 바이오사업부 직원 모집 (바이오 시약개발 / 유기합성 / 인허가)\n", - "24 (주)백향목교육 미사소마 사고력수학 전임(주5일) 구인\n", - "25 (주)애피 제네시스부티크 UI/UX 역량을 갖춘 웹퍼블리셔 공고\n", - "26 (주)포인트모바일 S/W 사업본부 각 부문 신입/경력 채용\n", - "27 (주)맨파워그룹코리아 [시청역/복지우수] 한국화웨이 본사 중한통번역사 & Team Assist\n", - "28 유정산업 [ PCB ] 신규 구미 사업장 3조 2교대 사원 모집\n", - "29 (주)스칼라데이터 프론트엔드(React Native) APP 개발자 모집\n", - "30 (주)파인솔루션대부 대출심사 신입 및 경력 채용(부동산 담보대출)\n", - "31 (주)헬로우미스터리 [셀프미] 재고관리/CS관리/오픈마켓 외 정규직 채용(경력무관)\n", - "32 (주)키스템프 [포천/정규직전환] 유명기업 사무직 채용(신입가능/연령무관)\n", - "33 (주)위드엘씨 기업부설연구소 연구원 모집\n", - "34 (주)디젠트 2022년 상반기 전략영업팀 경력직 모집 공고\n", - "35 (주)윈큐브마케팅 (주)윈큐브마케팅 자사몰 운영자 모집 (신입/경력)\n", - "36 (주)시영산업 현대車 1차밴드 사내협력사 CNC가공 모집\n", - "37 퍼시픽워터 기계 엔지니어 경력 및 신입 채용 - 정규직\n", - "38 마스터콘라인(주) [신입] 콘솔/포워딩 수입 업무팀\n", - "39 시에스타스포츠 구미김천칠곡왜관 대구 어린이스포츠유아체육/유아축구 교사모집" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# pandas 로드\n", - "import pandas as pd\n", - "\n", - "# df에 기업명, 제목 데이터를 40개씩 뽑아 추가하여 데이터프레임으로 생성\n", - "df = pd.DataFrame({'기업명' : corp_list[:40], \n", - " '제목': info_list[:40]})\n", - "df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 심화과제(선택) : \n", - "커리어연세의 취업정보 - 채용공고에 올라오는 회사명, 제목을 40개 뽑아 데이터프레임으로 생성하세요. (selenium 활용)\n", - "\n", - "단, 커리어연세 과제 제출 시 코드 실행 후 자신의 아이디, 비밀번호 작성한 notebook cell은 삭제해서 제출해주세요." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "#셀레늄 라이브러리 불러오기\n", - "from selenium import webdriver\n", - "\n", - "#셀레늄에서 html문서가 생성될 때까지 대기하는 함수 불러오기\n", - "from selenium.webdriver.support.ui import WebDriverWait\n", - "\n", - "#셀레늄에서 조건을 걸어줄 수 있는 함수 불러오기\n", - "from selenium.webdriver.support import expected_conditions as EC\n", - "from selenium.webdriver.common.by import By\n", - "\n", - "\n", - "#키보드 자판을 입력할 수 있는 셀레늄 함수 불러오기\n", - "from selenium.webdriver.common.keys import Keys\n", - "\n", - "#시간에 따른 컨트롤이 가능한 라이브러리 불러오기\n", - "import time\n", - "\n", - "#크롬드라이버 경로 설정\n", - "import sys\n", - "sys.path.insert(0, '/usr/lib/chromium-browser/chromedriver')\n", - "\n", - "from selenium import webdriver\n", - "options = webdriver.ChromeOptions()\n", - "options.add_argument('-headless')\n", - "options.add_argument('-no-sandbox')\n", - "options.add_argument('-disable-dev-shm-usage')" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":2: DeprecationWarning: executable_path has been deprecated, please pass in a Service object\n", - " browser = webdriver.Chrome(executable_path = 'C:/chromedriver_win32/chromedriver.exe')\n" - ] - } - ], - "source": [ - "#드라이버 객체 생성\n", - "browser = webdriver.Chrome(executable_path = 'C:/chromedriver_win32/chromedriver.exe')" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "#커리어 연세 사이트로 접속\n", - "browser.get('https://career.yonsei.ac.kr/')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "usr = \"2017123206\"\n", - "pwd = \"sk@qmwisk97'\"" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", - " browser.find_element_by_xpath('/html/body/div/div/div[2]/div/ul/li[1]/a').click()\n", - ":6: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", - " browser.find_element_by_xpath('//*[@id=\"loginId\"]').send_keys(usr)\n", - ":10: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", - " browser.find_element_by_xpath('//*[@id=\"loginPasswd\"]').send_keys(pwd)\n" - ] - } - ], - "source": [ - "#포털계정 로그인\n", - "browser.find_element_by_xpath('/html/body/div/div/div[2]/div/ul/li[1]/a').click()\n", - "browser.implicitly_wait(time_to_wait=2)\n", - "\n", - "#ID 입력\n", - "browser.find_element_by_xpath('//*[@id=\"loginId\"]').send_keys(usr)\n", - "browser.implicitly_wait(time_to_wait=2)\n", - "\n", - "#PW 입력\n", - "browser.find_element_by_xpath('//*[@id=\"loginPasswd\"]').send_keys(pwd)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", - " browser.find_element_by_xpath('//*[@id=\"loginBtn\"]').click()\n" - ] - } - ], - "source": [ - "# 로그인 버튼 클릭 \n", - "browser.find_element_by_xpath('//*[@id=\"loginBtn\"]').click()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", - " browser.find_element_by_xpath('/html/body/div[4]/div[3]/div/button[3]').click()\n" - ] - }, - { - "ename": "NoSuchElementException", - "evalue": "Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"/html/body/div[4]/div[3]/div/button[3]\"}\n (Session info: chrome=97.0.4692.71)\nStacktrace:\nBacktrace:\n\tOrdinal0 [0x0102FDC3+2555331]\n\tOrdinal0 [0x00FC77F1+2127857]\n\tOrdinal0 [0x00EC2E08+1060360]\n\tOrdinal0 [0x00EEE49E+1238174]\n\tOrdinal0 [0x00EEE69B+1238683]\n\tOrdinal0 [0x00F19252+1413714]\n\tOrdinal0 [0x00F07B54+1342292]\n\tOrdinal0 [0x00F175FA+1406458]\n\tOrdinal0 [0x00F07976+1341814]\n\tOrdinal0 [0x00EE36B6+1193654]\n\tOrdinal0 [0x00EE4546+1197382]\n\tGetHandleVerifier [0x011C9622+1619522]\n\tGetHandleVerifier [0x0127882C+2336844]\n\tGetHandleVerifier [0x010C23E1+541697]\n\tGetHandleVerifier [0x010C1443+537699]\n\tOrdinal0 [0x00FCD18E+2150798]\n\tOrdinal0 [0x00FD1518+2168088]\n\tOrdinal0 [0x00FD1660+2168416]\n\tOrdinal0 [0x00FDB330+2208560]\n\tBaseThreadInitThunk [0x7749FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A6E+238]\n", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNoSuchElementException\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# 공지사항 닫기 클릭\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mbrowser\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfind_element_by_xpath\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'/html/body/div[4]/div[3]/div/button[3]'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclick\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mfind_element_by_xpath\u001b[1;34m(self, xpath)\u001b[0m\n\u001b[0;32m 518\u001b[0m \u001b[0mstacklevel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 519\u001b[0m )\n\u001b[1;32m--> 520\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfind_element\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mby\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mBy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mXPATH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mxpath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 521\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 522\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mfind_elements_by_xpath\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mxpath\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[0mWebElement\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mfind_element\u001b[1;34m(self, by, value)\u001b[0m\n\u001b[0;32m 1242\u001b[0m \u001b[0mvalue\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'[name=\"%s\"]'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1243\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1244\u001b[1;33m return self.execute(Command.FIND_ELEMENT, {\n\u001b[0m\u001b[0;32m 1245\u001b[0m \u001b[1;34m'using'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mby\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1246\u001b[0m 'value': value})['value']\n", - "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mexecute\u001b[1;34m(self, driver_command, params)\u001b[0m\n\u001b[0;32m 422\u001b[0m \u001b[0mresponse\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcommand_executor\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdriver_command\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 423\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mresponse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 424\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0merror_handler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcheck_response\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 425\u001b[0m response['value'] = self._unwrap_value(\n\u001b[0;32m 426\u001b[0m response.get('value', None))\n", - "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\errorhandler.py\u001b[0m in \u001b[0;36mcheck_response\u001b[1;34m(self, response)\u001b[0m\n\u001b[0;32m 245\u001b[0m \u001b[0malert_text\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'alert'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'text'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 246\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mexception_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscreen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstacktrace\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malert_text\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# type: ignore[call-arg] # mypy is not smart enough here\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 247\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mexception_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscreen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstacktrace\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 248\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 249\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_value_or_default\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mMapping\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0m_KT\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0m_KT\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mNoSuchElementException\u001b[0m: Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"/html/body/div[4]/div[3]/div/button[3]\"}\n (Session info: chrome=97.0.4692.71)\nStacktrace:\nBacktrace:\n\tOrdinal0 [0x0102FDC3+2555331]\n\tOrdinal0 [0x00FC77F1+2127857]\n\tOrdinal0 [0x00EC2E08+1060360]\n\tOrdinal0 [0x00EEE49E+1238174]\n\tOrdinal0 [0x00EEE69B+1238683]\n\tOrdinal0 [0x00F19252+1413714]\n\tOrdinal0 [0x00F07B54+1342292]\n\tOrdinal0 [0x00F175FA+1406458]\n\tOrdinal0 [0x00F07976+1341814]\n\tOrdinal0 [0x00EE36B6+1193654]\n\tOrdinal0 [0x00EE4546+1197382]\n\tGetHandleVerifier [0x011C9622+1619522]\n\tGetHandleVerifier [0x0127882C+2336844]\n\tGetHandleVerifier [0x010C23E1+541697]\n\tGetHandleVerifier [0x010C1443+537699]\n\tOrdinal0 [0x00FCD18E+2150798]\n\tOrdinal0 [0x00FD1518+2168088]\n\tOrdinal0 [0x00FD1660+2168416]\n\tOrdinal0 [0x00FDB330+2208560]\n\tBaseThreadInitThunk [0x7749FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A6E+238]\n" - ] - } - ], - "source": [ - "# 공지사항 닫기 클릭 \n", - "browser.find_element_by_xpath('/html/body/div[4]/div[3]/div/button[3]').click()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# 채용공고 클릭 \n", - "browser.find_element_by_xpath('//*[@id=\"mainWidgetUseLstWrap\"]/li[5]/div/a').click()\n", - "browser.implicitly_wait(time_to_wait=2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} From 02e9b6b5849666333b4e8692e3fec1f8f08afebf Mon Sep 17 00:00:00 2001 From: HanbinKim1004 <77422840+HanbinKim1004@users.noreply.github.com> Date: Fri, 4 Feb 2022 00:46:43 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=ED=81=AC=EB=A1=A4=EB=A7=81=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=9C=20=EC=9E=AC=EC=97=85=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 크롤링 과제 재업로드 합니다. --- ...352\271\200\355\225\234\353\271\210.ipynb" | 682 ++++++++++++++++++ 1 file changed, 682 insertions(+) create mode 100644 "Crawling/F/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" diff --git "a/Crawling/F/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" "b/Crawling/F/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" new file mode 100644 index 0000000..3d2c789 --- /dev/null +++ "b/Crawling/F/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" @@ -0,0 +1,682 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "#크롬드라이버 경로 설정\n", + "import sys\n", + "sys.path.insert(0, '/usr/lib/chromium-browser/chromedriver')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\rlagk\\anaconda3\\lib\\site-packages\\requests\\__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.8) or chardet (3.0.4) doesn't match a supported version!\n", + " warnings.warn(\"urllib3 ({}) or chardet ({}) doesn't match a supported \"\n" + ] + } + ], + "source": [ + "#정보요청 라이브러리 import\n", + "import requests\n", + "\n", + "#크롤링 라이브러리 import|\n", + "from bs4 import BeautifulSoup " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 기본과제(필수) : \n", + "\n", + "사람인의 채용정보 페이지에서 추천 지역의 아래의 회사명, 제목을 40개 뽑아 데이터프레임으로 생성하세요. (beautifulsoup 활용)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "200" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#사람인에 정보요청\n", + "saramin = requests.get(\"https://www.saramin.co.kr/zf_user/\")\n", + "\n", + "# 사람인 응답코드 확인\n", + "saramin.status_code" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "#User-Agent 지정\n", + "headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#크롤링 할 대상 url 지정\n", + "url = 'https://www.saramin.co.kr/zf_user/jobs/list/domestic'\n", + "\n", + "#크롤링 대상 url과 headers를 기반으로 정보 요청\n", + "res = requests.get(url, headers = headers)\n", + "\n", + "#정상적으로 정보를 받은 경우 지속, 그렇지 않은 경우 중지\n", + "res.raise_for_status()\n", + "\n", + "#html문서를 beautifulsoup의 lxml 형태로 변환\n", + "soup = BeautifulSoup(res.text, 'lxml') " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# 추천지역 섹션을 find해서 list_body로 할당 \n", + "list_body = soup.find('div', attrs = {'class' : 'list_body'})\n", + "\n", + "# listbody 중 회사명 정보가 있는 col company_nm부분을 company_nm에 할당 \n", + "company_nm = list_body.findAll('div', attrs = {'class' : 'col company_nm'})\n", + "\n", + "# listbody 중 제목정보가 있는 col notification_info부분을 company_info에 할당 \n", + "company_info = list_body.findAll('div', attrs = {'class' : 'col notification_info'})" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# 기업명 정보 corp_list를 생성 \n", + "corp_list = []\n", + "\n", + "# 제목에 해당하는 title데이터를 for문으로 corp_list에 추가해줌\n", + "for i in company_nm:\n", + " corp = i.a['title']\n", + " corp_list.append(corp)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# 제목 정보 info_list를 생성 \n", + "info_list = []\n", + "\n", + "# 제목에 해당하는 title데이터를 for문으로 info_list에 추가해줌\n", + "for i in company_info:\n", + " info = i.a['title']\n", + " info_list.append(info)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
기업명제목
0(주)튜링빠르게 성장 중인 스타트업 [경영지원 매니저]
1(주)미창2022년 상반기 신입·경력직 채용공고(영업/연구/AS직)
2케이에스엠(주)[경력/학력 무관] 생산부 직원 채용
3엠엠엠인터내셔널(주)KAGE 영재교육원 송도원 사고력/인문/수학/과학 교사 모집
4(주)아시안스타인사총무 담당자(경력) 채용 (사원~대리)
5주식회사 카델컨텐츠 매니저 경력무관 채용(정규직)
6주)앤돌핀디지털마케팅 AE 모집합니다.
7(주)에이아이스페라[경력] 마케팅팀(해외 영어) 채용 공고
8선린테크(주)기업부설연구소 회로파트 정규직 채용
9피씨엔오티(주)Java, 머신비전 개발 Setup/PLC제어/ 전장설계,배선 채용
10티알웹디자이너 (포토샵 능숙자) + html /css 가능 (경력우대)
11제이피스(주)[주5일/망포] 삼성전자 VOC 담당자 채용
12(주)제이앤와이스타일[쇼핑몰] 분홍코끼리 웹디자인팀 경력사원 채용(성수동 근무)
13웨비지(주)사이트 제작 영업 신입 및 경력 사원을 모집합니다
14(주)키스템프[역삼/영어]나이키 자회사 외국계 패션기업 마케팅팀(VMD) 채용
15(주) EVC PLAZA전기차 충전시설 구축관련 행정사무 및 공정사무원을 모집
16(주)드림파트너스[암호화폐/업계수익률1위] 드림파트너스 영업 신입/경력 채용
17정함한의원한의원 치료실 선생님 (연봉2,600~ / 주5일 선택휴무 압구정
18(주)레시펫반려견 자연식 사료 생산팀(장) 채용 모집
19(주)에프앤피[이케아 동부산점/환경좋음] 배송품포장 및 배차/CS 직원모집
20주식회사 금강대부중개2022 상반기 대출상담/인바운드/대출상담사外 경력직 채용 공고
21스탭스 (주)애니텍 기계설계 업무 정규직 채용
22(주)키스템프[별내역] 유명건설 社 현장사무직 채용
23(주)바이오액츠 (BioActs)바이오사업부 직원 모집 (바이오 시약개발 / 유기합성 / 인허가)
24(주)백향목교육미사소마 사고력수학 전임(주5일) 구인
25(주)애피제네시스부티크 UI/UX 역량을 갖춘 웹퍼블리셔 공고
26(주)포인트모바일S/W 사업본부 각 부문 신입/경력 채용
27(주)맨파워그룹코리아[시청역/복지우수] 한국화웨이 본사 중한통번역사 &amp; Team Assist
28유정산업[ PCB ] 신규 구미 사업장 3조 2교대 사원 모집
29(주)스칼라데이터프론트엔드(React Native) APP 개발자 모집
30(주)파인솔루션대부대출심사 신입 및 경력 채용(부동산 담보대출)
31(주)헬로우미스터리[셀프미] 재고관리/CS관리/오픈마켓 외 정규직 채용(경력무관)
32(주)키스템프[포천/정규직전환] 유명기업 사무직 채용(신입가능/연령무관)
33(주)위드엘씨기업부설연구소 연구원 모집
34(주)디젠트2022년 상반기 전략영업팀 경력직 모집 공고
35(주)윈큐브마케팅(주)윈큐브마케팅 자사몰 운영자 모집 (신입/경력)
36(주)시영산업현대車 1차밴드 사내협력사 CNC가공 모집
37퍼시픽워터기계 엔지니어 경력 및 신입 채용 - 정규직
38마스터콘라인(주)[신입] 콘솔/포워딩 수입 업무팀
39시에스타스포츠구미김천칠곡왜관 대구 어린이스포츠유아체육/유아축구 교사모집
\n", + "
" + ], + "text/plain": [ + " 기업명 제목\n", + "0 (주)튜링 빠르게 성장 중인 스타트업 [경영지원 매니저]\n", + "1 (주)미창 2022년 상반기 신입·경력직 채용공고(영업/연구/AS직)\n", + "2 케이에스엠(주) [경력/학력 무관] 생산부 직원 채용\n", + "3 엠엠엠인터내셔널(주) KAGE 영재교육원 송도원 사고력/인문/수학/과학 교사 모집\n", + "4 (주)아시안스타 인사총무 담당자(경력) 채용 (사원~대리)\n", + "5 주식회사 카델 컨텐츠 매니저 경력무관 채용(정규직)\n", + "6 주)앤돌핀 디지털마케팅 AE 모집합니다.\n", + "7 (주)에이아이스페라 [경력] 마케팅팀(해외 영어) 채용 공고\n", + "8 선린테크(주) 기업부설연구소 회로파트 정규직 채용\n", + "9 피씨엔오티(주) Java, 머신비전 개발 Setup/PLC제어/ 전장설계,배선 채용\n", + "10 티알 웹디자이너 (포토샵 능숙자) + html /css 가능 (경력우대)\n", + "11 제이피스(주) [주5일/망포] 삼성전자 VOC 담당자 채용\n", + "12 (주)제이앤와이스타일 [쇼핑몰] 분홍코끼리 웹디자인팀 경력사원 채용(성수동 근무)\n", + "13 웨비지(주) 사이트 제작 영업 신입 및 경력 사원을 모집합니다\n", + "14 (주)키스템프 [역삼/영어]나이키 자회사 외국계 패션기업 마케팅팀(VMD) 채용\n", + "15 (주) EVC PLAZA 전기차 충전시설 구축관련 행정사무 및 공정사무원을 모집\n", + "16 (주)드림파트너스 [암호화폐/업계수익률1위] 드림파트너스 영업 신입/경력 채용\n", + "17 정함한의원 한의원 치료실 선생님 (연봉2,600~ / 주5일 선택휴무 압구정\n", + "18 (주)레시펫 반려견 자연식 사료 생산팀(장) 채용 모집\n", + "19 (주)에프앤피 [이케아 동부산점/환경좋음] 배송품포장 및 배차/CS 직원모집\n", + "20 주식회사 금강대부중개 2022 상반기 대출상담/인바운드/대출상담사外 경력직 채용 공고\n", + "21 스탭스 (주) 애니텍 기계설계 업무 정규직 채용\n", + "22 (주)키스템프 [별내역] 유명건설 社 현장사무직 채용\n", + "23 (주)바이오액츠 (BioActs) 바이오사업부 직원 모집 (바이오 시약개발 / 유기합성 / 인허가)\n", + "24 (주)백향목교육 미사소마 사고력수학 전임(주5일) 구인\n", + "25 (주)애피 제네시스부티크 UI/UX 역량을 갖춘 웹퍼블리셔 공고\n", + "26 (주)포인트모바일 S/W 사업본부 각 부문 신입/경력 채용\n", + "27 (주)맨파워그룹코리아 [시청역/복지우수] 한국화웨이 본사 중한통번역사 & Team Assist\n", + "28 유정산업 [ PCB ] 신규 구미 사업장 3조 2교대 사원 모집\n", + "29 (주)스칼라데이터 프론트엔드(React Native) APP 개발자 모집\n", + "30 (주)파인솔루션대부 대출심사 신입 및 경력 채용(부동산 담보대출)\n", + "31 (주)헬로우미스터리 [셀프미] 재고관리/CS관리/오픈마켓 외 정규직 채용(경력무관)\n", + "32 (주)키스템프 [포천/정규직전환] 유명기업 사무직 채용(신입가능/연령무관)\n", + "33 (주)위드엘씨 기업부설연구소 연구원 모집\n", + "34 (주)디젠트 2022년 상반기 전략영업팀 경력직 모집 공고\n", + "35 (주)윈큐브마케팅 (주)윈큐브마케팅 자사몰 운영자 모집 (신입/경력)\n", + "36 (주)시영산업 현대車 1차밴드 사내협력사 CNC가공 모집\n", + "37 퍼시픽워터 기계 엔지니어 경력 및 신입 채용 - 정규직\n", + "38 마스터콘라인(주) [신입] 콘솔/포워딩 수입 업무팀\n", + "39 시에스타스포츠 구미김천칠곡왜관 대구 어린이스포츠유아체육/유아축구 교사모집" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# pandas 로드\n", + "import pandas as pd\n", + "\n", + "# df에 기업명, 제목 데이터를 40개씩 뽑아 추가하여 데이터프레임으로 생성\n", + "df = pd.DataFrame({'기업명' : corp_list[:40], \n", + " '제목': info_list[:40]})\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 심화과제(선택) : \n", + "커리어연세의 취업정보 - 채용공고에 올라오는 회사명, 제목을 40개 뽑아 데이터프레임으로 생성하세요. (selenium 활용)\n", + "\n", + "단, 커리어연세 과제 제출 시 코드 실행 후 자신의 아이디, 비밀번호 작성한 notebook cell은 삭제해서 제출해주세요." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "#셀레늄 라이브러리 불러오기\n", + "from selenium import webdriver\n", + "\n", + "#셀레늄에서 html문서가 생성될 때까지 대기하는 함수 불러오기\n", + "from selenium.webdriver.support.ui import WebDriverWait\n", + "\n", + "#셀레늄에서 조건을 걸어줄 수 있는 함수 불러오기\n", + "from selenium.webdriver.support import expected_conditions as EC\n", + "from selenium.webdriver.common.by import By\n", + "\n", + "\n", + "#키보드 자판을 입력할 수 있는 셀레늄 함수 불러오기\n", + "from selenium.webdriver.common.keys import Keys\n", + "\n", + "#시간에 따른 컨트롤이 가능한 라이브러리 불러오기\n", + "import time\n", + "\n", + "#크롬드라이버 경로 설정\n", + "import sys\n", + "sys.path.insert(0, '/usr/lib/chromium-browser/chromedriver')\n", + "\n", + "from selenium import webdriver\n", + "options = webdriver.ChromeOptions()\n", + "options.add_argument('-headless')\n", + "options.add_argument('-no-sandbox')\n", + "options.add_argument('-disable-dev-shm-usage')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: DeprecationWarning: executable_path has been deprecated, please pass in a Service object\n", + " browser = webdriver.Chrome(executable_path = 'C:/chromedriver_win32/chromedriver.exe')\n" + ] + } + ], + "source": [ + "#드라이버 객체 생성\n", + "browser = webdriver.Chrome(executable_path = 'C:/chromedriver_win32/chromedriver.exe')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "#커리어 연세 사이트로 접속\n", + "browser.get('https://career.yonsei.ac.kr/')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "usr = \"2017123206\"\n", + "pwd = \"sk@qmwisk97'\"" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('/html/body/div/div/div[2]/div/ul/li[1]/a').click()\n", + ":6: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('//*[@id=\"loginId\"]').send_keys(usr)\n", + ":10: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('//*[@id=\"loginPasswd\"]').send_keys(pwd)\n" + ] + } + ], + "source": [ + "#포털계정 로그인\n", + "browser.find_element_by_xpath('/html/body/div/div/div[2]/div/ul/li[1]/a').click()\n", + "browser.implicitly_wait(time_to_wait=2)\n", + "\n", + "#ID 입력\n", + "browser.find_element_by_xpath('//*[@id=\"loginId\"]').send_keys(usr)\n", + "browser.implicitly_wait(time_to_wait=2)\n", + "\n", + "#PW 입력\n", + "browser.find_element_by_xpath('//*[@id=\"loginPasswd\"]').send_keys(pwd)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('//*[@id=\"loginBtn\"]').click()\n" + ] + } + ], + "source": [ + "# 로그인 버튼 클릭 \n", + "browser.find_element_by_xpath('//*[@id=\"loginBtn\"]').click()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('/html/body/div[4]/div[3]/div/button[3]').click()\n" + ] + }, + { + "ename": "NoSuchElementException", + "evalue": "Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"/html/body/div[4]/div[3]/div/button[3]\"}\n (Session info: chrome=97.0.4692.71)\nStacktrace:\nBacktrace:\n\tOrdinal0 [0x0102FDC3+2555331]\n\tOrdinal0 [0x00FC77F1+2127857]\n\tOrdinal0 [0x00EC2E08+1060360]\n\tOrdinal0 [0x00EEE49E+1238174]\n\tOrdinal0 [0x00EEE69B+1238683]\n\tOrdinal0 [0x00F19252+1413714]\n\tOrdinal0 [0x00F07B54+1342292]\n\tOrdinal0 [0x00F175FA+1406458]\n\tOrdinal0 [0x00F07976+1341814]\n\tOrdinal0 [0x00EE36B6+1193654]\n\tOrdinal0 [0x00EE4546+1197382]\n\tGetHandleVerifier [0x011C9622+1619522]\n\tGetHandleVerifier [0x0127882C+2336844]\n\tGetHandleVerifier [0x010C23E1+541697]\n\tGetHandleVerifier [0x010C1443+537699]\n\tOrdinal0 [0x00FCD18E+2150798]\n\tOrdinal0 [0x00FD1518+2168088]\n\tOrdinal0 [0x00FD1660+2168416]\n\tOrdinal0 [0x00FDB330+2208560]\n\tBaseThreadInitThunk [0x7749FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A6E+238]\n", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNoSuchElementException\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# 공지사항 닫기 클릭\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mbrowser\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfind_element_by_xpath\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'/html/body/div[4]/div[3]/div/button[3]'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclick\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mfind_element_by_xpath\u001b[1;34m(self, xpath)\u001b[0m\n\u001b[0;32m 518\u001b[0m \u001b[0mstacklevel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 519\u001b[0m )\n\u001b[1;32m--> 520\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfind_element\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mby\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mBy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mXPATH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mxpath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 521\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 522\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mfind_elements_by_xpath\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mxpath\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[0mWebElement\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mfind_element\u001b[1;34m(self, by, value)\u001b[0m\n\u001b[0;32m 1242\u001b[0m \u001b[0mvalue\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'[name=\"%s\"]'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1243\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1244\u001b[1;33m return self.execute(Command.FIND_ELEMENT, {\n\u001b[0m\u001b[0;32m 1245\u001b[0m \u001b[1;34m'using'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mby\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1246\u001b[0m 'value': value})['value']\n", + "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mexecute\u001b[1;34m(self, driver_command, params)\u001b[0m\n\u001b[0;32m 422\u001b[0m \u001b[0mresponse\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcommand_executor\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdriver_command\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 423\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mresponse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 424\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0merror_handler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcheck_response\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 425\u001b[0m response['value'] = self._unwrap_value(\n\u001b[0;32m 426\u001b[0m response.get('value', None))\n", + "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\errorhandler.py\u001b[0m in \u001b[0;36mcheck_response\u001b[1;34m(self, response)\u001b[0m\n\u001b[0;32m 245\u001b[0m \u001b[0malert_text\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'alert'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'text'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 246\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mexception_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscreen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstacktrace\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malert_text\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# type: ignore[call-arg] # mypy is not smart enough here\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 247\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mexception_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscreen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstacktrace\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 248\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 249\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_value_or_default\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mMapping\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0m_KT\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0m_KT\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNoSuchElementException\u001b[0m: Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"/html/body/div[4]/div[3]/div/button[3]\"}\n (Session info: chrome=97.0.4692.71)\nStacktrace:\nBacktrace:\n\tOrdinal0 [0x0102FDC3+2555331]\n\tOrdinal0 [0x00FC77F1+2127857]\n\tOrdinal0 [0x00EC2E08+1060360]\n\tOrdinal0 [0x00EEE49E+1238174]\n\tOrdinal0 [0x00EEE69B+1238683]\n\tOrdinal0 [0x00F19252+1413714]\n\tOrdinal0 [0x00F07B54+1342292]\n\tOrdinal0 [0x00F175FA+1406458]\n\tOrdinal0 [0x00F07976+1341814]\n\tOrdinal0 [0x00EE36B6+1193654]\n\tOrdinal0 [0x00EE4546+1197382]\n\tGetHandleVerifier [0x011C9622+1619522]\n\tGetHandleVerifier [0x0127882C+2336844]\n\tGetHandleVerifier [0x010C23E1+541697]\n\tGetHandleVerifier [0x010C1443+537699]\n\tOrdinal0 [0x00FCD18E+2150798]\n\tOrdinal0 [0x00FD1518+2168088]\n\tOrdinal0 [0x00FD1660+2168416]\n\tOrdinal0 [0x00FDB330+2208560]\n\tBaseThreadInitThunk [0x7749FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A6E+238]\n" + ] + } + ], + "source": [ + "# 공지사항 닫기 클릭 \n", + "browser.find_element_by_xpath('/html/body/div[4]/div[3]/div/button[3]').click()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# 채용공고 클릭 \n", + "browser.find_element_by_xpath('//*[@id=\"mainWidgetUseLstWrap\"]/li[5]/div/a').click()\n", + "browser.implicitly_wait(time_to_wait=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 31462f72a9834f5e20b6d629025d47f8434d59f7 Mon Sep 17 00:00:00 2001 From: HanbinKim1004 <77422840+HanbinKim1004@users.noreply.github.com> Date: Fri, 4 Feb 2022 00:47:05 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=ED=81=AC=EB=A1=A4=EB=A7=81=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=9C=20=EC=9E=AC=EC=97=85=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 크롤링 과제 재업로드 --- ...352\271\200\355\225\234\353\271\210.ipynb" | 682 ++++++++++++++++++ 1 file changed, 682 insertions(+) create mode 100644 "[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" diff --git "a/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" "b/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" new file mode 100644 index 0000000..3d2c789 --- /dev/null +++ "b/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" @@ -0,0 +1,682 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "#크롬드라이버 경로 설정\n", + "import sys\n", + "sys.path.insert(0, '/usr/lib/chromium-browser/chromedriver')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\rlagk\\anaconda3\\lib\\site-packages\\requests\\__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.8) or chardet (3.0.4) doesn't match a supported version!\n", + " warnings.warn(\"urllib3 ({}) or chardet ({}) doesn't match a supported \"\n" + ] + } + ], + "source": [ + "#정보요청 라이브러리 import\n", + "import requests\n", + "\n", + "#크롤링 라이브러리 import|\n", + "from bs4 import BeautifulSoup " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 기본과제(필수) : \n", + "\n", + "사람인의 채용정보 페이지에서 추천 지역의 아래의 회사명, 제목을 40개 뽑아 데이터프레임으로 생성하세요. (beautifulsoup 활용)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "200" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#사람인에 정보요청\n", + "saramin = requests.get(\"https://www.saramin.co.kr/zf_user/\")\n", + "\n", + "# 사람인 응답코드 확인\n", + "saramin.status_code" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "#User-Agent 지정\n", + "headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#크롤링 할 대상 url 지정\n", + "url = 'https://www.saramin.co.kr/zf_user/jobs/list/domestic'\n", + "\n", + "#크롤링 대상 url과 headers를 기반으로 정보 요청\n", + "res = requests.get(url, headers = headers)\n", + "\n", + "#정상적으로 정보를 받은 경우 지속, 그렇지 않은 경우 중지\n", + "res.raise_for_status()\n", + "\n", + "#html문서를 beautifulsoup의 lxml 형태로 변환\n", + "soup = BeautifulSoup(res.text, 'lxml') " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# 추천지역 섹션을 find해서 list_body로 할당 \n", + "list_body = soup.find('div', attrs = {'class' : 'list_body'})\n", + "\n", + "# listbody 중 회사명 정보가 있는 col company_nm부분을 company_nm에 할당 \n", + "company_nm = list_body.findAll('div', attrs = {'class' : 'col company_nm'})\n", + "\n", + "# listbody 중 제목정보가 있는 col notification_info부분을 company_info에 할당 \n", + "company_info = list_body.findAll('div', attrs = {'class' : 'col notification_info'})" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# 기업명 정보 corp_list를 생성 \n", + "corp_list = []\n", + "\n", + "# 제목에 해당하는 title데이터를 for문으로 corp_list에 추가해줌\n", + "for i in company_nm:\n", + " corp = i.a['title']\n", + " corp_list.append(corp)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# 제목 정보 info_list를 생성 \n", + "info_list = []\n", + "\n", + "# 제목에 해당하는 title데이터를 for문으로 info_list에 추가해줌\n", + "for i in company_info:\n", + " info = i.a['title']\n", + " info_list.append(info)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
기업명제목
0(주)튜링빠르게 성장 중인 스타트업 [경영지원 매니저]
1(주)미창2022년 상반기 신입·경력직 채용공고(영업/연구/AS직)
2케이에스엠(주)[경력/학력 무관] 생산부 직원 채용
3엠엠엠인터내셔널(주)KAGE 영재교육원 송도원 사고력/인문/수학/과학 교사 모집
4(주)아시안스타인사총무 담당자(경력) 채용 (사원~대리)
5주식회사 카델컨텐츠 매니저 경력무관 채용(정규직)
6주)앤돌핀디지털마케팅 AE 모집합니다.
7(주)에이아이스페라[경력] 마케팅팀(해외 영어) 채용 공고
8선린테크(주)기업부설연구소 회로파트 정규직 채용
9피씨엔오티(주)Java, 머신비전 개발 Setup/PLC제어/ 전장설계,배선 채용
10티알웹디자이너 (포토샵 능숙자) + html /css 가능 (경력우대)
11제이피스(주)[주5일/망포] 삼성전자 VOC 담당자 채용
12(주)제이앤와이스타일[쇼핑몰] 분홍코끼리 웹디자인팀 경력사원 채용(성수동 근무)
13웨비지(주)사이트 제작 영업 신입 및 경력 사원을 모집합니다
14(주)키스템프[역삼/영어]나이키 자회사 외국계 패션기업 마케팅팀(VMD) 채용
15(주) EVC PLAZA전기차 충전시설 구축관련 행정사무 및 공정사무원을 모집
16(주)드림파트너스[암호화폐/업계수익률1위] 드림파트너스 영업 신입/경력 채용
17정함한의원한의원 치료실 선생님 (연봉2,600~ / 주5일 선택휴무 압구정
18(주)레시펫반려견 자연식 사료 생산팀(장) 채용 모집
19(주)에프앤피[이케아 동부산점/환경좋음] 배송품포장 및 배차/CS 직원모집
20주식회사 금강대부중개2022 상반기 대출상담/인바운드/대출상담사外 경력직 채용 공고
21스탭스 (주)애니텍 기계설계 업무 정규직 채용
22(주)키스템프[별내역] 유명건설 社 현장사무직 채용
23(주)바이오액츠 (BioActs)바이오사업부 직원 모집 (바이오 시약개발 / 유기합성 / 인허가)
24(주)백향목교육미사소마 사고력수학 전임(주5일) 구인
25(주)애피제네시스부티크 UI/UX 역량을 갖춘 웹퍼블리셔 공고
26(주)포인트모바일S/W 사업본부 각 부문 신입/경력 채용
27(주)맨파워그룹코리아[시청역/복지우수] 한국화웨이 본사 중한통번역사 &amp; Team Assist
28유정산업[ PCB ] 신규 구미 사업장 3조 2교대 사원 모집
29(주)스칼라데이터프론트엔드(React Native) APP 개발자 모집
30(주)파인솔루션대부대출심사 신입 및 경력 채용(부동산 담보대출)
31(주)헬로우미스터리[셀프미] 재고관리/CS관리/오픈마켓 외 정규직 채용(경력무관)
32(주)키스템프[포천/정규직전환] 유명기업 사무직 채용(신입가능/연령무관)
33(주)위드엘씨기업부설연구소 연구원 모집
34(주)디젠트2022년 상반기 전략영업팀 경력직 모집 공고
35(주)윈큐브마케팅(주)윈큐브마케팅 자사몰 운영자 모집 (신입/경력)
36(주)시영산업현대車 1차밴드 사내협력사 CNC가공 모집
37퍼시픽워터기계 엔지니어 경력 및 신입 채용 - 정규직
38마스터콘라인(주)[신입] 콘솔/포워딩 수입 업무팀
39시에스타스포츠구미김천칠곡왜관 대구 어린이스포츠유아체육/유아축구 교사모집
\n", + "
" + ], + "text/plain": [ + " 기업명 제목\n", + "0 (주)튜링 빠르게 성장 중인 스타트업 [경영지원 매니저]\n", + "1 (주)미창 2022년 상반기 신입·경력직 채용공고(영업/연구/AS직)\n", + "2 케이에스엠(주) [경력/학력 무관] 생산부 직원 채용\n", + "3 엠엠엠인터내셔널(주) KAGE 영재교육원 송도원 사고력/인문/수학/과학 교사 모집\n", + "4 (주)아시안스타 인사총무 담당자(경력) 채용 (사원~대리)\n", + "5 주식회사 카델 컨텐츠 매니저 경력무관 채용(정규직)\n", + "6 주)앤돌핀 디지털마케팅 AE 모집합니다.\n", + "7 (주)에이아이스페라 [경력] 마케팅팀(해외 영어) 채용 공고\n", + "8 선린테크(주) 기업부설연구소 회로파트 정규직 채용\n", + "9 피씨엔오티(주) Java, 머신비전 개발 Setup/PLC제어/ 전장설계,배선 채용\n", + "10 티알 웹디자이너 (포토샵 능숙자) + html /css 가능 (경력우대)\n", + "11 제이피스(주) [주5일/망포] 삼성전자 VOC 담당자 채용\n", + "12 (주)제이앤와이스타일 [쇼핑몰] 분홍코끼리 웹디자인팀 경력사원 채용(성수동 근무)\n", + "13 웨비지(주) 사이트 제작 영업 신입 및 경력 사원을 모집합니다\n", + "14 (주)키스템프 [역삼/영어]나이키 자회사 외국계 패션기업 마케팅팀(VMD) 채용\n", + "15 (주) EVC PLAZA 전기차 충전시설 구축관련 행정사무 및 공정사무원을 모집\n", + "16 (주)드림파트너스 [암호화폐/업계수익률1위] 드림파트너스 영업 신입/경력 채용\n", + "17 정함한의원 한의원 치료실 선생님 (연봉2,600~ / 주5일 선택휴무 압구정\n", + "18 (주)레시펫 반려견 자연식 사료 생산팀(장) 채용 모집\n", + "19 (주)에프앤피 [이케아 동부산점/환경좋음] 배송품포장 및 배차/CS 직원모집\n", + "20 주식회사 금강대부중개 2022 상반기 대출상담/인바운드/대출상담사外 경력직 채용 공고\n", + "21 스탭스 (주) 애니텍 기계설계 업무 정규직 채용\n", + "22 (주)키스템프 [별내역] 유명건설 社 현장사무직 채용\n", + "23 (주)바이오액츠 (BioActs) 바이오사업부 직원 모집 (바이오 시약개발 / 유기합성 / 인허가)\n", + "24 (주)백향목교육 미사소마 사고력수학 전임(주5일) 구인\n", + "25 (주)애피 제네시스부티크 UI/UX 역량을 갖춘 웹퍼블리셔 공고\n", + "26 (주)포인트모바일 S/W 사업본부 각 부문 신입/경력 채용\n", + "27 (주)맨파워그룹코리아 [시청역/복지우수] 한국화웨이 본사 중한통번역사 & Team Assist\n", + "28 유정산업 [ PCB ] 신규 구미 사업장 3조 2교대 사원 모집\n", + "29 (주)스칼라데이터 프론트엔드(React Native) APP 개발자 모집\n", + "30 (주)파인솔루션대부 대출심사 신입 및 경력 채용(부동산 담보대출)\n", + "31 (주)헬로우미스터리 [셀프미] 재고관리/CS관리/오픈마켓 외 정규직 채용(경력무관)\n", + "32 (주)키스템프 [포천/정규직전환] 유명기업 사무직 채용(신입가능/연령무관)\n", + "33 (주)위드엘씨 기업부설연구소 연구원 모집\n", + "34 (주)디젠트 2022년 상반기 전략영업팀 경력직 모집 공고\n", + "35 (주)윈큐브마케팅 (주)윈큐브마케팅 자사몰 운영자 모집 (신입/경력)\n", + "36 (주)시영산업 현대車 1차밴드 사내협력사 CNC가공 모집\n", + "37 퍼시픽워터 기계 엔지니어 경력 및 신입 채용 - 정규직\n", + "38 마스터콘라인(주) [신입] 콘솔/포워딩 수입 업무팀\n", + "39 시에스타스포츠 구미김천칠곡왜관 대구 어린이스포츠유아체육/유아축구 교사모집" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# pandas 로드\n", + "import pandas as pd\n", + "\n", + "# df에 기업명, 제목 데이터를 40개씩 뽑아 추가하여 데이터프레임으로 생성\n", + "df = pd.DataFrame({'기업명' : corp_list[:40], \n", + " '제목': info_list[:40]})\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 심화과제(선택) : \n", + "커리어연세의 취업정보 - 채용공고에 올라오는 회사명, 제목을 40개 뽑아 데이터프레임으로 생성하세요. (selenium 활용)\n", + "\n", + "단, 커리어연세 과제 제출 시 코드 실행 후 자신의 아이디, 비밀번호 작성한 notebook cell은 삭제해서 제출해주세요." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "#셀레늄 라이브러리 불러오기\n", + "from selenium import webdriver\n", + "\n", + "#셀레늄에서 html문서가 생성될 때까지 대기하는 함수 불러오기\n", + "from selenium.webdriver.support.ui import WebDriverWait\n", + "\n", + "#셀레늄에서 조건을 걸어줄 수 있는 함수 불러오기\n", + "from selenium.webdriver.support import expected_conditions as EC\n", + "from selenium.webdriver.common.by import By\n", + "\n", + "\n", + "#키보드 자판을 입력할 수 있는 셀레늄 함수 불러오기\n", + "from selenium.webdriver.common.keys import Keys\n", + "\n", + "#시간에 따른 컨트롤이 가능한 라이브러리 불러오기\n", + "import time\n", + "\n", + "#크롬드라이버 경로 설정\n", + "import sys\n", + "sys.path.insert(0, '/usr/lib/chromium-browser/chromedriver')\n", + "\n", + "from selenium import webdriver\n", + "options = webdriver.ChromeOptions()\n", + "options.add_argument('-headless')\n", + "options.add_argument('-no-sandbox')\n", + "options.add_argument('-disable-dev-shm-usage')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: DeprecationWarning: executable_path has been deprecated, please pass in a Service object\n", + " browser = webdriver.Chrome(executable_path = 'C:/chromedriver_win32/chromedriver.exe')\n" + ] + } + ], + "source": [ + "#드라이버 객체 생성\n", + "browser = webdriver.Chrome(executable_path = 'C:/chromedriver_win32/chromedriver.exe')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "#커리어 연세 사이트로 접속\n", + "browser.get('https://career.yonsei.ac.kr/')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "usr = \"2017123206\"\n", + "pwd = \"sk@qmwisk97'\"" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('/html/body/div/div/div[2]/div/ul/li[1]/a').click()\n", + ":6: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('//*[@id=\"loginId\"]').send_keys(usr)\n", + ":10: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('//*[@id=\"loginPasswd\"]').send_keys(pwd)\n" + ] + } + ], + "source": [ + "#포털계정 로그인\n", + "browser.find_element_by_xpath('/html/body/div/div/div[2]/div/ul/li[1]/a').click()\n", + "browser.implicitly_wait(time_to_wait=2)\n", + "\n", + "#ID 입력\n", + "browser.find_element_by_xpath('//*[@id=\"loginId\"]').send_keys(usr)\n", + "browser.implicitly_wait(time_to_wait=2)\n", + "\n", + "#PW 입력\n", + "browser.find_element_by_xpath('//*[@id=\"loginPasswd\"]').send_keys(pwd)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('//*[@id=\"loginBtn\"]').click()\n" + ] + } + ], + "source": [ + "# 로그인 버튼 클릭 \n", + "browser.find_element_by_xpath('//*[@id=\"loginBtn\"]').click()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", + " browser.find_element_by_xpath('/html/body/div[4]/div[3]/div/button[3]').click()\n" + ] + }, + { + "ename": "NoSuchElementException", + "evalue": "Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"/html/body/div[4]/div[3]/div/button[3]\"}\n (Session info: chrome=97.0.4692.71)\nStacktrace:\nBacktrace:\n\tOrdinal0 [0x0102FDC3+2555331]\n\tOrdinal0 [0x00FC77F1+2127857]\n\tOrdinal0 [0x00EC2E08+1060360]\n\tOrdinal0 [0x00EEE49E+1238174]\n\tOrdinal0 [0x00EEE69B+1238683]\n\tOrdinal0 [0x00F19252+1413714]\n\tOrdinal0 [0x00F07B54+1342292]\n\tOrdinal0 [0x00F175FA+1406458]\n\tOrdinal0 [0x00F07976+1341814]\n\tOrdinal0 [0x00EE36B6+1193654]\n\tOrdinal0 [0x00EE4546+1197382]\n\tGetHandleVerifier [0x011C9622+1619522]\n\tGetHandleVerifier [0x0127882C+2336844]\n\tGetHandleVerifier [0x010C23E1+541697]\n\tGetHandleVerifier [0x010C1443+537699]\n\tOrdinal0 [0x00FCD18E+2150798]\n\tOrdinal0 [0x00FD1518+2168088]\n\tOrdinal0 [0x00FD1660+2168416]\n\tOrdinal0 [0x00FDB330+2208560]\n\tBaseThreadInitThunk [0x7749FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A6E+238]\n", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNoSuchElementException\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# 공지사항 닫기 클릭\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mbrowser\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfind_element_by_xpath\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'/html/body/div[4]/div[3]/div/button[3]'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclick\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mfind_element_by_xpath\u001b[1;34m(self, xpath)\u001b[0m\n\u001b[0;32m 518\u001b[0m \u001b[0mstacklevel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 519\u001b[0m )\n\u001b[1;32m--> 520\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfind_element\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mby\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mBy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mXPATH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mxpath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 521\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 522\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mfind_elements_by_xpath\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mxpath\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[0mWebElement\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mfind_element\u001b[1;34m(self, by, value)\u001b[0m\n\u001b[0;32m 1242\u001b[0m \u001b[0mvalue\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'[name=\"%s\"]'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1243\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1244\u001b[1;33m return self.execute(Command.FIND_ELEMENT, {\n\u001b[0m\u001b[0;32m 1245\u001b[0m \u001b[1;34m'using'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mby\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1246\u001b[0m 'value': value})['value']\n", + "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mexecute\u001b[1;34m(self, driver_command, params)\u001b[0m\n\u001b[0;32m 422\u001b[0m \u001b[0mresponse\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcommand_executor\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdriver_command\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 423\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mresponse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 424\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0merror_handler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcheck_response\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 425\u001b[0m response['value'] = self._unwrap_value(\n\u001b[0;32m 426\u001b[0m response.get('value', None))\n", + "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\errorhandler.py\u001b[0m in \u001b[0;36mcheck_response\u001b[1;34m(self, response)\u001b[0m\n\u001b[0;32m 245\u001b[0m \u001b[0malert_text\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'alert'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'text'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 246\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mexception_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscreen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstacktrace\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malert_text\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# type: ignore[call-arg] # mypy is not smart enough here\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 247\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mexception_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscreen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstacktrace\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 248\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 249\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_value_or_default\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mMapping\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0m_KT\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0m_KT\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNoSuchElementException\u001b[0m: Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"/html/body/div[4]/div[3]/div/button[3]\"}\n (Session info: chrome=97.0.4692.71)\nStacktrace:\nBacktrace:\n\tOrdinal0 [0x0102FDC3+2555331]\n\tOrdinal0 [0x00FC77F1+2127857]\n\tOrdinal0 [0x00EC2E08+1060360]\n\tOrdinal0 [0x00EEE49E+1238174]\n\tOrdinal0 [0x00EEE69B+1238683]\n\tOrdinal0 [0x00F19252+1413714]\n\tOrdinal0 [0x00F07B54+1342292]\n\tOrdinal0 [0x00F175FA+1406458]\n\tOrdinal0 [0x00F07976+1341814]\n\tOrdinal0 [0x00EE36B6+1193654]\n\tOrdinal0 [0x00EE4546+1197382]\n\tGetHandleVerifier [0x011C9622+1619522]\n\tGetHandleVerifier [0x0127882C+2336844]\n\tGetHandleVerifier [0x010C23E1+541697]\n\tGetHandleVerifier [0x010C1443+537699]\n\tOrdinal0 [0x00FCD18E+2150798]\n\tOrdinal0 [0x00FD1518+2168088]\n\tOrdinal0 [0x00FD1660+2168416]\n\tOrdinal0 [0x00FDB330+2208560]\n\tBaseThreadInitThunk [0x7749FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A6E+238]\n" + ] + } + ], + "source": [ + "# 공지사항 닫기 클릭 \n", + "browser.find_element_by_xpath('/html/body/div[4]/div[3]/div/button[3]').click()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# 채용공고 클릭 \n", + "browser.find_element_by_xpath('//*[@id=\"mainWidgetUseLstWrap\"]/li[5]/div/a').click()\n", + "browser.implicitly_wait(time_to_wait=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 81c445dee530c25f30af09479f7be8b445d9f2ab Mon Sep 17 00:00:00 2001 From: HanbinKim1004 <77422840+HanbinKim1004@users.noreply.github.com> Date: Fri, 4 Feb 2022 00:47:20 +0900 Subject: [PATCH 5/5] =?UTF-8?q?Delete=20[DSL]Session=5F3=5FCrawling=5F?= =?UTF-8?q?=EA=B3=BC=EC=A0=9C=5F=EA=B9=80=ED=95=9C=EB=B9=88.ipynb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...352\271\200\355\225\234\353\271\210.ipynb" | 682 ------------------ 1 file changed, 682 deletions(-) delete mode 100644 "[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" diff --git "a/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" "b/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" deleted file mode 100644 index 3d2c789..0000000 --- "a/[DSL]Session_3_Crawling_\352\263\274\354\240\234_\352\271\200\355\225\234\353\271\210.ipynb" +++ /dev/null @@ -1,682 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "#크롬드라이버 경로 설정\n", - "import sys\n", - "sys.path.insert(0, '/usr/lib/chromium-browser/chromedriver')" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\rlagk\\anaconda3\\lib\\site-packages\\requests\\__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.8) or chardet (3.0.4) doesn't match a supported version!\n", - " warnings.warn(\"urllib3 ({}) or chardet ({}) doesn't match a supported \"\n" - ] - } - ], - "source": [ - "#정보요청 라이브러리 import\n", - "import requests\n", - "\n", - "#크롤링 라이브러리 import|\n", - "from bs4 import BeautifulSoup " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 기본과제(필수) : \n", - "\n", - "사람인의 채용정보 페이지에서 추천 지역의 아래의 회사명, 제목을 40개 뽑아 데이터프레임으로 생성하세요. (beautifulsoup 활용)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "200" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#사람인에 정보요청\n", - "saramin = requests.get(\"https://www.saramin.co.kr/zf_user/\")\n", - "\n", - "# 사람인 응답코드 확인\n", - "saramin.status_code" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "#User-Agent 지정\n", - "headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "#크롤링 할 대상 url 지정\n", - "url = 'https://www.saramin.co.kr/zf_user/jobs/list/domestic'\n", - "\n", - "#크롤링 대상 url과 headers를 기반으로 정보 요청\n", - "res = requests.get(url, headers = headers)\n", - "\n", - "#정상적으로 정보를 받은 경우 지속, 그렇지 않은 경우 중지\n", - "res.raise_for_status()\n", - "\n", - "#html문서를 beautifulsoup의 lxml 형태로 변환\n", - "soup = BeautifulSoup(res.text, 'lxml') " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# 추천지역 섹션을 find해서 list_body로 할당 \n", - "list_body = soup.find('div', attrs = {'class' : 'list_body'})\n", - "\n", - "# listbody 중 회사명 정보가 있는 col company_nm부분을 company_nm에 할당 \n", - "company_nm = list_body.findAll('div', attrs = {'class' : 'col company_nm'})\n", - "\n", - "# listbody 중 제목정보가 있는 col notification_info부분을 company_info에 할당 \n", - "company_info = list_body.findAll('div', attrs = {'class' : 'col notification_info'})" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# 기업명 정보 corp_list를 생성 \n", - "corp_list = []\n", - "\n", - "# 제목에 해당하는 title데이터를 for문으로 corp_list에 추가해줌\n", - "for i in company_nm:\n", - " corp = i.a['title']\n", - " corp_list.append(corp)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# 제목 정보 info_list를 생성 \n", - "info_list = []\n", - "\n", - "# 제목에 해당하는 title데이터를 for문으로 info_list에 추가해줌\n", - "for i in company_info:\n", - " info = i.a['title']\n", - " info_list.append(info)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
기업명제목
0(주)튜링빠르게 성장 중인 스타트업 [경영지원 매니저]
1(주)미창2022년 상반기 신입·경력직 채용공고(영업/연구/AS직)
2케이에스엠(주)[경력/학력 무관] 생산부 직원 채용
3엠엠엠인터내셔널(주)KAGE 영재교육원 송도원 사고력/인문/수학/과학 교사 모집
4(주)아시안스타인사총무 담당자(경력) 채용 (사원~대리)
5주식회사 카델컨텐츠 매니저 경력무관 채용(정규직)
6주)앤돌핀디지털마케팅 AE 모집합니다.
7(주)에이아이스페라[경력] 마케팅팀(해외 영어) 채용 공고
8선린테크(주)기업부설연구소 회로파트 정규직 채용
9피씨엔오티(주)Java, 머신비전 개발 Setup/PLC제어/ 전장설계,배선 채용
10티알웹디자이너 (포토샵 능숙자) + html /css 가능 (경력우대)
11제이피스(주)[주5일/망포] 삼성전자 VOC 담당자 채용
12(주)제이앤와이스타일[쇼핑몰] 분홍코끼리 웹디자인팀 경력사원 채용(성수동 근무)
13웨비지(주)사이트 제작 영업 신입 및 경력 사원을 모집합니다
14(주)키스템프[역삼/영어]나이키 자회사 외국계 패션기업 마케팅팀(VMD) 채용
15(주) EVC PLAZA전기차 충전시설 구축관련 행정사무 및 공정사무원을 모집
16(주)드림파트너스[암호화폐/업계수익률1위] 드림파트너스 영업 신입/경력 채용
17정함한의원한의원 치료실 선생님 (연봉2,600~ / 주5일 선택휴무 압구정
18(주)레시펫반려견 자연식 사료 생산팀(장) 채용 모집
19(주)에프앤피[이케아 동부산점/환경좋음] 배송품포장 및 배차/CS 직원모집
20주식회사 금강대부중개2022 상반기 대출상담/인바운드/대출상담사外 경력직 채용 공고
21스탭스 (주)애니텍 기계설계 업무 정규직 채용
22(주)키스템프[별내역] 유명건설 社 현장사무직 채용
23(주)바이오액츠 (BioActs)바이오사업부 직원 모집 (바이오 시약개발 / 유기합성 / 인허가)
24(주)백향목교육미사소마 사고력수학 전임(주5일) 구인
25(주)애피제네시스부티크 UI/UX 역량을 갖춘 웹퍼블리셔 공고
26(주)포인트모바일S/W 사업본부 각 부문 신입/경력 채용
27(주)맨파워그룹코리아[시청역/복지우수] 한국화웨이 본사 중한통번역사 &amp; Team Assist
28유정산업[ PCB ] 신규 구미 사업장 3조 2교대 사원 모집
29(주)스칼라데이터프론트엔드(React Native) APP 개발자 모집
30(주)파인솔루션대부대출심사 신입 및 경력 채용(부동산 담보대출)
31(주)헬로우미스터리[셀프미] 재고관리/CS관리/오픈마켓 외 정규직 채용(경력무관)
32(주)키스템프[포천/정규직전환] 유명기업 사무직 채용(신입가능/연령무관)
33(주)위드엘씨기업부설연구소 연구원 모집
34(주)디젠트2022년 상반기 전략영업팀 경력직 모집 공고
35(주)윈큐브마케팅(주)윈큐브마케팅 자사몰 운영자 모집 (신입/경력)
36(주)시영산업현대車 1차밴드 사내협력사 CNC가공 모집
37퍼시픽워터기계 엔지니어 경력 및 신입 채용 - 정규직
38마스터콘라인(주)[신입] 콘솔/포워딩 수입 업무팀
39시에스타스포츠구미김천칠곡왜관 대구 어린이스포츠유아체육/유아축구 교사모집
\n", - "
" - ], - "text/plain": [ - " 기업명 제목\n", - "0 (주)튜링 빠르게 성장 중인 스타트업 [경영지원 매니저]\n", - "1 (주)미창 2022년 상반기 신입·경력직 채용공고(영업/연구/AS직)\n", - "2 케이에스엠(주) [경력/학력 무관] 생산부 직원 채용\n", - "3 엠엠엠인터내셔널(주) KAGE 영재교육원 송도원 사고력/인문/수학/과학 교사 모집\n", - "4 (주)아시안스타 인사총무 담당자(경력) 채용 (사원~대리)\n", - "5 주식회사 카델 컨텐츠 매니저 경력무관 채용(정규직)\n", - "6 주)앤돌핀 디지털마케팅 AE 모집합니다.\n", - "7 (주)에이아이스페라 [경력] 마케팅팀(해외 영어) 채용 공고\n", - "8 선린테크(주) 기업부설연구소 회로파트 정규직 채용\n", - "9 피씨엔오티(주) Java, 머신비전 개발 Setup/PLC제어/ 전장설계,배선 채용\n", - "10 티알 웹디자이너 (포토샵 능숙자) + html /css 가능 (경력우대)\n", - "11 제이피스(주) [주5일/망포] 삼성전자 VOC 담당자 채용\n", - "12 (주)제이앤와이스타일 [쇼핑몰] 분홍코끼리 웹디자인팀 경력사원 채용(성수동 근무)\n", - "13 웨비지(주) 사이트 제작 영업 신입 및 경력 사원을 모집합니다\n", - "14 (주)키스템프 [역삼/영어]나이키 자회사 외국계 패션기업 마케팅팀(VMD) 채용\n", - "15 (주) EVC PLAZA 전기차 충전시설 구축관련 행정사무 및 공정사무원을 모집\n", - "16 (주)드림파트너스 [암호화폐/업계수익률1위] 드림파트너스 영업 신입/경력 채용\n", - "17 정함한의원 한의원 치료실 선생님 (연봉2,600~ / 주5일 선택휴무 압구정\n", - "18 (주)레시펫 반려견 자연식 사료 생산팀(장) 채용 모집\n", - "19 (주)에프앤피 [이케아 동부산점/환경좋음] 배송품포장 및 배차/CS 직원모집\n", - "20 주식회사 금강대부중개 2022 상반기 대출상담/인바운드/대출상담사外 경력직 채용 공고\n", - "21 스탭스 (주) 애니텍 기계설계 업무 정규직 채용\n", - "22 (주)키스템프 [별내역] 유명건설 社 현장사무직 채용\n", - "23 (주)바이오액츠 (BioActs) 바이오사업부 직원 모집 (바이오 시약개발 / 유기합성 / 인허가)\n", - "24 (주)백향목교육 미사소마 사고력수학 전임(주5일) 구인\n", - "25 (주)애피 제네시스부티크 UI/UX 역량을 갖춘 웹퍼블리셔 공고\n", - "26 (주)포인트모바일 S/W 사업본부 각 부문 신입/경력 채용\n", - "27 (주)맨파워그룹코리아 [시청역/복지우수] 한국화웨이 본사 중한통번역사 & Team Assist\n", - "28 유정산업 [ PCB ] 신규 구미 사업장 3조 2교대 사원 모집\n", - "29 (주)스칼라데이터 프론트엔드(React Native) APP 개발자 모집\n", - "30 (주)파인솔루션대부 대출심사 신입 및 경력 채용(부동산 담보대출)\n", - "31 (주)헬로우미스터리 [셀프미] 재고관리/CS관리/오픈마켓 외 정규직 채용(경력무관)\n", - "32 (주)키스템프 [포천/정규직전환] 유명기업 사무직 채용(신입가능/연령무관)\n", - "33 (주)위드엘씨 기업부설연구소 연구원 모집\n", - "34 (주)디젠트 2022년 상반기 전략영업팀 경력직 모집 공고\n", - "35 (주)윈큐브마케팅 (주)윈큐브마케팅 자사몰 운영자 모집 (신입/경력)\n", - "36 (주)시영산업 현대車 1차밴드 사내협력사 CNC가공 모집\n", - "37 퍼시픽워터 기계 엔지니어 경력 및 신입 채용 - 정규직\n", - "38 마스터콘라인(주) [신입] 콘솔/포워딩 수입 업무팀\n", - "39 시에스타스포츠 구미김천칠곡왜관 대구 어린이스포츠유아체육/유아축구 교사모집" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# pandas 로드\n", - "import pandas as pd\n", - "\n", - "# df에 기업명, 제목 데이터를 40개씩 뽑아 추가하여 데이터프레임으로 생성\n", - "df = pd.DataFrame({'기업명' : corp_list[:40], \n", - " '제목': info_list[:40]})\n", - "df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 심화과제(선택) : \n", - "커리어연세의 취업정보 - 채용공고에 올라오는 회사명, 제목을 40개 뽑아 데이터프레임으로 생성하세요. (selenium 활용)\n", - "\n", - "단, 커리어연세 과제 제출 시 코드 실행 후 자신의 아이디, 비밀번호 작성한 notebook cell은 삭제해서 제출해주세요." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "#셀레늄 라이브러리 불러오기\n", - "from selenium import webdriver\n", - "\n", - "#셀레늄에서 html문서가 생성될 때까지 대기하는 함수 불러오기\n", - "from selenium.webdriver.support.ui import WebDriverWait\n", - "\n", - "#셀레늄에서 조건을 걸어줄 수 있는 함수 불러오기\n", - "from selenium.webdriver.support import expected_conditions as EC\n", - "from selenium.webdriver.common.by import By\n", - "\n", - "\n", - "#키보드 자판을 입력할 수 있는 셀레늄 함수 불러오기\n", - "from selenium.webdriver.common.keys import Keys\n", - "\n", - "#시간에 따른 컨트롤이 가능한 라이브러리 불러오기\n", - "import time\n", - "\n", - "#크롬드라이버 경로 설정\n", - "import sys\n", - "sys.path.insert(0, '/usr/lib/chromium-browser/chromedriver')\n", - "\n", - "from selenium import webdriver\n", - "options = webdriver.ChromeOptions()\n", - "options.add_argument('-headless')\n", - "options.add_argument('-no-sandbox')\n", - "options.add_argument('-disable-dev-shm-usage')" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":2: DeprecationWarning: executable_path has been deprecated, please pass in a Service object\n", - " browser = webdriver.Chrome(executable_path = 'C:/chromedriver_win32/chromedriver.exe')\n" - ] - } - ], - "source": [ - "#드라이버 객체 생성\n", - "browser = webdriver.Chrome(executable_path = 'C:/chromedriver_win32/chromedriver.exe')" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "#커리어 연세 사이트로 접속\n", - "browser.get('https://career.yonsei.ac.kr/')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "usr = \"2017123206\"\n", - "pwd = \"sk@qmwisk97'\"" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", - " browser.find_element_by_xpath('/html/body/div/div/div[2]/div/ul/li[1]/a').click()\n", - ":6: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", - " browser.find_element_by_xpath('//*[@id=\"loginId\"]').send_keys(usr)\n", - ":10: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", - " browser.find_element_by_xpath('//*[@id=\"loginPasswd\"]').send_keys(pwd)\n" - ] - } - ], - "source": [ - "#포털계정 로그인\n", - "browser.find_element_by_xpath('/html/body/div/div/div[2]/div/ul/li[1]/a').click()\n", - "browser.implicitly_wait(time_to_wait=2)\n", - "\n", - "#ID 입력\n", - "browser.find_element_by_xpath('//*[@id=\"loginId\"]').send_keys(usr)\n", - "browser.implicitly_wait(time_to_wait=2)\n", - "\n", - "#PW 입력\n", - "browser.find_element_by_xpath('//*[@id=\"loginPasswd\"]').send_keys(pwd)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", - " browser.find_element_by_xpath('//*[@id=\"loginBtn\"]').click()\n" - ] - } - ], - "source": [ - "# 로그인 버튼 클릭 \n", - "browser.find_element_by_xpath('//*[@id=\"loginBtn\"]').click()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":2: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead\n", - " browser.find_element_by_xpath('/html/body/div[4]/div[3]/div/button[3]').click()\n" - ] - }, - { - "ename": "NoSuchElementException", - "evalue": "Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"/html/body/div[4]/div[3]/div/button[3]\"}\n (Session info: chrome=97.0.4692.71)\nStacktrace:\nBacktrace:\n\tOrdinal0 [0x0102FDC3+2555331]\n\tOrdinal0 [0x00FC77F1+2127857]\n\tOrdinal0 [0x00EC2E08+1060360]\n\tOrdinal0 [0x00EEE49E+1238174]\n\tOrdinal0 [0x00EEE69B+1238683]\n\tOrdinal0 [0x00F19252+1413714]\n\tOrdinal0 [0x00F07B54+1342292]\n\tOrdinal0 [0x00F175FA+1406458]\n\tOrdinal0 [0x00F07976+1341814]\n\tOrdinal0 [0x00EE36B6+1193654]\n\tOrdinal0 [0x00EE4546+1197382]\n\tGetHandleVerifier [0x011C9622+1619522]\n\tGetHandleVerifier [0x0127882C+2336844]\n\tGetHandleVerifier [0x010C23E1+541697]\n\tGetHandleVerifier [0x010C1443+537699]\n\tOrdinal0 [0x00FCD18E+2150798]\n\tOrdinal0 [0x00FD1518+2168088]\n\tOrdinal0 [0x00FD1660+2168416]\n\tOrdinal0 [0x00FDB330+2208560]\n\tBaseThreadInitThunk [0x7749FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A6E+238]\n", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNoSuchElementException\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# 공지사항 닫기 클릭\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mbrowser\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfind_element_by_xpath\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'/html/body/div[4]/div[3]/div/button[3]'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclick\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mfind_element_by_xpath\u001b[1;34m(self, xpath)\u001b[0m\n\u001b[0;32m 518\u001b[0m \u001b[0mstacklevel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 519\u001b[0m )\n\u001b[1;32m--> 520\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfind_element\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mby\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mBy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mXPATH\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mxpath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 521\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 522\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mfind_elements_by_xpath\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mxpath\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[0mWebElement\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mfind_element\u001b[1;34m(self, by, value)\u001b[0m\n\u001b[0;32m 1242\u001b[0m \u001b[0mvalue\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'[name=\"%s\"]'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1243\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1244\u001b[1;33m return self.execute(Command.FIND_ELEMENT, {\n\u001b[0m\u001b[0;32m 1245\u001b[0m \u001b[1;34m'using'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mby\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1246\u001b[0m 'value': value})['value']\n", - "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py\u001b[0m in \u001b[0;36mexecute\u001b[1;34m(self, driver_command, params)\u001b[0m\n\u001b[0;32m 422\u001b[0m \u001b[0mresponse\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcommand_executor\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdriver_command\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 423\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mresponse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 424\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0merror_handler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcheck_response\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 425\u001b[0m response['value'] = self._unwrap_value(\n\u001b[0;32m 426\u001b[0m response.get('value', None))\n", - "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\selenium\\webdriver\\remote\\errorhandler.py\u001b[0m in \u001b[0;36mcheck_response\u001b[1;34m(self, response)\u001b[0m\n\u001b[0;32m 245\u001b[0m \u001b[0malert_text\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'alert'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'text'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 246\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mexception_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscreen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstacktrace\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malert_text\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# type: ignore[call-arg] # mypy is not smart enough here\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 247\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mexception_class\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscreen\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstacktrace\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 248\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 249\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_value_or_default\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mMapping\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0m_KT\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0m_KT\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[0m_VT\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mNoSuchElementException\u001b[0m: Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"/html/body/div[4]/div[3]/div/button[3]\"}\n (Session info: chrome=97.0.4692.71)\nStacktrace:\nBacktrace:\n\tOrdinal0 [0x0102FDC3+2555331]\n\tOrdinal0 [0x00FC77F1+2127857]\n\tOrdinal0 [0x00EC2E08+1060360]\n\tOrdinal0 [0x00EEE49E+1238174]\n\tOrdinal0 [0x00EEE69B+1238683]\n\tOrdinal0 [0x00F19252+1413714]\n\tOrdinal0 [0x00F07B54+1342292]\n\tOrdinal0 [0x00F175FA+1406458]\n\tOrdinal0 [0x00F07976+1341814]\n\tOrdinal0 [0x00EE36B6+1193654]\n\tOrdinal0 [0x00EE4546+1197382]\n\tGetHandleVerifier [0x011C9622+1619522]\n\tGetHandleVerifier [0x0127882C+2336844]\n\tGetHandleVerifier [0x010C23E1+541697]\n\tGetHandleVerifier [0x010C1443+537699]\n\tOrdinal0 [0x00FCD18E+2150798]\n\tOrdinal0 [0x00FD1518+2168088]\n\tOrdinal0 [0x00FD1660+2168416]\n\tOrdinal0 [0x00FDB330+2208560]\n\tBaseThreadInitThunk [0x7749FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x77CA7A6E+238]\n" - ] - } - ], - "source": [ - "# 공지사항 닫기 클릭 \n", - "browser.find_element_by_xpath('/html/body/div[4]/div[3]/div/button[3]').click()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# 채용공고 클릭 \n", - "browser.find_element_by_xpath('//*[@id=\"mainWidgetUseLstWrap\"]/li[5]/div/a').click()\n", - "browser.implicitly_wait(time_to_wait=2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -}