diff --git a/backend/crawling/crawling_demo_jikhaeng.ipynb b/backend/crawling/crawling_demo_jikhaeng.ipynb
index 1ee7d5b8e..82b9ca9f6 100644
--- a/backend/crawling/crawling_demo_jikhaeng.ipynb
+++ b/backend/crawling/crawling_demo_jikhaeng.ipynb
@@ -10,7 +10,7 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 2,
"id": "e98fe0d3",
"metadata": {},
"outputs": [
@@ -170,7 +170,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"id": "8f905112",
"metadata": {},
"outputs": [
@@ -178,14 +178,52 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "๐ผ๏ธ [2] ํ
์คํธ ๋ฏธ์กด์ฌ โ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: KT_๊ณต๊ณ 2.png\n",
- "๐ผ๏ธ [3] ํ
์คํธ ๋ฏธ์กด์ฌ โ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: ๋ค์ฌํฌ์์ฆ๊ถ_๊ณต๊ณ 3.png\n",
- "๐ผ๏ธ [4] ํ
์คํธ ๋ฏธ์กด์ฌ โ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: NHN ํด๋ผ์ฐ๋_๊ณต๊ณ 4.png\n",
- "๐ผ๏ธ [5] ํ
์คํธ ๋ฏธ์กด์ฌ โ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: ๋์กด๋น์ฆ์จ_๊ณต๊ณ 5.png\n",
- "๐ผ๏ธ [6] ํ
์คํธ ๋ฏธ์กด์ฌ โ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: ์์จ์ํํธ_๊ณต๊ณ 6.png\n",
- "๐ผ๏ธ [7] ํ
์คํธ ๋ฏธ์กด์ฌ โ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: ์นด์นด์ค_๊ณต๊ณ 7.png\n",
- "โ
[8] ํ
์คํธ ๊ธฐ๋ฐ ์ฐ๋์ฌํญ/์๊ฒฉ์๊ฑด ํฌ๋กค๋ง ์๋ฃ\n",
- "โ
[9] ํ
์คํธ ๊ธฐ๋ฐ ์ฐ๋์ฌํญ/์๊ฒฉ์๊ฑด ํฌ๋กค๋ง ์๋ฃ\n",
+ "๐ผ๏ธ [2] ํ
์คํธ ๋ฏธ์กด์ฌ โ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: ์ฟ ํก_๊ณต๊ณ 2.png\n",
+ "โ [3] ์ด๋ฏธ์ง ํฌ๋กค๋ง ์คํจ: Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[4]/img\"}\n",
+ " (Session info: chrome=137.0.7151.69); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception\n",
+ "Stacktrace:\n",
+ "0 chromedriver 0x000000010504a654 cxxbridge1$str$ptr + 2723108\n",
+ "1 chromedriver 0x00000001050428c8 cxxbridge1$str$ptr + 2690968\n",
+ "2 chromedriver 0x0000000104b96714 cxxbridge1$string$len + 90428\n",
+ "3 chromedriver 0x0000000104bdd7c0 cxxbridge1$string$len + 381416\n",
+ "4 chromedriver 0x0000000104c1ede8 cxxbridge1$string$len + 649232\n",
+ "5 chromedriver 0x0000000104bd19c8 cxxbridge1$string$len + 332784\n",
+ "6 chromedriver 0x000000010500e278 cxxbridge1$str$ptr + 2476360\n",
+ "7 chromedriver 0x000000010501150c cxxbridge1$str$ptr + 2489308\n",
+ "8 chromedriver 0x0000000104fefa64 cxxbridge1$str$ptr + 2351412\n",
+ "9 chromedriver 0x0000000105011d94 cxxbridge1$str$ptr + 2491492\n",
+ "10 chromedriver 0x0000000104fe0d58 cxxbridge1$str$ptr + 2290728\n",
+ "11 chromedriver 0x0000000105031d60 cxxbridge1$str$ptr + 2622512\n",
+ "12 chromedriver 0x0000000105031eec cxxbridge1$str$ptr + 2622908\n",
+ "13 chromedriver 0x0000000105042514 cxxbridge1$str$ptr + 2690020\n",
+ "14 libsystem_pthread.dylib 0x00000001901cec0c _pthread_start + 136\n",
+ "15 libsystem_pthread.dylib 0x00000001901c9b80 thread_start + 8\n",
+ "\n",
+ "โ [4] ์ด๋ฏธ์ง ํฌ๋กค๋ง ์คํจ: Message: no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"//*[@id=\"root\"]/main/div[2]/div[1]/div[1]/div[4]/img\"}\n",
+ " (Session info: chrome=137.0.7151.69); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception\n",
+ "Stacktrace:\n",
+ "0 chromedriver 0x000000010504a654 cxxbridge1$str$ptr + 2723108\n",
+ "1 chromedriver 0x00000001050428c8 cxxbridge1$str$ptr + 2690968\n",
+ "2 chromedriver 0x0000000104b96714 cxxbridge1$string$len + 90428\n",
+ "3 chromedriver 0x0000000104bdd7c0 cxxbridge1$string$len + 381416\n",
+ "4 chromedriver 0x0000000104c1ede8 cxxbridge1$string$len + 649232\n",
+ "5 chromedriver 0x0000000104bd19c8 cxxbridge1$string$len + 332784\n",
+ "6 chromedriver 0x000000010500e278 cxxbridge1$str$ptr + 2476360\n",
+ "7 chromedriver 0x000000010501150c cxxbridge1$str$ptr + 2489308\n",
+ "8 chromedriver 0x0000000104fefa64 cxxbridge1$str$ptr + 2351412\n",
+ "9 chromedriver 0x0000000105011d94 cxxbridge1$str$ptr + 2491492\n",
+ "10 chromedriver 0x0000000104fe0d58 cxxbridge1$str$ptr + 2290728\n",
+ "11 chromedriver 0x0000000105031d60 cxxbridge1$str$ptr + 2622512\n",
+ "12 chromedriver 0x0000000105031eec cxxbridge1$str$ptr + 2622908\n",
+ "13 chromedriver 0x0000000105042514 cxxbridge1$str$ptr + 2690020\n",
+ "14 libsystem_pthread.dylib 0x00000001901cec0c _pthread_start + 136\n",
+ "15 libsystem_pthread.dylib 0x00000001901c9b80 thread_start + 8\n",
+ "\n",
+ "๐ผ๏ธ [5] ํ
์คํธ ๋ฏธ์กด์ฌ โ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: ๋ค์ด๋ฒํด๋ผ์ฐ๋_๊ณต๊ณ 5.png\n",
+ "๐ผ๏ธ [6] ํ
์คํธ ๋ฏธ์กด์ฌ โ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: ํด๋ก๋ด_๊ณต๊ณ 6.png\n",
+ "๐ผ๏ธ [7] ํ
์คํธ ๋ฏธ์กด์ฌ โ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: ์ฝ์จ์ด_๊ณต๊ณ 7.png\n",
+ "๐ผ๏ธ [8] ํ
์คํธ ๋ฏธ์กด์ฌ โ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: NHN_๊ณต๊ณ 8.png\n",
+ "๐ผ๏ธ [9] ํ
์คํธ ๋ฏธ์กด์ฌ โ ์ด๋ฏธ์ง ์ ์ฅ ์๋ฃ: ๋ค์ด๋ฒํด๋ผ์ฐ๋_๊ณต๊ณ 9.png\n",
"โ
[10] ํ
์คํธ ๊ธฐ๋ฐ ์ฐ๋์ฌํญ/์๊ฒฉ์๊ฑด ํฌ๋กค๋ง ์๋ฃ\n",
"โ
์์
์ ์ฅ ์๋ฃ\n"
]
@@ -304,7 +342,203 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": 3,
+ "id": "558f983c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " ํ์ฌ๋ช
| \n",
+ " ๊ฒฝ๋ ฅ | \n",
+ " ํ๋ ฅ | \n",
+ " ๊ทผ๋ฌด์ง | \n",
+ " ์ง๊ตฐ | \n",
+ " ์ด๋ฏธ์ง๊ฒฝ๋ก | \n",
+ " ์ฐ๋์ฌํญ | \n",
+ " ์๊ฒฉ์๊ฑด | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " ์ฟ ํก | \n",
+ " ์ ์
| \n",
+ " ํ์ฌ | \n",
+ " ์์ธ | \n",
+ " ์๋ฒยท๋ฐฑ์๋, ์๋๋ก์ด๋, iOS | \n",
+ " downloads/์ฟ ํก_๊ณต๊ณ 2.png | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " ํ๋ฆฌ๋ถ๋จ | \n",
+ " 3~8๋
์ฐจ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ๊ธฐํ | \n",
+ " ์๋ฒยท๋ฐฑ์๋, DevOpsยทSRE | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " ํ๋ฆฌ๋ถ๋จ | \n",
+ " 2~8๋
์ฐจ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ์์ธ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " ๋ค์ด๋ฒํด๋ผ์ฐ๋ | \n",
+ " ๊ฒฝ๋ ฅ ๋ฌด๊ด | \n",
+ " ํ์ฌ | \n",
+ " ๊ฒฝ๊ธฐ | \n",
+ " ๊ธฐํ๊ต์ก, ์๋ฒยท๋ฐฑ์๋ | \n",
+ " downloads/๋ค์ด๋ฒํด๋ผ์ฐ๋_๊ณต๊ณ 5.png | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " ํด๋ก๋ด | \n",
+ " 10๋
์ฐจ ์ด์ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ์์ธ | \n",
+ " ๊ธฐํ์์ง๋์ด๋งยทR&D, ๋ก๋ดSW, ์๋ฒยท๋ฐฑ์๋, ํ๋ก ํธ์๋ | \n",
+ " downloads/ํด๋ก๋ด_๊ณต๊ณ 6.png | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " ์ฝ์จ์ด | \n",
+ " 7๋
์ฐจ ์ด์ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ์์ธ | \n",
+ " ์๋ฒยท๋ฐฑ์๋, ์ฌ๋ฌผ์ธํฐ๋ท(IoT), DevOpsยทSRE | \n",
+ " downloads/์ฝ์จ์ด_๊ณต๊ณ 7.png | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " NHN | \n",
+ " 5๋
์ฐจ ์ด์ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ๊ฒฝ๊ธฐ | \n",
+ " ์๋ฒยท๋ฐฑ์๋, ์ํํธ์จ์ด ์์ง๋์ด, ๊ฒ์๊ฐ๋ฐ(์๋ฒ) | \n",
+ " downloads/NHN_๊ณต๊ณ 8.png | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " ๋ค์ด๋ฒํด๋ผ์ฐ๋ | \n",
+ " 3๋
์ฐจ, 10๋
์ฐจ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ๊ฒฝ๊ธฐ | \n",
+ " ์๋๋ก์ด๋, iOS, ํ๋ก ํธ์๋, ์๋ฒยท๋ฐฑ์๋ | \n",
+ " downloads/๋ค์ด๋ฒํด๋ผ์ฐ๋_๊ณต๊ณ 9.png | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " ์กํฐ๋ถํค | \n",
+ " 3~10๋
์ฐจ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ์ ๋ถ | \n",
+ " ์๋ฒยท๋ฐฑ์๋, ๋ฐฑ์๋, ์นํ์คํ | \n",
+ " | \n",
+ " โข ์ง๋ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์\\nโข ๊ฒฐ์ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์\\nโข B2C ํ๋ซํผ ๊ฐ๋ฐ ๊ฒฝ... | \n",
+ " โข ๊ฐ๋ฐ 3๋
์ด์ ๊ฒฝ๋ ฅ์ ์ค๊ธ๊ฐ๋ฐ์\\nโข IntelliJ ๊ฐ๋ฅ\\nโข Spring ... | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " ํ์ฌ๋ช
๊ฒฝ๋ ฅ ํ๋ ฅ ๊ทผ๋ฌด์ง ์ง๊ตฐ \\\n",
+ "0 ์ฟ ํก ์ ์
ํ์ฌ ์์ธ ์๋ฒยท๋ฐฑ์๋, ์๋๋ก์ด๋, iOS \n",
+ "1 ํ๋ฆฌ๋ถ๋จ 3~8๋
์ฐจ ํ๋ ฅ ๋ฌด๊ด ๊ธฐํ ์๋ฒยท๋ฐฑ์๋, DevOpsยทSRE \n",
+ "2 ํ๋ฆฌ๋ถ๋จ 2~8๋
์ฐจ ํ๋ ฅ ๋ฌด๊ด ์์ธ ์๋ฒยท๋ฐฑ์๋ \n",
+ "3 ๋ค์ด๋ฒํด๋ผ์ฐ๋ ๊ฒฝ๋ ฅ ๋ฌด๊ด ํ์ฌ ๊ฒฝ๊ธฐ ๊ธฐํ๊ต์ก, ์๋ฒยท๋ฐฑ์๋ \n",
+ "4 ํด๋ก๋ด 10๋
์ฐจ ์ด์ ํ๋ ฅ ๋ฌด๊ด ์์ธ ๊ธฐํ์์ง๋์ด๋งยทR&D, ๋ก๋ดSW, ์๋ฒยท๋ฐฑ์๋, ํ๋ก ํธ์๋ \n",
+ "5 ์ฝ์จ์ด 7๋
์ฐจ ์ด์ ํ๋ ฅ ๋ฌด๊ด ์์ธ ์๋ฒยท๋ฐฑ์๋, ์ฌ๋ฌผ์ธํฐ๋ท(IoT), DevOpsยทSRE \n",
+ "6 NHN 5๋
์ฐจ ์ด์ ํ๋ ฅ ๋ฌด๊ด ๊ฒฝ๊ธฐ ์๋ฒยท๋ฐฑ์๋, ์ํํธ์จ์ด ์์ง๋์ด, ๊ฒ์๊ฐ๋ฐ(์๋ฒ) \n",
+ "7 ๋ค์ด๋ฒํด๋ผ์ฐ๋ 3๋
์ฐจ, 10๋
์ฐจ ํ๋ ฅ ๋ฌด๊ด ๊ฒฝ๊ธฐ ์๋๋ก์ด๋, iOS, ํ๋ก ํธ์๋, ์๋ฒยท๋ฐฑ์๋ \n",
+ "8 ์กํฐ๋ถํค 3~10๋
์ฐจ ํ๋ ฅ ๋ฌด๊ด ์ ๋ถ ์๋ฒยท๋ฐฑ์๋, ๋ฐฑ์๋, ์นํ์คํ \n",
+ "\n",
+ " ์ด๋ฏธ์ง๊ฒฝ๋ก \\\n",
+ "0 downloads/์ฟ ํก_๊ณต๊ณ 2.png \n",
+ "1 NaN \n",
+ "2 NaN \n",
+ "3 downloads/๋ค์ด๋ฒํด๋ผ์ฐ๋_๊ณต๊ณ 5.png \n",
+ "4 downloads/ํด๋ก๋ด_๊ณต๊ณ 6.png \n",
+ "5 downloads/์ฝ์จ์ด_๊ณต๊ณ 7.png \n",
+ "6 downloads/NHN_๊ณต๊ณ 8.png \n",
+ "7 downloads/๋ค์ด๋ฒํด๋ผ์ฐ๋_๊ณต๊ณ 9.png \n",
+ "8 \n",
+ "\n",
+ " ์ฐ๋์ฌํญ \\\n",
+ "0 \n",
+ "1 NaN \n",
+ "2 NaN \n",
+ "3 \n",
+ "4 \n",
+ "5 \n",
+ "6 \n",
+ "7 \n",
+ "8 โข ์ง๋ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์\\nโข ๊ฒฐ์ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์\\nโข B2C ํ๋ซํผ ๊ฐ๋ฐ ๊ฒฝ... \n",
+ "\n",
+ " ์๊ฒฉ์๊ฑด \n",
+ "0 \n",
+ "1 NaN \n",
+ "2 NaN \n",
+ "3 \n",
+ "4 \n",
+ "5 \n",
+ "6 \n",
+ "7 \n",
+ "8 โข ๊ฐ๋ฐ 3๋
์ด์ ๊ฒฝ๋ ฅ์ ์ค๊ธ๊ฐ๋ฐ์\\nโข IntelliJ ๊ฐ๋ฅ\\nโข Spring ... "
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
"id": "d8af31f5",
"metadata": {},
"outputs": [
@@ -321,11 +555,11 @@
"๐ ๊ธฐ์กด ํญ ๋ณต๊ท ์๋ฃ\n",
"\n",
"โถ๏ธ [3]๋ฒ์งธ ๊ณต๊ณ ํด๋ฆญ โ ์ ํญ ์ด๋ฆผ ์์\n",
- "๐ผ๏ธ ์ด๋ฏธ์ง URL ์ ์ฅ ์๋ฃ\n",
+ "โ ์ด๋ฏธ์ง URL ์ ์ฅ ์คํจ\n",
"๐ ๊ธฐ์กด ํญ ๋ณต๊ท ์๋ฃ\n",
"\n",
"โถ๏ธ [4]๋ฒ์งธ ๊ณต๊ณ ํด๋ฆญ โ ์ ํญ ์ด๋ฆผ ์์\n",
- "๐ผ๏ธ ์ด๋ฏธ์ง URL ์ ์ฅ ์๋ฃ\n",
+ "โ ์ด๋ฏธ์ง URL ์ ์ฅ ์คํจ\n",
"๐ ๊ธฐ์กด ํญ ๋ณต๊ท ์๋ฃ\n",
"\n",
"โถ๏ธ [5]๋ฒ์งธ ๊ณต๊ณ ํด๋ฆญ โ ์ ํญ ์ด๋ฆผ ์์\n",
@@ -341,18 +575,16 @@
"๐ ๊ธฐ์กด ํญ ๋ณต๊ท ์๋ฃ\n",
"\n",
"โถ๏ธ [8]๋ฒ์งธ ๊ณต๊ณ ํด๋ฆญ โ ์ ํญ ์ด๋ฆผ ์์\n",
- "โ
์ฐ๋์ฌํญ ํฌ๋กค๋ง ์๋ฃ: โข ํด๋ผ์ฐ๋ ํ๊ฒฝ(...\n",
- "โ
์๊ฒฉ์๊ฑด ํฌ๋กค๋ง ์๋ฃ: โข ์ปดํจํฐ ๊ณตํ ๋...\n",
+ "๐ผ๏ธ ์ด๋ฏธ์ง URL ์ ์ฅ ์๋ฃ\n",
"๐ ๊ธฐ์กด ํญ ๋ณต๊ท ์๋ฃ\n",
"\n",
"โถ๏ธ [9]๋ฒ์งธ ๊ณต๊ณ ํด๋ฆญ โ ์ ํญ ์ด๋ฆผ ์์\n",
- "โ
์ฐ๋์ฌํญ ํฌ๋กค๋ง ์๋ฃ: โข ์ด์ปค๋จธ์ค ์
๊ณ ...\n",
- "โ
์๊ฒฉ์๊ฑด ํฌ๋กค๋ง ์๋ฃ: โข Python์ ...\n",
+ "๐ผ๏ธ ์ด๋ฏธ์ง URL ์ ์ฅ ์๋ฃ\n",
"๐ ๊ธฐ์กด ํญ ๋ณต๊ท ์๋ฃ\n",
"\n",
"โถ๏ธ [10]๋ฒ์งธ ๊ณต๊ณ ํด๋ฆญ โ ์ ํญ ์ด๋ฆผ ์์\n",
- "โ
์ฐ๋์ฌํญ ํฌ๋กค๋ง ์๋ฃ: โข ๋ค๊ตญ์ด ์๋น์ค์...\n",
- "โ
์๊ฒฉ์๊ฑด ํฌ๋กค๋ง ์๋ฃ: โข ์ต์ ๋ง 5๋
...\n",
+ "โ
์ฐ๋์ฌํญ ํฌ๋กค๋ง ์๋ฃ: โข ์ง๋ ๊ด๋ จ ๊ฐ๋ฐ...\n",
+ "โ
์๊ฒฉ์๊ฑด ํฌ๋กค๋ง ์๋ฃ: โข ๊ฐ๋ฐ 3๋
์ด์...\n",
"๐ ๊ธฐ์กด ํญ ๋ณต๊ท ์๋ฃ\n",
"\n",
"โ
์์
์ ์ฅ ์๋ฃ\n"
@@ -471,16 +703,204 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 5,
"id": "fa236770",
"metadata": {},
- "outputs": [],
- "source": []
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " ํ์ฌ๋ช
| \n",
+ " ๊ฒฝ๋ ฅ | \n",
+ " ํ๋ ฅ | \n",
+ " ๊ทผ๋ฌด์ง | \n",
+ " ์ง๊ตฐ | \n",
+ " ์ฐ๋์ฌํญ | \n",
+ " ์๊ฒฉ์๊ฑด | \n",
+ " ์ด๋ฏธ์ง๊ฒฝ๋ก | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " ์ฟ ํก | \n",
+ " ์ ์
| \n",
+ " ํ์ฌ | \n",
+ " ์์ธ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " ํ๋ฆฌ๋ถ๋จ | \n",
+ " 3~8๋
์ฐจ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ๊ธฐํ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " ํ๋ฆฌ๋ถ๋จ | \n",
+ " 2~8๋
์ฐจ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ์์ธ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " ๋ค์ด๋ฒํด๋ผ์ฐ๋ | \n",
+ " ๊ฒฝ๋ ฅ ๋ฌด๊ด | \n",
+ " ํ์ฌ | \n",
+ " ๊ฒฝ๊ธฐ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " ํด๋ก๋ด | \n",
+ " 10๋
์ฐจ ์ด์ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ์์ธ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " ์ฝ์จ์ด | \n",
+ " 7๋
์ฐจ ์ด์ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ์์ธ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " NHN | \n",
+ " 5๋
์ฐจ ์ด์ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ๊ฒฝ๊ธฐ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " ๋ค์ด๋ฒํด๋ผ์ฐ๋ | \n",
+ " 3๋
์ฐจ, 10๋
์ฐจ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ๊ฒฝ๊ธฐ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " ์กํฐ๋ถํค | \n",
+ " 3~10๋
์ฐจ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ์ ๋ถ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " โข ์ง๋ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์\\nโข ๊ฒฐ์ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์\\nโข B2C ํ๋ซํผ ๊ฐ๋ฐ ๊ฒฝ... | \n",
+ " โข ๊ฐ๋ฐ 3๋
์ด์ ๊ฒฝ๋ ฅ์ ์ค๊ธ๊ฐ๋ฐ์\\nโข IntelliJ ๊ฐ๋ฅ\\nโข Spring ... | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " ํ์ฌ๋ช
๊ฒฝ๋ ฅ ํ๋ ฅ ๊ทผ๋ฌด์ง ์ง๊ตฐ \\\n",
+ "0 ์ฟ ํก ์ ์
ํ์ฌ ์์ธ ์๋ฒยท๋ฐฑ์๋ \n",
+ "1 ํ๋ฆฌ๋ถ๋จ 3~8๋
์ฐจ ํ๋ ฅ ๋ฌด๊ด ๊ธฐํ ์๋ฒยท๋ฐฑ์๋ \n",
+ "2 ํ๋ฆฌ๋ถ๋จ 2~8๋
์ฐจ ํ๋ ฅ ๋ฌด๊ด ์์ธ ์๋ฒยท๋ฐฑ์๋ \n",
+ "3 ๋ค์ด๋ฒํด๋ผ์ฐ๋ ๊ฒฝ๋ ฅ ๋ฌด๊ด ํ์ฌ ๊ฒฝ๊ธฐ ์๋ฒยท๋ฐฑ์๋ \n",
+ "4 ํด๋ก๋ด 10๋
์ฐจ ์ด์ ํ๋ ฅ ๋ฌด๊ด ์์ธ ์๋ฒยท๋ฐฑ์๋ \n",
+ "5 ์ฝ์จ์ด 7๋
์ฐจ ์ด์ ํ๋ ฅ ๋ฌด๊ด ์์ธ ์๋ฒยท๋ฐฑ์๋ \n",
+ "6 NHN 5๋
์ฐจ ์ด์ ํ๋ ฅ ๋ฌด๊ด ๊ฒฝ๊ธฐ ์๋ฒยท๋ฐฑ์๋ \n",
+ "7 ๋ค์ด๋ฒํด๋ผ์ฐ๋ 3๋
์ฐจ, 10๋
์ฐจ ํ๋ ฅ ๋ฌด๊ด ๊ฒฝ๊ธฐ ์๋ฒยท๋ฐฑ์๋ \n",
+ "8 ์กํฐ๋ถํค 3~10๋
์ฐจ ํ๋ ฅ ๋ฌด๊ด ์ ๋ถ ์๋ฒยท๋ฐฑ์๋ \n",
+ "\n",
+ " ์ฐ๋์ฌํญ \\\n",
+ "0 \n",
+ "1 \n",
+ "2 \n",
+ "3 \n",
+ "4 \n",
+ "5 \n",
+ "6 \n",
+ "7 \n",
+ "8 โข ์ง๋ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์\\nโข ๊ฒฐ์ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์\\nโข B2C ํ๋ซํผ ๊ฐ๋ฐ ๊ฒฝ... \n",
+ "\n",
+ " ์๊ฒฉ์๊ฑด \\\n",
+ "0 \n",
+ "1 \n",
+ "2 \n",
+ "3 \n",
+ "4 \n",
+ "5 \n",
+ "6 \n",
+ "7 \n",
+ "8 โข ๊ฐ๋ฐ 3๋
์ด์ ๊ฒฝ๋ ฅ์ ์ค๊ธ๊ฐ๋ฐ์\\nโข IntelliJ ๊ฐ๋ฅ\\nโข Spring ... \n",
+ "\n",
+ " ์ด๋ฏธ์ง๊ฒฝ๋ก \n",
+ "0 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n",
+ "1 \n",
+ "2 \n",
+ "3 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n",
+ "4 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n",
+ "5 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n",
+ "6 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n",
+ "7 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n",
+ "8 "
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
}
],
"metadata": {
"kernelspec": {
- "display_name": "hoenv",
+ "display_name": "python313",
"language": "python",
"name": "python3"
},
diff --git "a/backend/crawling/downloads/NHN_\352\263\265\352\263\2408.png" "b/backend/crawling/downloads/NHN_\352\263\265\352\263\2408.png"
new file mode 100644
index 000000000..7ce51dc4b
Binary files /dev/null and "b/backend/crawling/downloads/NHN_\352\263\265\352\263\2408.png" differ
diff --git "a/backend/crawling/downloads/\353\204\244\354\235\264\353\262\204\355\201\264\353\235\274\354\232\260\353\223\234_\352\263\265\352\263\2405.png" "b/backend/crawling/downloads/\353\204\244\354\235\264\353\262\204\355\201\264\353\235\274\354\232\260\353\223\234_\352\263\265\352\263\2405.png"
new file mode 100644
index 000000000..5422dbdad
Binary files /dev/null and "b/backend/crawling/downloads/\353\204\244\354\235\264\353\262\204\355\201\264\353\235\274\354\232\260\353\223\234_\352\263\265\352\263\2405.png" differ
diff --git "a/backend/crawling/downloads/\353\204\244\354\235\264\353\262\204\355\201\264\353\235\274\354\232\260\353\223\234_\352\263\265\352\263\2409.png" "b/backend/crawling/downloads/\353\204\244\354\235\264\353\262\204\355\201\264\353\235\274\354\232\260\353\223\234_\352\263\265\352\263\2409.png"
new file mode 100644
index 000000000..6f7084ded
Binary files /dev/null and "b/backend/crawling/downloads/\353\204\244\354\235\264\353\262\204\355\201\264\353\235\274\354\232\260\353\223\234_\352\263\265\352\263\2409.png" differ
diff --git "a/backend/crawling/downloads/\354\275\224\354\233\250\354\235\264_\352\263\265\352\263\2407.png" "b/backend/crawling/downloads/\354\275\224\354\233\250\354\235\264_\352\263\265\352\263\2407.png"
new file mode 100644
index 000000000..161c3587c
Binary files /dev/null and "b/backend/crawling/downloads/\354\275\224\354\233\250\354\235\264_\352\263\265\352\263\2407.png" differ
diff --git "a/backend/crawling/downloads/\354\277\240\355\214\241_\352\263\265\352\263\2402.png" "b/backend/crawling/downloads/\354\277\240\355\214\241_\352\263\265\352\263\2402.png"
new file mode 100644
index 000000000..14b427300
Binary files /dev/null and "b/backend/crawling/downloads/\354\277\240\355\214\241_\352\263\265\352\263\2402.png" differ
diff --git "a/backend/crawling/downloads/\355\201\264\353\241\234\353\264\207_\352\263\265\352\263\2406.png" "b/backend/crawling/downloads/\355\201\264\353\241\234\353\264\207_\352\263\265\352\263\2406.png"
new file mode 100644
index 000000000..90bb74031
Binary files /dev/null and "b/backend/crawling/downloads/\355\201\264\353\241\234\353\264\207_\352\263\265\352\263\2406.png" differ
diff --git "a/backend/crawling/\354\247\201\355\226\211_\355\201\254\353\241\244\353\247\201_\352\262\260\352\263\274.xlsx" "b/backend/crawling/\354\247\201\355\226\211_\355\201\254\353\241\244\353\247\201_\352\262\260\352\263\274.xlsx"
new file mode 100644
index 000000000..23ae1e6c0
Binary files /dev/null and "b/backend/crawling/\354\247\201\355\226\211_\355\201\254\353\241\244\353\247\201_\352\262\260\352\263\274.xlsx" differ
diff --git "a/backend/crawling/\354\261\204\354\232\251\352\263\265\352\263\240_\355\201\254\353\241\244\353\247\201\352\262\260\352\263\274.xlsx" "b/backend/crawling/\354\261\204\354\232\251\352\263\265\352\263\240_\355\201\254\353\241\244\353\247\201\352\262\260\352\263\274.xlsx"
new file mode 100644
index 000000000..62c298565
Binary files /dev/null and "b/backend/crawling/\354\261\204\354\232\251\352\263\265\352\263\240_\355\201\254\353\241\244\353\247\201\352\262\260\352\263\274.xlsx" differ
diff --git a/backend/test_crawl/applicant_crawler.py b/backend/test_crawl/applicant_crawler.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/backend/test_crawl/certification_crawler.py b/backend/test_crawl/certification_crawler.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/backend/test_crawl/insert_to_db.py b/backend/test_crawl/insert_to_db.py
new file mode 100644
index 000000000..59a17801c
--- /dev/null
+++ b/backend/test_crawl/insert_to_db.py
@@ -0,0 +1,26 @@
+import os
+from dotenv import load_dotenv
+from sqlalchemy import create_engine, text
+import pandas as pd
+
+
+# 1. ํ๊ฒฝ๋ณ์ ๋ถ๋ฌ์ค๊ธฐ
+load_dotenv()
+DATABASE_URL = os.getenv("DATABASE_URL")
+print("๐ DATABASE_URL:", DATABASE_URL)
+
+# 2. DB ์ฐ๊ฒฐ
+engine = create_engine(DATABASE_URL)
+
+# 3. ์ฐ๊ฒฐ ํ
์คํธ + ๋ฐ์ดํฐ ์กฐํ
+try:
+ with engine.connect() as conn:
+ conn.execute(text("SELECT 1;")) # SQLAlchemy 2.0+์์๋ text() ํ์
+ print("โ
DB ์ฐ๊ฒฐ ์ฑ๊ณต")
+
+ # ์ค์ ํ
์ด๋ธ์์ 5๊ฐ๋ง ์กฐํ
+ df = pd.read_sql("SELECT * FROM certifications LIMIT 5;", con=engine)
+ print("๐ฆ certifications ํ
์ด๋ธ ์ํ:\n", df)
+
+except Exception as e:
+ print("โ DB ์ฐ๊ฒฐ ์คํจ:", e)
\ No newline at end of file
diff --git a/backend/test_crawl/recruit_crawler.py b/backend/test_crawl/recruit_crawler.py
new file mode 100644
index 000000000..0ae280578
--- /dev/null
+++ b/backend/test_crawl/recruit_crawler.py
@@ -0,0 +1,173 @@
+from selenium import webdriver
+from selenium.webdriver.common.by import By
+from selenium.webdriver.chrome.options import Options
+from selenium.webdriver.support.ui import WebDriverWait
+from selenium.webdriver.support import expected_conditions as EC
+import pandas as pd
+import time
+
+def crawl_zighang(job_name="์๋ฒยท๋ฐฑ์๋", max_clicks=10):
+ options = Options()
+ options.add_argument("--headless") # ํ์ ์ ์ ๊ฑฐ ๊ฐ๋ฅ
+ options.add_argument("--no-sandbox")
+ options.add_argument("--disable-dev-shm-usage")
+ driver = webdriver.Chrome(options=options)
+ driver.set_window_size(1280, 1024)
+ wait = WebDriverWait(driver, 20)
+
+ try:
+ driver.get("https://zighang.com/it")
+ time.sleep(2)
+
+ arrow_xpath = '//*[@id="root"]/main/div[3]/div/div/div/div/div[2]/div/section/button[2]/div/img'
+ wait.until(EC.element_to_be_clickable((By.XPATH, arrow_xpath))).click()
+ time.sleep(1)
+
+ job_button_xpath = f'//button[normalize-space()="{job_name}"]'
+ wait.until(EC.element_to_be_clickable((By.XPATH, job_button_xpath))).click()
+ time.sleep(1)
+
+ confirm_button = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.sticky.bottom-0 button.bg-primary')))
+ driver.execute_script("arguments[0].scrollIntoView(true);", confirm_button)
+ driver.execute_script("arguments[0].click();", confirm_button)
+ wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'p.ds-web-title2')))
+
+ original_tab = driver.current_window_handle
+ results = []
+
+ for i in range(2, max_clicks + 1):
+ try:
+ title_xpath = f'(//p[contains(@class, "ds-web-title2")])[{i}]'
+ title_elem = wait.until(EC.presence_of_element_located((By.XPATH, title_xpath)))
+ driver.execute_script("arguments[0].scrollIntoView(true);", title_elem)
+ driver.execute_script("window.scrollBy(0, -200);")
+ time.sleep(0.3)
+
+ parent_link = title_elem.find_element(By.XPATH, "./ancestor::a[1]")
+ driver.execute_script("arguments[0].click();", parent_link)
+ time.sleep(2)
+
+ new_tab = [tab for tab in driver.window_handles if tab != original_tab][0]
+ driver.switch_to.window(new_tab)
+
+ data = {}
+ data["ํ์ฌ๋ช
"] = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[1]/div[1]/div/a').text
+ data["๊ฒฝ๋ ฅ"] = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[1]/div/div').text
+ data["ํ๋ ฅ"] = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[3]/div/div').text
+ data["๊ทผ๋ฌด์ง"] = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[1]/div[5]/div/section/div[2]/div/div').text
+ data["์ง๊ตฐ"] = job_name
+
+ try:
+ data["์ฐ๋์ฌํญ"] = driver.find_element(By.XPATH, '//h2[text()="์ฐ๋์ฌํญ"]/following-sibling::p').text
+ except:
+ data["์ฐ๋์ฌํญ"] = ""
+
+ try:
+ data["์๊ฒฉ์๊ฑด"] = driver.find_element(By.XPATH, '//h2[text()="์๊ฒฉ์๊ฑด"]/following-sibling::p').text
+ except:
+ data["์๊ฒฉ์๊ฑด"] = ""
+
+ if data["์ฐ๋์ฌํญ"] == "" and data["์๊ฒฉ์๊ฑด"] == "":
+ try:
+ img_elem = driver.find_element(By.XPATH, '//*[@id="root"]/main/div[2]/div[1]/div[1]/div[4]/img')
+ data["์ด๋ฏธ์ง๊ฒฝ๋ก"] = img_elem.get_attribute("src")
+ except:
+ data["์ด๋ฏธ์ง๊ฒฝ๋ก"] = ""
+ else:
+ data["์ด๋ฏธ์ง๊ฒฝ๋ก"] = ""
+
+ results.append(data)
+ driver.close()
+ driver.switch_to.window(original_tab)
+
+ except Exception as e:
+ print(f"โ [{i}]๋ฒ์งธ ๊ณต๊ณ ์คํจ: {e}")
+ continue
+
+ return pd.DataFrame(results)
+
+ finally:
+ driver.quit()
+
+
+
+
+def crawl_linkareer(max_pages=5):
+ chrome_options = Options()
+ chrome_options.add_experimental_option("detach", True)
+ chrome_options.add_argument("--no-sandbox")
+ chrome_options.add_argument("--disable-dev-shm-usage")
+ # chrome_options.add_argument("--headless") # ํ์ ์ ์ฃผ์ ์ ๊ฑฐ
+ driver = webdriver.Chrome(options=chrome_options)
+ wait = WebDriverWait(driver, 10)
+
+ results = []
+
+ try:
+ for page in range(1, max_pages + 1):
+ list_url = f"https://linkareer.com/list/recruit?filterBy_activityTypeID=5&filterBy_categoryIDs=58&filterBy_status=OPEN&orderBy_direction=DESC&orderBy_field=RECENT&page={page}"
+ driver.get(list_url)
+ time.sleep(2)
+ print(f"๐ {page}ํ์ด์ง ์ ์ ์๋ฃ")
+
+ main_window = driver.current_window_handle
+ row_count = len(driver.find_elements(By.XPATH, '//*[@id="__next"]/div[1]/div/main/div/section/div[2]/table/tbody/tr'))
+ print(f"๐ {row_count}๊ฐ์ ๊ณต๊ณ ํ์ ์์ ")
+
+ for i in range(1, row_count + 1):
+ try:
+ link_element = driver.find_element(By.XPATH, f'//*[@id="__next"]/div[1]/div/main/div/section/div[2]/table/tbody/tr[{i}]/td[2]/div/a/div/p')
+ link_element.click()
+
+ driver.switch_to.window(driver.window_handles[-1])
+
+ company_name = wait.until(EC.presence_of_element_located(
+ (By.XPATH, '//*[@id="__next"]/div[1]/div/main/div/div/section[1]/div/article/header/h2'))).text.strip()
+ company_type = wait.until(EC.presence_of_element_located(
+ (By.XPATH, '//*[@id="__next"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[1]/dd'))).text.strip()
+ position_element = wait.until(EC.presence_of_element_located(
+ (By.XPATH, '//*[@id="__next"]/div[1]/div/main/div/div/section[1]/div/article/div/dl[5]/dd')))
+ position = position_element.text.strip()
+
+ p_elements = driver.find_elements(By.XPATH, '//*[@id="DETAIL"]/section[1]/div/p')
+ p_texts = [p.text.strip() for p in p_elements]
+
+ qual_idx = next((idx for idx, text in enumerate(p_texts) if '์๊ฒฉ์๊ฑด' in text or '์๊ฒฉ ์๊ฑด' in text), None)
+ pos_idx = next((idx for idx, text in enumerate(p_texts) if '๋ชจ์ง ์ง๋ฌด' in text or '์ธ๋ถ ์ง๋ฌด' in text), None)
+
+ qualification_texts = []
+ if qual_idx is not None:
+ for t in p_texts[qual_idx + 1:]:
+ if any(keyword in t for keyword in ['์ง์', 'ํํ', '์ฐ๋', '๋ค์', '๊ทผ๋ฌด']):
+ break
+ qualification_texts.append(t)
+ qualification = "\n".join(qualification_texts)
+
+ detail_position = ''
+ if pos_idx is not None and pos_idx + 1 < len(p_texts):
+ detail_position = p_texts[pos_idx + 1]
+
+ results.append({
+ 'ํ์ฌ๋ช
': company_name,
+ '๊ธฐ์
ํํ': company_type,
+ '๋ชจ์ง์ง๋ฌด': position,
+ '์ธ๋ถ์ง๋ฌด': detail_position,
+ '์๊ฒฉ์๊ฑด': qualification
+ })
+
+ print(f"โ
{company_name} ({i}/{row_count}, page {page}) ํฌ๋กค๋ง ์๋ฃ")
+ driver.close()
+ driver.switch_to.window(main_window)
+ time.sleep(1)
+
+ except Exception as e:
+ print(f"โ {page}ํ์ด์ง {i}๋ฒ์งธ ๊ณต๊ณ ์ค๋ฅ: {e}")
+ if len(driver.window_handles) > 1:
+ driver.close()
+ driver.switch_to.window(main_window)
+ continue
+
+ return pd.DataFrame(results)
+
+ finally:
+ driver.quit()
\ No newline at end of file
diff --git a/backend/test_crawl/selenium_basic/app.py b/backend/test_crawl/selenium_basic/app.py
new file mode 100644
index 000000000..000847917
--- /dev/null
+++ b/backend/test_crawl/selenium_basic/app.py
@@ -0,0 +1,19 @@
+import time
+from selenium import webdriver
+from selenium.webdriver.common.by import By
+import chromedriver_autoinstaller
+
+chromedriver_autoinstaller.install()
+
+driver = webdriver.Chrome()
+# 1. ๋๋ผ์ด๋ฒ.get() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์น ํ์ด์ง๋ฅผ ์ฐ๋ค.
+driver.get("https://www.naver.com")
+time.sleep(3)
+
+# 2. ์น ํ์ด์ง๊ฐ ์ด๋ฆฌ๋ฉด, ์น ํ์ด์ง์ ์์๋ฅผ ์ฐพ๊ธฐ ์ํด find_element() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
+css_selector = "#shortcutArea > ul > li:nth-child(8) > a > span.service_name"
+group_navigation = driver.find_element(By.CSS_SELECTOR, css_selector)
+
+print(group_navigation.text)
+group_navigation.click()
+input()
\ No newline at end of file
diff --git a/backend/test_crawl/selenium_basic/selenium_tools.py b/backend/test_crawl/selenium_basic/selenium_tools.py
new file mode 100644
index 000000000..620b52e59
--- /dev/null
+++ b/backend/test_crawl/selenium_basic/selenium_tools.py
@@ -0,0 +1,65 @@
+import time
+from selenium import webdriver
+from selenium.webdriver.common.by import By
+from selenium.webrdriver.support.ui import WebDriverWait
+from selenium.webdriver.support import expected_conditions as EC
+
+import chromedriver_autoinstaller
+
+chromedriver_autoinstaller.install()
+
+driver = webdriver.Chrome()
+driver.get("https://www.naver.com")
+
+# # 1. Navigation (์น ํ์ด์ง ์ด๋) ๊ด๋ จ ํด
+# # get, back, forward, refresh ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์น ํ์ด์ง๋ฅผ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
+
+# # 1-1. get() ์ํ๋ ํ์ด์ง๋ก ์ด๋ํ๋ ํจ์
+# driver.get("https://www.naver.com")
+# time.sleep(1)
+# driver.get("https://www.google.com")
+
+# # 1-2. back() ์ด์ ํ์ด์ง๋ก ์ด๋ํ๋ ํจ์
+# driver.back()
+# time.sleep(2)
+
+# # 1-3. forward() ๋ค์ ํ์ด์ง๋ก ์ด๋ํ๋ ํจ์
+# driver.forward()
+# time.sleep(2)
+
+# # 1-4. refresh() ํ์ฌ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๋ ํจ์
+# driver.refresh()
+# time.sleep(2)
+# print("๋์ ๋")
+# input()
+
+# # 2.browser information
+# # 2-1. title ~ ์น ์ฌ์ดํธ์ ์ ๋ชฉ์ ๊ฐ์ ธ์ค๋ ํจ์
+# title = driver.title
+# print("์ ๋ชฉ:", title)
+# # 2-2. current_url ~ ํ์ฌ ์น ํ์ด์ง์ URL์ ๊ฐ์ ธ์ค๋ ํจ์
+# current_url = driver.current_url
+# print("ํ์ฌ URL:", current_url)
+
+# if "nid.naver.com" in current_url:
+# print("์ง๊ธ์ ๋ก๊ทธ์ธ ํ๋ ๋ก์ง์ด ํ์ํจ")
+# else:
+# print("๋ค์ด๋ฒ ๋ก๊ทธ์ธ ํ์ด์ง๊ฐ ์๋๋๋ค.")
+
+
+# 3. Driver Wait (๋๋ผ์ด๋ฒ ๋๊ธฐ)
+# 3-1. 3์ด ๋ ๋ก๋ฉ์ด ๋๋์, element๊ฐ ์ฐพ์์ง.
+# 3-2. 30์ด ๊น์ง๋ ๊ธฐ๋ค๋ฆฌ๊ฒ ์.
+# 3-3. 30์ด๊ฐ ๋์ด๊ฐ๋ฉด ์๋ฌ๋์ง
+
+try:
+ selector = "#shortcutArea > ul > li:nth-child(8) > a > span.service_name"
+ WebDriverWait(driver, 30).until(EC.presence_of_element_located(
+ By.CSS_SELECTOR, selector
+ ))
+except:
+ print("์์ธ ๋ฐ์, ์์ธ ์ฒ๋ฆฌ ์ฝ๋ ์คํํ๊ธฐ")
+print("์๋ฆฌ๋จผํธ ๋ก๋ฉ ๋")
+print("๋ค์ ์ฝ๋ ์คํ")
+
+input()
\ No newline at end of file
diff --git a/backend/test_crawl/test.ipynb b/backend/test_crawl/test.ipynb
new file mode 100644
index 000000000..d03af762e
--- /dev/null
+++ b/backend/test_crawl/test.ipynb
@@ -0,0 +1,542 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "c10a33ae",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from recruit_crawler import crawl_linkareer, crawl_zighang"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "85e1eaf8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = crawl_zighang(max_clicks=10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "cc84c195",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " ํ์ฌ๋ช
| \n",
+ " ๊ฒฝ๋ ฅ | \n",
+ " ํ๋ ฅ | \n",
+ " ๊ทผ๋ฌด์ง | \n",
+ " ์ง๊ตฐ | \n",
+ " ์ฐ๋์ฌํญ | \n",
+ " ์๊ฒฉ์๊ฑด | \n",
+ " ์ด๋ฏธ์ง๊ฒฝ๋ก | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " ์ฟ ํก | \n",
+ " ์ ์
| \n",
+ " ํ์ฌ | \n",
+ " ์์ธ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " ํ๋ฆฌ๋ถ๋จ | \n",
+ " 3~8๋
์ฐจ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ๊ธฐํ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " ํ๋ฆฌ๋ถ๋จ | \n",
+ " 2~8๋
์ฐจ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ์์ธ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " ๋ค์ด๋ฒํด๋ผ์ฐ๋ | \n",
+ " ๊ฒฝ๋ ฅ ๋ฌด๊ด | \n",
+ " ํ์ฌ | \n",
+ " ๊ฒฝ๊ธฐ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " ํด๋ก๋ด | \n",
+ " 10๋
์ฐจ ์ด์ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ์์ธ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " ์ฝ์จ์ด | \n",
+ " 7๋
์ฐจ ์ด์ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ์์ธ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " NHN | \n",
+ " 5๋
์ฐจ ์ด์ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ๊ฒฝ๊ธฐ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " ๋ค์ด๋ฒํด๋ผ์ฐ๋ | \n",
+ " 3๋
์ฐจ, 10๋
์ฐจ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ๊ฒฝ๊ธฐ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " | \n",
+ " | \n",
+ " https://d2juy7qzamcf56.cloudfront.net/2025-06-... | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " ์กํฐ๋ถํค | \n",
+ " 3~10๋
์ฐจ | \n",
+ " ํ๋ ฅ ๋ฌด๊ด | \n",
+ " ์ ๋ถ | \n",
+ " ์๋ฒยท๋ฐฑ์๋ | \n",
+ " โข ์ง๋ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์\\nโข ๊ฒฐ์ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์\\nโข B2C ํ๋ซํผ ๊ฐ๋ฐ ๊ฒฝ... | \n",
+ " โข ๊ฐ๋ฐ 3๋
์ด์ ๊ฒฝ๋ ฅ์ ์ค๊ธ๊ฐ๋ฐ์\\nโข IntelliJ ๊ฐ๋ฅ\\nโข Spring ... | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " ํ์ฌ๋ช
๊ฒฝ๋ ฅ ํ๋ ฅ ๊ทผ๋ฌด์ง ์ง๊ตฐ \\\n",
+ "0 ์ฟ ํก ์ ์
ํ์ฌ ์์ธ ์๋ฒยท๋ฐฑ์๋ \n",
+ "1 ํ๋ฆฌ๋ถ๋จ 3~8๋
์ฐจ ํ๋ ฅ ๋ฌด๊ด ๊ธฐํ ์๋ฒยท๋ฐฑ์๋ \n",
+ "2 ํ๋ฆฌ๋ถ๋จ 2~8๋
์ฐจ ํ๋ ฅ ๋ฌด๊ด ์์ธ ์๋ฒยท๋ฐฑ์๋ \n",
+ "3 ๋ค์ด๋ฒํด๋ผ์ฐ๋ ๊ฒฝ๋ ฅ ๋ฌด๊ด ํ์ฌ ๊ฒฝ๊ธฐ ์๋ฒยท๋ฐฑ์๋ \n",
+ "4 ํด๋ก๋ด 10๋
์ฐจ ์ด์ ํ๋ ฅ ๋ฌด๊ด ์์ธ ์๋ฒยท๋ฐฑ์๋ \n",
+ "5 ์ฝ์จ์ด 7๋
์ฐจ ์ด์ ํ๋ ฅ ๋ฌด๊ด ์์ธ ์๋ฒยท๋ฐฑ์๋ \n",
+ "6 NHN 5๋
์ฐจ ์ด์ ํ๋ ฅ ๋ฌด๊ด ๊ฒฝ๊ธฐ ์๋ฒยท๋ฐฑ์๋ \n",
+ "7 ๋ค์ด๋ฒํด๋ผ์ฐ๋ 3๋
์ฐจ, 10๋
์ฐจ ํ๋ ฅ ๋ฌด๊ด ๊ฒฝ๊ธฐ ์๋ฒยท๋ฐฑ์๋ \n",
+ "8 ์กํฐ๋ถํค 3~10๋
์ฐจ ํ๋ ฅ ๋ฌด๊ด ์ ๋ถ ์๋ฒยท๋ฐฑ์๋ \n",
+ "\n",
+ " ์ฐ๋์ฌํญ \\\n",
+ "0 \n",
+ "1 \n",
+ "2 \n",
+ "3 \n",
+ "4 \n",
+ "5 \n",
+ "6 \n",
+ "7 \n",
+ "8 โข ์ง๋ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์\\nโข ๊ฒฐ์ ๊ด๋ จ ๊ฐ๋ฐ ๊ฒฝํ์\\nโข B2C ํ๋ซํผ ๊ฐ๋ฐ ๊ฒฝ... \n",
+ "\n",
+ " ์๊ฒฉ์๊ฑด \\\n",
+ "0 \n",
+ "1 \n",
+ "2 \n",
+ "3 \n",
+ "4 \n",
+ "5 \n",
+ "6 \n",
+ "7 \n",
+ "8 โข ๊ฐ๋ฐ 3๋
์ด์ ๊ฒฝ๋ ฅ์ ์ค๊ธ๊ฐ๋ฐ์\\nโข IntelliJ ๊ฐ๋ฅ\\nโข Spring ... \n",
+ "\n",
+ " ์ด๋ฏธ์ง๊ฒฝ๋ก \n",
+ "0 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n",
+ "1 \n",
+ "2 \n",
+ "3 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n",
+ "4 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n",
+ "5 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n",
+ "6 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n",
+ "7 https://d2juy7qzamcf56.cloudfront.net/2025-06-... \n",
+ "8 "
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "44657c9c",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "๐ 1ํ์ด์ง ์ ์ ์๋ฃ\n",
+ "๐ 20๊ฐ์ ๊ณต๊ณ ํ์ ์์ \n",
+ "โ
์ฃผ์ํ์ฌ ๋ง์นด๋กฑํฉํ ๋ฆฌ (1/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
Deloitte ์์งํ๊ณ๋ฒ์ธ (2/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
SK์ ์ค์๋น์ค (3/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
์คํ์ฝ์ํฐํ
์ธ๋จผํธ (4/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
์ผ๋์ ์ฝ (5/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
ํด๋น์ธ (6/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
ํํซ (7/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
ํ์ด๋น์ค (8/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
์๋ฏน์ค (9/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
์ฃผ์ํ์ฌ ํผํฌ์ฆ๋ (10/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
SM์ํฐํ
์ธ๋จผํธ (11/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
ํ๊ตญ์ฌํ๋ณด์ฅ์ ๋ณด์ (12/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
์์ธ๋ฏธ (13/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
์ปดํฌ์ค (14/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
์ปดํฌ์ค (15/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
SNOW (16/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
์ปดํฌ์ค (17/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
Deloitte ์์งํ๊ณ๋ฒ์ธ (18/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
ํ์น์ฝํผ๋ ์ด์
(19/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n",
+ "โ
ํ
์ฌ๋ผ์ฝ๋ฆฌ์ (20/20, page 1) ํฌ๋กค๋ง ์๋ฃ\n"
+ ]
+ }
+ ],
+ "source": [
+ "df2 = crawl_linkareer(max_pages=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "d30ce1fd",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " ํ์ฌ๋ช
| \n",
+ " ๊ธฐ์
ํํ | \n",
+ " ๋ชจ์ง์ง๋ฌด | \n",
+ " ์ธ๋ถ์ง๋ฌด | \n",
+ " ์๊ฒฉ์๊ฑด | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " ์ฃผ์ํ์ฌ ๋ง์นด๋กฑํฉํ ๋ฆฌ | \n",
+ " ์คํํธ์
| \n",
+ " ๊ฒฝ๊ธฐ ์ฑ๋จ์ ๋ถ๋น๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " Deloitte ์์งํ๊ณ๋ฒ์ธ | \n",
+ " ์ธ๊ตญ๊ณ๊ธฐ์
| \n",
+ " ์์ธ ์๋ฑํฌ๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " SK์ ์ค์๋น์ค | \n",
+ " ๋๊ธฐ์
| \n",
+ " ์์ธ ์ค๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " ์คํ์ฝ์ํฐํ
์ธ๋จผํธ | \n",
+ " ์ค์๊ธฐ์
| \n",
+ " ์์ธ ๊ฐ๋จ๊ตฌ | \n",
+ " ์จ๋ผ์ธ ์ผํ๋ชฐ ์ด์ ๋ฐ CS ๋ด๋น์ | \n",
+ " ํ๋ ฅ : ์ด๋์กธ ์ด์\\n๊ฒฝ๋ ฅ : ๋ฌด๊ด(์ ์
/๊ฒฝ๋ ฅ)\\n์ํฐํ
์ธ๋จผํธ ๋ฐ ๋ฌธํ ์ฌ์
์ ๊ด... | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " ์ผ๋์ ์ฝ | \n",
+ " ์ค๊ฒฌ๊ธฐ์
| \n",
+ " ์์ธ ์์ด๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " ํด๋น์ธ | \n",
+ " ์ค์๊ธฐ์
| \n",
+ " ๊ฒฝ๊ธฐ ์์์ ๋์๊ตฌ | \n",
+ " | \n",
+ " - ๋์กธ ์ด์(์ ์ ๊ด๋ จ ์ ๊ณต)\\n- ๋น์ฆ๋์ค ์์ด ํํ ๊ฐ๋ฅ์(TOEIC 700์ ... | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " ํํซ | \n",
+ " ์ค์๊ธฐ์
| \n",
+ " ์์ธ ๊ฐ๋จ๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " ํ์ด๋น์ค | \n",
+ " ์ค๊ฒฌ๊ธฐ์
| \n",
+ " IT/์ธํฐ๋ท | \n",
+ " QA Beginner | \n",
+ " MMORPG ํ๋ ์ด ๊ฒฝํ์ด ๋ง์ผ์ ๋ถ\\n์ํํ ์ปค๋ฎค๋์ผ์ด์
์ด ๊ฐ๋ฅํ์ ๋ถ\\n\\n[์ ... | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " ์๋ฏน์ค | \n",
+ " ์ค์๊ธฐ์
| \n",
+ " ๊ฒฝ๊ธฐ ์ฑ๋จ์ ๋ถ๋น๊ตฌ | \n",
+ " | \n",
+ " - ์ ์
/ ๊ฒฝ๋ ฅ 1๋
์ด์ 5๋
์ดํ\\n- ์ด๋์กธ ์ด์\\n\\n[ํฉ๋ฅ์ฌ์ ]\\n- ์... | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " ์ฃผ์ํ์ฌ ํผํฌ์ฆ๋ | \n",
+ " ์ค์๊ธฐ์
| \n",
+ " ์์ธ ๊ฐ๋จ๊ตฌ | \n",
+ " ์ฝํ
์ธ ๋ง์ผํฐ | \n",
+ " ๋์์ธ ๋ฐ ์์ ์ ์ ํด ์ฌ์ฉ ๊ฒฝํ ํฌํ ์ต, ์ด๋๋น ํ๋ฆฌ๋ฏธ์ด, ์ด๋๋น ์ผ๋ฌ์คํธ๋ ์ดํฐ... | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " SM์ํฐํ
์ธ๋จผํธ | \n",
+ " ๋๊ธฐ์
| \n",
+ " ์์ธ ์ฑ๋๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " ํ๊ตญ์ฌํ๋ณด์ฅ์ ๋ณด์ | \n",
+ " ๊ณต๊ณต๊ธฐ๊ด/๊ณต๊ธฐ์
| \n",
+ " ์์ธ ๊ด์ง๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " ์์ธ๋ฏธ | \n",
+ " ์ค์๊ธฐ์
| \n",
+ " ์์ธ ๊ฐ๋จ๊ตฌ | \n",
+ " Software Engineer | \n",
+ " โข ์ปดํจํฐ ๊ณผํ ๋๋ ๊ด๋ จ ๊ณตํ ํ์ฌ ๋๋ ์ด์ ๋๋ฑํ ๊ฒฝํ\\nโข ๊ธฐ๋ณธ์ ์ธ ์๋ฐ(J... | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " ์ปดํฌ์ค | \n",
+ " ์ค๊ฒฌ๊ธฐ์
| \n",
+ " ์์ธ ๊ธ์ฒ๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " ์ปดํฌ์ค | \n",
+ " ์ค๊ฒฌ๊ธฐ์
| \n",
+ " ์์ธ ๊ธ์ฒ๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " SNOW | \n",
+ " ๋๊ธฐ์
| \n",
+ " ๊ฒฝ๊ธฐ ์ฑ๋จ์ ๋ถ๋น๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " ์ปดํฌ์ค | \n",
+ " ์ค๊ฒฌ๊ธฐ์
| \n",
+ " ์์ธ ๊ธ์ฒ๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " Deloitte ์์งํ๊ณ๋ฒ์ธ | \n",
+ " ์ค๊ฒฌ๊ธฐ์
| \n",
+ " ์์ธ ์๋ฑํฌ๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " ํ์น์ฝํผ๋ ์ด์
| \n",
+ " ๋๊ธฐ์
| \n",
+ " ํด์ธ, ์์ธ ์๋ฑํฌ๊ตฌ, ๊ฒฝ๋จ ์์ฐ์, ๋ถ์ฐ ๊ธฐ์ฅ๊ตฐ, ๋ถ์ฐ ์ฐ์ ๊ตฌ | \n",
+ " ํ์น์ฝํผ๋ ์ด์
_์๊ธ | \n",
+ " - ํ์ฌ ์ด์ | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " ํ
์ฌ๋ผ์ฝ๋ฆฌ์ | \n",
+ " ์ธ๊ตญ๊ณ๊ธฐ์
| \n",
+ " ์์ธ ๊ฐ๋จ๊ตฌ | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " ํ์ฌ๋ช
๊ธฐ์
ํํ ๋ชจ์ง์ง๋ฌด \\\n",
+ "0 ์ฃผ์ํ์ฌ ๋ง์นด๋กฑํฉํ ๋ฆฌ ์คํํธ์
๊ฒฝ๊ธฐ ์ฑ๋จ์ ๋ถ๋น๊ตฌ \n",
+ "1 Deloitte ์์งํ๊ณ๋ฒ์ธ ์ธ๊ตญ๊ณ๊ธฐ์
์์ธ ์๋ฑํฌ๊ตฌ \n",
+ "2 SK์ ์ค์๋น์ค ๋๊ธฐ์
์์ธ ์ค๊ตฌ \n",
+ "3 ์คํ์ฝ์ํฐํ
์ธ๋จผํธ ์ค์๊ธฐ์
์์ธ ๊ฐ๋จ๊ตฌ \n",
+ "4 ์ผ๋์ ์ฝ ์ค๊ฒฌ๊ธฐ์
์์ธ ์์ด๊ตฌ \n",
+ "5 ํด๋น์ธ ์ค์๊ธฐ์
๊ฒฝ๊ธฐ ์์์ ๋์๊ตฌ \n",
+ "6 ํํซ ์ค์๊ธฐ์
์์ธ ๊ฐ๋จ๊ตฌ \n",
+ "7 ํ์ด๋น์ค ์ค๊ฒฌ๊ธฐ์
IT/์ธํฐ๋ท \n",
+ "8 ์๋ฏน์ค ์ค์๊ธฐ์
๊ฒฝ๊ธฐ ์ฑ๋จ์ ๋ถ๋น๊ตฌ \n",
+ "9 ์ฃผ์ํ์ฌ ํผํฌ์ฆ๋ ์ค์๊ธฐ์
์์ธ ๊ฐ๋จ๊ตฌ \n",
+ "10 SM์ํฐํ
์ธ๋จผํธ ๋๊ธฐ์
์์ธ ์ฑ๋๊ตฌ \n",
+ "11 ํ๊ตญ์ฌํ๋ณด์ฅ์ ๋ณด์ ๊ณต๊ณต๊ธฐ๊ด/๊ณต๊ธฐ์
์์ธ ๊ด์ง๊ตฌ \n",
+ "12 ์์ธ๋ฏธ ์ค์๊ธฐ์
์์ธ ๊ฐ๋จ๊ตฌ \n",
+ "13 ์ปดํฌ์ค ์ค๊ฒฌ๊ธฐ์
์์ธ ๊ธ์ฒ๊ตฌ \n",
+ "14 ์ปดํฌ์ค ์ค๊ฒฌ๊ธฐ์
์์ธ ๊ธ์ฒ๊ตฌ \n",
+ "15 SNOW ๋๊ธฐ์
๊ฒฝ๊ธฐ ์ฑ๋จ์ ๋ถ๋น๊ตฌ \n",
+ "16 ์ปดํฌ์ค ์ค๊ฒฌ๊ธฐ์
์์ธ ๊ธ์ฒ๊ตฌ \n",
+ "17 Deloitte ์์งํ๊ณ๋ฒ์ธ ์ค๊ฒฌ๊ธฐ์
์์ธ ์๋ฑํฌ๊ตฌ \n",
+ "18 ํ์น์ฝํผ๋ ์ด์
๋๊ธฐ์
ํด์ธ, ์์ธ ์๋ฑํฌ๊ตฌ, ๊ฒฝ๋จ ์์ฐ์, ๋ถ์ฐ ๊ธฐ์ฅ๊ตฐ, ๋ถ์ฐ ์ฐ์ ๊ตฌ \n",
+ "19 ํ
์ฌ๋ผ์ฝ๋ฆฌ์ ์ธ๊ตญ๊ณ๊ธฐ์
์์ธ ๊ฐ๋จ๊ตฌ \n",
+ "\n",
+ " ์ธ๋ถ์ง๋ฌด ์๊ฒฉ์๊ฑด \n",
+ "0 \n",
+ "1 \n",
+ "2 \n",
+ "3 ์จ๋ผ์ธ ์ผํ๋ชฐ ์ด์ ๋ฐ CS ๋ด๋น์ ํ๋ ฅ : ์ด๋์กธ ์ด์\\n๊ฒฝ๋ ฅ : ๋ฌด๊ด(์ ์
/๊ฒฝ๋ ฅ)\\n์ํฐํ
์ธ๋จผํธ ๋ฐ ๋ฌธํ ์ฌ์
์ ๊ด... \n",
+ "4 \n",
+ "5 - ๋์กธ ์ด์(์ ์ ๊ด๋ จ ์ ๊ณต)\\n- ๋น์ฆ๋์ค ์์ด ํํ ๊ฐ๋ฅ์(TOEIC 700์ ... \n",
+ "6 \n",
+ "7 QA Beginner MMORPG ํ๋ ์ด ๊ฒฝํ์ด ๋ง์ผ์ ๋ถ\\n์ํํ ์ปค๋ฎค๋์ผ์ด์
์ด ๊ฐ๋ฅํ์ ๋ถ\\n\\n[์ ... \n",
+ "8 - ์ ์
/ ๊ฒฝ๋ ฅ 1๋
์ด์ 5๋
์ดํ\\n- ์ด๋์กธ ์ด์\\n\\n[ํฉ๋ฅ์ฌ์ ]\\n- ์... \n",
+ "9 ์ฝํ
์ธ ๋ง์ผํฐ ๋์์ธ ๋ฐ ์์ ์ ์ ํด ์ฌ์ฉ ๊ฒฝํ ํฌํ ์ต, ์ด๋๋น ํ๋ฆฌ๋ฏธ์ด, ์ด๋๋น ์ผ๋ฌ์คํธ๋ ์ดํฐ... \n",
+ "10 \n",
+ "11 \n",
+ "12 Software Engineer โข ์ปดํจํฐ ๊ณผํ ๋๋ ๊ด๋ จ ๊ณตํ ํ์ฌ ๋๋ ์ด์ ๋๋ฑํ ๊ฒฝํ\\nโข ๊ธฐ๋ณธ์ ์ธ ์๋ฐ(J... \n",
+ "13 \n",
+ "14 \n",
+ "15 \n",
+ "16 \n",
+ "17 \n",
+ "18 ํ์น์ฝํผ๋ ์ด์
_์๊ธ - ํ์ฌ ์ด์ \n",
+ "19 "
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "405b7b7f",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "python313",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.13.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}