diff --git a/scripts/ipo-blog/.gitignore b/scripts/ipo-blog/.gitignore new file mode 100644 index 0000000..ee2ab15 --- /dev/null +++ b/scripts/ipo-blog/.gitignore @@ -0,0 +1,101 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +*.manifest +*.spec + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Virtual environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# IDEs +.idea/ +.vscode/ +*.swp +*.swo +*~ +.DS_Store + +# Project specific +output/ +logs/ +*.log + +# Database +*.db +*.sqlite3 + +# Temporary files +*.tmp +*.bak +.~* + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# Environments +.env.local +.env.*.local + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ \ No newline at end of file diff --git a/scripts/ipo-blog/38_page.html b/scripts/ipo-blog/38_page.html new file mode 100644 index 0000000..6e06bc6 --- /dev/null +++ b/scripts/ipo-blog/38_page.html @@ -0,0 +1,1123 @@ + + + +공모주일정 - 수요예측일정, 공모주청약, 공모주분석, 기업공개, 상장, 공모일정, 공모주청약일정, 공모가, 공모주일정, 주식수, 공모주, 공모청약 - 비상장주식거래, 장외주식시장 NO.1 38커뮤니케이션 + + + + + + + + + + + + + + + + + + + + +
38커뮤니케이션 로고 +
+ + + + + + +
+ + + + +
+ + + +
+
+
+ + + + + + + +
+ + + + +
실시간 인기주동 +
+
+ + + + + +
비상장.
+ + + + + +
K-OTC.
+ + + + + +
코넥스.
+
+ +
+
+
+ +
+ + + + + + + +
장외시장 NO.1 독점적 점유율 기록
빨간색매매 매도매수 팝니다 장외시세
+ + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
비상장매매시세정보비상장(장외)IPO공모IPO예정분석기업정보주주동호회K-OTC코넥스코스닥/거래소전체 메뉴보기38머니충전
+
+ + + + + + +
+ + + + +
+ + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + +
IPO뉴스 더보기
[공모뉴스][06/25] 그래피, 3D 프린팅 "투명 치아 교정장치"
[공모뉴스][06/25] KB스팩32호 공모청약 마감날 청약경쟁률
[공모뉴스][06/25] S2W, 코스닥 상장 예심 통과…"하반기
+ + + + + + + + +
IPO일정 더보기
+ + + + + + + + + + + + + +
 [공모주일정]에스투더블유, 공모청약 일정 new
 [공모주일정]제이피아이헬스케어(구.정원정밀공업), 공 new
 [공모주일정]에스엔시스, 공모청약 일정
+
+ +
+
+ + + + + +
Home IPO심사/공모 수요예측일정
+
+
+ + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
 전체종목 청구종목 승인종목 기업IR일정 수요예측일정 수요예측결과 공모청약일정 신규상장 
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
종목명 수요예측일 희망공모가(원) 확정공모가 공모금액(백만) 주간사
 에스엔시스 2025.07.28~08.0127,000~30,000   - 51,300 신한투자증권
 교보스팩18호 2025.07.28~07.292,000~2,000   - 9,000 교보증권
 그래피 2025.07.24~07.3017,000~20,000   - 33,150 KB증권,신한투자증권
 제이피아이헬스케어(구.정원정밀공업) 2025.07.24~07.3016,500~20,000   - 26,070 키움증권
 하나스팩35호 2025.07.21~07.222,000~2,000   - 11,000 하나증권
 지투지바이오 2025.07.15~07.2148,000~58,000   - 43,200 미래에셋증권
 에스투더블유 2025.07.15~07.2111,400~13,200   - 18,012 대신증권
 대한조선(유가) 2025.07.11~07.1742,000~50,000   - 420,000 KB증권,NH투자증권,신영증권
 엔알비 2025.07.08~07.1418,000~21,000   - 37,800 NH투자증권,KB증권
 프로티나 2025.07.08~07.1411,000~14,000   - - 한국투자증권
 디비금융스팩14호 2025.07.07~07.082,000~2,000   - 10,000 DB증권
 뉴로핏 2025.07.04~07.1011,400~14,000   - 22,800 미래에셋증권
 삼양컴텍 2025.07.04~07.106,600~7,700   - 95,700 신한투자증권,NH투자증권
 도우인시스 2025.07.03~07.0929,000~32,000   - 40,600 키움증권
 LS스팩1호 2025.07.03~07.042,000~2,000   - 8,000
 아이티켐 2025.07.01~07.0714,500~16,100   - 29,000 KB증권
 아우토크립트 2025.06.24~06.3018,700~22,000   - - 대신증권
 KB스팩32호 2025.06.18~06.192,000~2,000   2,000 12,000 KB증권
 싸이닉솔루션 2025.06.16~06.204,000~4,700   4,700 16,450 대신증권
 뉴엔에이아이(구.알에스엔) 2025.06.12~06.1813,000~15,000   15,000 33,300 NH투자증권,신한투자증권
+  
+ +

+IPO공모, 공모일정, 상장, 공모주청약일정, 공모가, 청약경쟁률,주식수,확정공모가,공모금액,공모분석,기업공개,IPO,청구종목,승인종목,기업IR일정,수요예측일정,수요예측결과,공모청약일정,신규상장

+
※ IPO공모주 정보, 공모청약일정 등은 증권신고서 수리과정에서 변경될 수 있으며 입력오류도 배제 못하니 본인 책임하에 투자바랍니다

+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ +
+
+ + + + + +
아이디,비밀번호찾기무료회원가입
+
+
+ +
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
 최근 IPO 청구종목
+06/26 삼진식품
+06/26 삼성스팩11호
+06/26 KB스팩33호
+06/24 비엔케이스팩3호
+06/19 싸이몬
+06/19 키움히어로스팩1
+
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
 최근 IPO 승인종목
+06/24 에스투더블유
+06/24 하나스팩35호
+06/24 한라캐스트
+06/23 대한조선
+06/19 제이피아이헬스케
+06/19 에스엔시스
+
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
 IPO 공모주 청약일정
+07/03 아우토크립트
+07/10 아이티켐
+07/14 도우인시스
+07/15 뉴로핏
+07/15 삼양컴텍
+07/17 엔알비
+
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
 IPO 신규상장 일정
+06/30 지에프씨생명과학
+07/04 뉴엔에이아이(구.
+07/04 KB스팩32호
+07/07 싸이닉솔루션
+07/10 대신밸류리츠
+
+
 
+ +
+ + +
+ + +
+ + + + + +
회사소개광고문의기업정보문의업무제휴문의 + +38에바란다업무제휴사사이트맵개인정보취급방침정보제공윤리정책투자자유의사항 +
+ + + + + + +
38커뮤니케이션 로고 + + + + + + + + + + + + + + + + + + + + + + + + + + +
Copyrightⓒ + 38커뮤니케이션. All rights reserved.       + 삼팔커뮤니케이션,38stock,삼팔,38
상호 ㈜38커뮤니케이션   대표이사 서성기   사업자등록번호 108-81-21496   통신판매업 신고번호 제19-1912호
+ 주소: 서울시 구로구 디지털로 26길 111, 407호  전화 1644-3830 팩스 02-6124-6333 기사배열 책임자 이용민 기사배열 기본방침 +
장외주식시장, 장외주식 시세표, 장외주식매매, 비상장주식 시세표, 비상장매매, 장외주식거래, 장외주식 현재가, 장외주식 기업분석,IPO공모
본 게시판에 게시된 정보나 의견은 38커뮤니케이션과 아무런 관련이 없으며 게시물의 내용과 관련하여 발생한 법적 책임은 게시자
또는 이를 열람하는 이용자가 부담해야 하며, 당사에서 제공하는 증권정보와 분석자료 및 주식시세는 단순정보제공을 목적으로 하며
장외주식 거래를 목적으로 하지 않음. 투자간 매매는 일체 개입하지 않으며 정보 및 거래에 대한 손익책임은 투자자 본인에게 있습니다.
+
+ + + + diff --git a/scripts/ipo-blog/38comm_sample.html b/scripts/ipo-blog/38comm_sample.html new file mode 100644 index 0000000..b66658b --- /dev/null +++ b/scripts/ipo-blog/38comm_sample.html @@ -0,0 +1,3676 @@ + + + + +IPO > ̾(.˿) û , ֺм - ,ֽĽ NO.1 38Ŀ´̼ + + + + + + + + + + + + + + + + + + + + + + + +
38Ŀ´̼ ΰ +
+ + + + + + +
+ + + + +
+ + + +
+
+
+ + + + + + + + + + + + +
+ + + + +
ǽð αֵ + +
+
+ + + + + + + +
.
+ + + + + +
K-OTC.
+ + + + + +
ڳؽ.
+ +
+ + +
+ +
+
+ + + +
+ + + + + + + +
ܽ NO.1
Ÿ ŵż ˴ϴ ܽü
+ + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ÿü()IPOIPOмֵȣȸK-OTCڳؽڽ/ŷü ޴38Ӵ
+
+ + + + + + + +
+ + + + + + +
+ + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  ̾(.˿) Ȳ 
  ڽ ڵ  463020
  ǻͽý ڹ 񽺾
ǥ   輺ȯ   ߼Ϲ
  ϻ꼭 Ųؽ 240, ǽ 24 (ȭ,Ųؽ ޿׸)
Ȩ   www.realsn.com ǥȭ   070-4120-2698
ִ   -
  17,880 (鸸)μ
ӻ
  1,092 (鸸)
  1,105 (鸸) ں  3,296 (鸸)
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ѱֽļ   2,220,000 ׸鰡   500
  ָ : 2,220,000 (100%)  +
𰡾   13,000 ~ 15,000 û   1468.83:1 ( 2938:1)
Ȯ   15,000 ݾ   33,300 (鸸)
ְ   NH, + ֽļ: 555,000   /   ûѵ: -
+
+ + + + + + + + + + + + + + + + + +
μȸ ֽļ ûѵ Ÿ
NH499,500 ~ 599,400 16,000 ~ 19,000 ǥ
55,500 ~ 66,600 1,800 ~ 2,200 μ
+
+ + + + + + + + + + +
û
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ֿ  2025.06.12  ~   2025.06.18
û  2025.06.23  ~   2025.06.24
(Ź)  2025.06.26 (ְ Ȩ )
  2025.06.26
ȯ  2025.06.26
  2025.07.04
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ȯ  15,000 + + + + + + + +
   ִ׸鰡 :  500
   𰡾 :  13,000 ~ 15,000
Ѱֽļ  2,220,000 + + + + +
   ݾ : 33,300 (鸸)
+ +

+
+
+
+
       ûű : 100%
ڵ   1,665,000  (75.0%)    ְѵ :  -
Ϲû  555,000  (25.0%)    ûű : 50%
 û ְѵ :  -   :  -
+
IR + + + + + + + +
+ IR  + + 2025.06.16 + IR/ð  + +   : ѱIRȸ-¶ AM 10:00
+   Ϲ : +
+
+ + + + + + + +
+   + + 995.61:1 + ǹȮ  + + 17.18% +
+
űԻ + + + + + + + +
+ űԻ  + + 2025.07.04 +   + + - (%) +
+
+
+ + + + + + + + + + +
ǹ Ȯ
+ + + + + + + + + + +
û(:)
15 Ȯ 48,639,000
1 Ȯ82,856,000
3 Ȯ100,162,000
6 Ȯ 53,192,000
հ284,849,000
(%)17.18%

+ + + + + + + + + + +
俹
+ + + + + + + + + + + +
Ǽ (:)ûֽļ (:)ܼ
2,3971,657,692,000995.61:1
+
+ + + + + + + + + + +
俹 ûݺ
+ + + + + + + + + + +
Ǽ (:) ûֽļ (: )(%)
17,000̻12878,421,0004.7%
15,000ʰ ~17,000 ̸7771,711,0004.3%
15,00021641,476,053,00089.0%
11,000̻~15,000̸---
11,000̸22,217,0000.1%
ݹ(μ)2629,290,0001.8%
հ2,3971,657,692,000100%
+
+ + + + + + + + + + +
ġм
+ + + + +
+ + + + + + +
 ̾(.˿)  
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2024.12.312023.12.312022.12.31
ä40.95 %  195.74 %  114.79 %  
253.67 %  114.52 %  179.53 %  
ͼڱںͷ-26.48 %  10.86 %  17.03 %  
ͷ2.18 %  8.26 %  11.96 %  
10.27 %  16.99 %  22.08 %  
-70.93 %  -19.26 %  -41.63 %  
+
+ + + + + + +

+ + + + + + +
 ̾(.˿) ǥ
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
2024.12.312023.12.312022.12.31
  EPS (ִ) -852   168   228   
  PER (ְͺ)
+   
-17.60  89.49  65.66  
  BPS (ִڻ갡ġ)3,220   1,544   1,341   
  PBR (ְڻ)4.66  9.72  11.18  
  SPS (ִ)2,991   2,712   2,318   
  PSR (ְ׺)5.02  5.53  6.47  
+
+ + + + +
+ + + + + + + + + + +
м
+ + + + + + + + + + + + + + + +
+ + +

+ + + + + + + + Document + + + + + + +

1.Ȳ

+

-()̴̾ ΰ(AI) ȰϿ پ 忡 پ ()̾ ° +Ͽ ϰ мϿ ǹ ǹ մϴ. 簡 , ǰ, 귣м, +, پ · 񽺸 Ȱϰ ֽϴ.

+

ΰ(AI) ȰϿ м ÷ ϴ Quetta_Enterprise񽺰 2024 + ü 40% ϰ , ý ٷ ִ м ÷ǰ Quetta_Service 11%, + 䱸 ͸ Ͽ ϴ Quetta_Data 񽺰 ü 33% ϰ +ֽϴ. 

+

2.Ȳ

+ +++++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                                                  +(: õ, USD K)
ǰ  2025 1б202420232022
(22)(21)(20)(19)
ݾݾݾݾ
Quetta_Enterprise --191,9652188,0232128,669
($66)($147)($101)
441,505,938527,889,349578,333,220597,744,344
441,505,938537,981,314598,521,243617,873,013
Quetta_Data --------
271,684,227276,484,415215,095,434144,156,810
271,684,227276,484,415215,095,434144,156,810
Quetta_Service 15,745117,235227,353--
($4)($13)($21)
59517,193762,181,667702,090,167611,595,719
60522,938772,198,902722,117,520611,595,719
Insight Report --124,322--113,000
($18)($10)
9370,426281,407,439281,341,366191,171,539
9370,426291,431,761281,341,366201,184,539
Ÿ --------
6165,819131,619,8235804,2867472,822
6165,819131,619,8235804,2867472,822
    15,7453133,5224215,3763141,669
1454,243,60319619,582,69314917,664,47313115,141,234
1464,249,34819919,716,21515317,879,84913415,282,903
+


+

+

3.繫Ȳ

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                    +(1) 繫 强
                                                                                        +(: õ, %)
2025 1б202420232022
ȸK-IFRSK-IFRSK-IFRSK-IFRS
4,249,34819,716,21517,879,84815,282,903
18.30%10.30%17.00%22.10%
5,072,51119,287,19816,404,16913,455,385
119.40%97.80%91.70%88.00%
(ս)-823,163429,0171,475,6791,827,518
(ս)-19.40%2.20%8.30%12.00%
(ս)-737,219-5,619,5611,104,8201,505,849
(ս)-17.30%-28.50%6.20%9.90%
+


+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                     +(2) 繫
                                                                                          (: +%, õ)
2025 1б202420232022
ä44.80%40.90%195.70%114.80%83.30%
232.50%253.70%114.50%179.50%152.10%
Ա18.42%18.40%18.70%34.00%20.60%
ں()-1.54.88.84.6
Ȱ 帧384,91655,5751,625,5764,439,008-
+


+

+

4. 밡 (ȣ, + ֽļ)

+ +++++++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ָȸֽ Ű
ֽŰѹ밡ɹ
ֽļֽļֽļֽļ
ִ輺ȯִ2,170,20032.92%2,170,20024.44%2,170,20024.44%-0.00%36
ֵȣӿ991,70015.04%991,70011.17%991,70011.17%-0.00%36
ֱӿ638,1009.68%638,1007.19%638,1007.19%-0.00%36
ӿ307,4004.66%307,4003.46%307,4003.46%-0.00%36
̿ӿ270,3004.10%270,3003.04%270,3003.04%-0.00%36
ִֵ Ұ4,377,70066.40%4,377,70049.30%4,377,70049.30%-0.00%-
655,6009.94%655,6007.38%655,6007.38%-0.00%3
ڵ363,6005.52%363,6004.09%310,6563.50%52,9440.60%3
̺̽긴ó500,6007.59%500,6005.64%404,1464.55%96,4541.09%1
ܻ̽ȸ
̺ Ʈ Ͼ ݵó360,7005.47%360,7004.06%291,2013.28%69,4990.78%1
̺ ÷ ݵó240,5003.65%240,5002.71%194,1612.19%46,3390.52%1
̺-ڿ 2023 ʰ ó93,9001.42%93,9001.06%93,9001.06%-0.00%12
Ÿ Ұ2,214,90033.60%2,214,90024.94%1,949,66421.96%265,2362.99%-
ű( Ϲû) -0.00%2,220,00025.00%-0.00%2,220,00025.00%-
NHǢǹμ-0.00%66,6000.75%66,6000.75%-0.00%3
ְ μ Ұ-0.00%2,286,60025.75%66,6000.75%2,220,00025.00%-
հ6,592,600100.00%8,879,200100.00%6,393,96472.01%2,485,23627.99%-
+


+

+

5.繫ǥ

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2025202420232022
(22)(21)(20)(19)
2025.03.31 2024.12.31 2023.12.31 2022.12.31
ȸó K-IFRSK-IFRSK-IFRSK-IFRS
ܺΰȸȸȸȸ
(ǰ)()()()()
. ڻ19,115,474,29419,544,707,21119,935,738,8918,856,368,560
  ݹݼڻ7,280,486,17910,168,678,6949,192,984,9784,901,669,074
  ä2,060,157,2722,548,075,0572,466,550,2041,763,195,160
  ڻ602,185,384679,164,300138,235,018141,859,200
  Ŀڻ9,100,086,2996,085,277,2578,128,805,0662,013,635,616
  Ÿڻ72,559,16063,511,9039,163,62536,009,510
. ڻ10,686,661,36210,372,250,02510,160,540,94710,137,511,632
  Ŀڻ290,979,505287,797,677293,760,495289,796,946
  -ġڻ375,000,000375,000,000387,300,00083,700,000
  ڻ8,707,841,6558,640,408,4538,266,974,5418,572,903,414
  ڻ383,567,000384,422,000387,842,000391,262,000
  ڻ320,788,827293,588,877315,224,334409,236,397
  ̿μڻ608,484,375391,033,018509,439,577390,612,875
29,802,135,65629,916,957,23630,096,279,83818,993,880,192
. ä8,220,719,9717,705,116,22717,408,010,0724,932,837,445
  ä1,589,966,269697,891,3551,241,620,2471,176,288,633
  ä495,574,916705,821,225770,749,122741,422,452
  ܱԱ4,754,999,9964,754,999,9963,994,999,9962,000,000,000
  Ÿä1,078,304,9191,320,330,133912,423,029819,952,853
  ä143,119,215147,766,596138,091,969132,624,815
  -ġä--10,286,308,268-
  Ÿä-38,379,375--
  ä40,211,91639,927,54739,924,39939,311,682
  μä118,542,740-23,893,04223,237,010
. ä998,967,823986,288,5852,511,658,5435,218,374,207
  ä92,306,65492,306,654139,378,262-
  Ա733,333,344758,333,3431,618,333,3394,450,000,000
  ä173,327,825135,648,588160,521,652239,089,916
  Ȯ޿ä--593,425,290529,284,291
ä 9,219,687,7948,691,404,81219,919,668,61510,151,211,652
. ں3,304,240,0003,304,240,000300,000,000300,000,000
. ں׿13,281,528,46013,281,528,460--
. Ÿں700,632,809606,517,954223,784,211-
. ׿3,296,046,5934,033,266,0099,652,827,0128,542,668,540
20,582,447,86221,225,552,42310,176,611,2238,842,668,540
(2025.01.01~(2024.01.01~(2023.01.01~(2022.01.01~
2025.03.31)2024.12.31)2023.12.31)2022.12.31)
. 4,249,348,33019,716,215,28417,879,847,78615,282,902,475
. (ս)-823,162,949429,017,3041,475,678,8661,827,517,610
. ()-737,219,416-5,619,561,0031,104,820,4171,505,849,076
. ⺻ִ(ս)-112-930189258
. ִ(ս)-112-930179258
+


+

+

6.ü 繫

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                   +[񱳱 2024 ± ֿ 繫Ȳ]
                                                                                          +(: 鸸)
AIѱ۰ǻڿý̸Ʈ
ȸK-IFRS K-IFRS K-IFRS K-IFRS K-IFRS
ڻ19,545  301,473     73,161   28,673   39,755 
ڻ10,372  380,467     74,223     1,685     8,921 
ڻѰ29,917  681,939   147,384   30,358   48,676 
ä7,705  130,176     13,873     8,999     7,560 
ä986,    66,097      1,683       148   10,458 
äѰ8,691  196,273     15,556     9,146   18,017 
ں3,304    13,466      7,196     2,446     3,603 
ںѰ21,226  485,666   131,828   21,212   30,658 
19,716  304,773     61,237   27,966   30,866 
429    40,423      8,834     2,031     2,027 
()-5,620    13,879      9,062     2,362     +3,683 
+
+
+ + +
 
+
+
  + Ϻ +  
 IPO , , ֽļ, û ǽŰ (ݰ) + ֽϴ.
+ +

  + + + + +
+
+ + + + + +
+
+ + + + + +

+ + +

+ + + + +

+ ̾(.˿) IPO,̾(.˿) ,̾(.˿) ,̾(.˿) ,̾(.˿) û,̾(.˿) ,̾(.˿) û,̾(.˿) ֽļ,̾(.˿) Ȯ,̾(.˿) ݾ,̾(.˿) м,̾(.˿) û,ֺм,û,û

+ + + + +
+ + +
+ +
IPO , û ǽŰ Է¿ ϴ åϿ ڹٶϴ

+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ +
+ +
+ + + + + +
̵,йȣãȸ
+
+
+ +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
 ֱ IPO û
+ 06/27
+ 06/26 ǰ
+ 06/26 Z11ȣ
+ 06/26 KB33ȣ
+ 06/24 ̽3ȣ
+ 06/19 ̸
+
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
 ֱ IPO
+ 06/27 Z10ȣ
+ 06/24
+ 06/24 ϳ35ȣ
+ 06/24 ѶijƮ
+ 06/23
+ 06/19 Ǿコ
+
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
 IPO û
+ 07/03 ƿũƮ
+ 07/14 νý
+ 07/15
+ 07/15
+ 07/17 ˺
+ 07/18 Ƽ
+
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
 IPO űԻ
+ 07/04 ̾(.
+ 07/04 KB32ȣ
+ 07/07 ̴мַ
+ 07/10 Ź
+
+
 

+ + + + +
+ + + + + + + + + + + + + + + +
+
Ǿコɾ, 10
̴мַ û
׷, 3D "
KB32ȣ û
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
Ƽ, û
, û
Ǿコɾ(.
ý, û
+ +
+ + + +
+ + + + +
+ + +
+ + + + + + + + + + +
޴
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ÿ
ֽĽü
м
IPO м
м
û
DZ/Ϲݰ
Ķ
+
topΰ
+
+
+ + + + + + +
ȸҰ޹ + + 38ٶ޻Ʈ޹ħåǻ +
+ + + + + + +
38Ŀ´̼ ΰ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Copyright + 38Ŀ´̼. All rights reserved.       + Ŀ´̼,38stock,,38
ȣ 38Ŀ´̼   ǥ̻    ڵϹȣ 108-81-21496   Ǹž Űȣ 19-1912ȣ
+ ּ: α з 26 111, 407ȣ  ȭ 1644-3830 ѽ 02-6124-6333 迭 å ̿ 迭 ⺻ħ +
ֽĽ, ֽ üǥ, ֽĸŸ, ֽ üǥ, Ÿ, ֽİŷ, ֽ 簡, ֽ м,IPO
Խǿ Խõ ǰ 38Ŀ´̼ǰ ƹ Խù Ͽ ߻ å Խ
Ǵ ̸ ϴ ̿ڰ δؾ ϸ, 翡 ϴ мڷ ֽĽü ܼ ϸ
ֽ ŷ . ڰ ŸŴ ü ŷ å ο ֽϴ.
+ +
+ + + + + + diff --git a/scripts/ipo-blog/config/__init__.py b/scripts/ipo-blog/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/ipo-blog/database/__init__.py b/scripts/ipo-blog/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/ipo-blog/db/README.md b/scripts/ipo-blog/db/README.md new file mode 100644 index 0000000..d62a288 --- /dev/null +++ b/scripts/ipo-blog/db/README.md @@ -0,0 +1,138 @@ +# IPO Blog 데이터베이스 관리 + +Liquibase를 사용하여 데이터베이스 스키마를 버전 관리합니다. + +## 필요 사항 + +1. **Liquibase 설치** + ```bash + brew install liquibase # macOS + # 또는 https://www.liquibase.org/download 에서 다운로드 + ``` + +2. **MySQL Connector 설치** + ```bash + # lib 디렉토리에 MySQL Connector JAR 파일 다운로드 + cd db/lib + wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-8.4.0.jar + ``` + +3. **환경변수 설정** + ```bash + export IPO_MYSQL_HOST=stock-api.advenoh.pe.kr + export IPO_MYSQL_PORT=10024 + export IPO_MYSQL_DATABASE=ipo + export IPO_MYSQL_USER=ipo + export IPO_MYSQL_PASSWORD=your_password + ``` + +## 디렉토리 구조 + +``` +db/ +├── changelog.yaml # 마스터 changelog 파일 +├── liquibase.properties # Liquibase 설정 +├── liquibase.sh # 실행 스크립트 +├── changelog/ # SQL 변경사항 +│ └── 2025-06/ # 날짜별 디렉토리 +│ ├── 1_init.sql # 초기 테이블 생성 +│ ├── 2_add-indexes.sql # 인덱스 추가 +│ └── 3_insert-initial-data.sql # 초기 데이터 +├── lib/ # 의존성 라이브러리 +│ └── mysql-connector-j-8.4.0.jar +├── scripts/ # 유틸리티 스크립트 +│ └── mysql_backup.sh # 백업 스크립트 +└── README.md # 이 파일 + +``` + +## 사용 방법 + +### 1. DB 상태 확인 +```bash +cd db +./liquibase.sh status +``` + +### 2. 변경사항 적용 +```bash +# 모든 변경사항 적용 +./liquibase.sh update-all + +# 한 개씩 적용 +./liquibase.sh update-one +``` + +### 3. 롤백 +```bash +# 마지막 변경사항 1개 롤백 +./liquibase.sh rollback-one + +# 특정 태그로 롤백 +./liquibase.sh rollback-tag +``` + +### 4. 히스토리 확인 +```bash +./liquibase.sh history +``` + +### 5. 태그 생성 +```bash +./liquibase.sh tag release-1.0 +``` + +### 6. 백업 +```bash +cd scripts +./mysql_backup.sh +``` + +## 새로운 변경사항 추가 + +1. `changelog/YYYY-MM/` 디렉토리에 새 SQL 파일 생성 +2. 파일명은 순서를 나타내는 번호로 시작 (예: `4_add-column.sql`) +3. 파일 형식: + ```sql + --liquibase formatted sql + --changeset ipo-blog:#004 + + -- 변경사항 SQL + ALTER TABLE ipo_info ADD COLUMN new_column VARCHAR(50); + + --rollback ALTER TABLE ipo_info DROP COLUMN new_column; + ``` + +## 테이블 구조 + +### 1. ipo_info (IPO 기본정보) +- stock_code: 종목코드 (PK) +- company_name: 회사명 +- market_type: 시장구분 +- industry: 업종 +- 기타 기본 정보 + +### 2. financial_info (재무정보) +- 연도별 재무 데이터 +- stock_code로 ipo_info와 연결 + +### 3. offering_info (공모정보) +- 공모가, 청약일정 등 +- stock_code로 ipo_info와 연결 + +### 4. news_info (뉴스정보) +- IPO 관련 뉴스 +- sentiment 분석 포함 + +### 5. posting_history (포스팅이력) +- 블로그 포스팅 생성 이력 + +### 6. underwriter_list (증권사목록) +- 관심 증권사 목록 관리 + +## 주의사항 + +1. **프로덕션 적용 전 반드시 테스트 환경에서 검증** +2. **변경 전 백업 필수** +3. **rollback 스크립트 항상 포함** +4. **외래키 제약조건은 CASCADE 옵션 사용** \ No newline at end of file diff --git a/scripts/ipo-blog/db/changelog.yaml b/scripts/ipo-blog/db/changelog.yaml new file mode 100644 index 0000000..313cea1 --- /dev/null +++ b/scripts/ipo-blog/db/changelog.yaml @@ -0,0 +1,7 @@ +databaseChangeLog: + - includeAll: + path: "changelog" + endsWithFilter: ".sql" + minDepth: 2 + maxDepth: 2 + resourceComparator: "com.arcbrain.liquibase.NaturalOrderComparator" \ No newline at end of file diff --git a/scripts/ipo-blog/db/changelog/2025-06/1_init.sql b/scripts/ipo-blog/db/changelog/2025-06/1_init.sql new file mode 100644 index 0000000..1720b45 --- /dev/null +++ b/scripts/ipo-blog/db/changelog/2025-06/1_init.sql @@ -0,0 +1,81 @@ +--liquibase formatted sql +--changeset ipo-blog:#001 + +-- IPO 정보 테이블 +CREATE TABLE IF NOT EXISTS `ipo_info` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `stock_code` VARCHAR(10) UNIQUE NOT NULL COMMENT '종목코드', + `company_name` VARCHAR(100) NOT NULL COMMENT '회사명', + `market_type` VARCHAR(20) COMMENT '시장구분 (코스피/코스닥)', + `company_type` VARCHAR(50) COMMENT '기업구분', + `industry` VARCHAR(100) COMMENT '업종', + `main_products` TEXT COMMENT '주요제품', + `homepage` VARCHAR(255) COMMENT '홈페이지', + `major_shareholder` VARCHAR(100) COMMENT '최대주주', + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시', + `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='IPO 기본정보'; + +-- 재무 정보 테이블 +CREATE TABLE IF NOT EXISTS `financial_info` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `stock_code` VARCHAR(10) NOT NULL COMMENT '종목코드', + `year` INT NOT NULL COMMENT '연도', + `revenue` DECIMAL(15,2) COMMENT '매출액', + `operating_profit` DECIMAL(15,2) COMMENT '영업이익', + `net_profit` DECIMAL(15,2) COMMENT '당기순이익', + `total_debt` DECIMAL(15,2) COMMENT '총부채', + `capital` DECIMAL(15,2) COMMENT '자본금', + FOREIGN KEY (`stock_code`) REFERENCES `ipo_info`(`stock_code`) ON DELETE CASCADE, + UNIQUE KEY `unique_stock_year` (`stock_code`, `year`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='재무정보'; + +-- 공모 정보 테이블 +CREATE TABLE IF NOT EXISTS `offering_info` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `stock_code` VARCHAR(10) NOT NULL COMMENT '종목코드', + `desired_price_min` INT COMMENT '희망공모가 최소', + `desired_price_max` INT COMMENT '희망공모가 최대', + `fixed_price` INT COMMENT '확정공모가', + `underwriters` TEXT COMMENT '주관사', + `total_competition_rate` DECIMAL(10,2) COMMENT '전체경쟁률', + `institutional_competition_rate` DECIMAL(10,2) COMMENT '기관경쟁률', + `retail_allocation` INT COMMENT '일반청약비율', + `institutional_allocation` INT COMMENT '기관청약비율', + `demand_forecast_date` DATE COMMENT '수요예측일', + `subscription_date` DATE COMMENT '청약일', + `payment_date` DATE COMMENT '납입일', + `refund_date` DATE COMMENT '환불일', + `listing_date` DATE COMMENT '상장일', + FOREIGN KEY (`stock_code`) REFERENCES `ipo_info`(`stock_code`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='공모정보'; + +-- 뉴스 정보 테이블 +CREATE TABLE IF NOT EXISTS `news_info` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `stock_code` VARCHAR(10) NOT NULL COMMENT '종목코드', + `title` VARCHAR(500) COMMENT '뉴스제목', + `url` VARCHAR(500) COMMENT '뉴스URL', + `source` VARCHAR(50) COMMENT '뉴스출처', + `published_date` DATETIME COMMENT '발행일시', + `summary` TEXT COMMENT '요약', + `sentiment` VARCHAR(20) COMMENT '감성분석 (긍정/부정/중립)', + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시', + FOREIGN KEY (`stock_code`) REFERENCES `ipo_info`(`stock_code`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='뉴스정보'; + +-- 포스팅 이력 테이블 +CREATE TABLE IF NOT EXISTS `posting_history` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `stock_code` VARCHAR(10) NOT NULL COMMENT '종목코드', + `file_path` VARCHAR(500) COMMENT '파일경로', + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시', + `status` VARCHAR(20) DEFAULT 'completed' COMMENT '상태', + FOREIGN KEY (`stock_code`) REFERENCES `ipo_info`(`stock_code`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='포스팅이력'; + +--rollback DROP TABLE IF EXISTS `posting_history`; +--rollback DROP TABLE IF EXISTS `news_info`; +--rollback DROP TABLE IF EXISTS `offering_info`; +--rollback DROP TABLE IF EXISTS `financial_info`; +--rollback DROP TABLE IF EXISTS `ipo_info`; \ No newline at end of file diff --git a/scripts/ipo-blog/db/changelog/2025-06/2_add-indexes.sql b/scripts/ipo-blog/db/changelog/2025-06/2_add-indexes.sql new file mode 100644 index 0000000..639ad3c --- /dev/null +++ b/scripts/ipo-blog/db/changelog/2025-06/2_add-indexes.sql @@ -0,0 +1,37 @@ +--liquibase formatted sql +--changeset ipo-blog:#002 + +-- ipo_info 인덱스 +CREATE INDEX idx_ipo_info_company_name ON `ipo_info` (`company_name`); +CREATE INDEX idx_ipo_info_market_type ON `ipo_info` (`market_type`); +CREATE INDEX idx_ipo_info_created_at ON `ipo_info` (`created_at`); + +-- financial_info 인덱스 +CREATE INDEX idx_financial_info_stock_code ON `financial_info` (`stock_code`); +CREATE INDEX idx_financial_info_year ON `financial_info` (`year`); + +-- offering_info 인덱스 +CREATE INDEX idx_offering_info_stock_code ON `offering_info` (`stock_code`); +CREATE INDEX idx_offering_info_listing_date ON `offering_info` (`listing_date`); +CREATE INDEX idx_offering_info_underwriters ON `offering_info` (`underwriters`(100)); + +-- news_info 인덱스 +CREATE INDEX idx_news_info_stock_code ON `news_info` (`stock_code`); +CREATE INDEX idx_news_info_published_date ON `news_info` (`published_date`); + +-- posting_history 인덱스 +CREATE INDEX idx_posting_history_stock_code ON `posting_history` (`stock_code`); +CREATE INDEX idx_posting_history_created_at ON `posting_history` (`created_at`); + +--rollback DROP INDEX idx_posting_history_created_at ON `posting_history`; +--rollback DROP INDEX idx_posting_history_stock_code ON `posting_history`; +--rollback DROP INDEX idx_news_info_published_date ON `news_info`; +--rollback DROP INDEX idx_news_info_stock_code ON `news_info`; +--rollback DROP INDEX idx_offering_info_underwriters ON `offering_info`; +--rollback DROP INDEX idx_offering_info_listing_date ON `offering_info`; +--rollback DROP INDEX idx_offering_info_stock_code ON `offering_info`; +--rollback DROP INDEX idx_financial_info_year ON `financial_info`; +--rollback DROP INDEX idx_financial_info_stock_code ON `financial_info`; +--rollback DROP INDEX idx_ipo_info_created_at ON `ipo_info`; +--rollback DROP INDEX idx_ipo_info_market_type ON `ipo_info`; +--rollback DROP INDEX idx_ipo_info_company_name ON `ipo_info`; \ No newline at end of file diff --git a/scripts/ipo-blog/db/changelog/2025-06/3_insert-initial-data.sql b/scripts/ipo-blog/db/changelog/2025-06/3_insert-initial-data.sql new file mode 100644 index 0000000..cbf7be5 --- /dev/null +++ b/scripts/ipo-blog/db/changelog/2025-06/3_insert-initial-data.sql @@ -0,0 +1,22 @@ +--liquibase formatted sql +--changeset ipo-blog:#003 + +-- 증권사 목록 테이블 생성 (추가) +CREATE TABLE IF NOT EXISTS `underwriter_list` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `underwriter_name` VARCHAR(100) NOT NULL COMMENT '증권사명', + `is_active` BOOLEAN DEFAULT TRUE COMMENT '활성화 여부', + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='주관증권사 목록'; + +-- 증권사 목록 초기 데이터 +INSERT INTO `underwriter_list` (`underwriter_name`) VALUES +('미래에셋증권'), +('한국투자증권'), +('신한투자증권'), +('KB증권'), +('NH투자증권'), +('삼성증권'); + +--rollback DELETE FROM `underwriter_list` WHERE `underwriter_name` IN ('미래에셋증권', '한국투자증권', '신한투자증권', 'KB증권', 'NH투자증권', '삼성증권'); +--rollback DROP TABLE IF EXISTS `underwriter_list`; \ No newline at end of file diff --git a/scripts/ipo-blog/db/liquibase.properties b/scripts/ipo-blog/db/liquibase.properties new file mode 100644 index 0000000..7234bc5 --- /dev/null +++ b/scripts/ipo-blog/db/liquibase.properties @@ -0,0 +1,35 @@ +#### _ _ _ _ +## | | (_) (_) | +## | | _ __ _ _ _ _| |__ __ _ ___ ___ +## | | | |/ _` | | | | | '_ \ / _` / __|/ _ \ +## | |___| | (_| | |_| | | |_) | (_| \__ \ __/ +## \_____/_|\__, |\__,_|_|_.__/ \__,_|___/\___| +## | | +## |_| +## +## The liquibase.properties file stores properties which do not change often, +## such as database connection information. Properties stored here save time +## and reduce risk of mistyped command line arguments. +## Learn more: https://docs.liquibase.com/concepts/connections/creating-config-properties.html +#### +#### +## Note about relative and absolute paths: +## The liquibase.properties file requires paths for some properties. +## The classpath is the path/to/resources (ex. src/main/resources). +## The changeLogFile path is relative to the classpath. +## The url H2 example below is relative to 'pwd' resource. +#### +# Enter the path for your changelog file. +changeLogFile=changelog.yaml + +#### Enter the Target database 'url' information #### +liquibase.command.url=jdbc:mysql://${IPO_MYSQL_HOST}:${IPO_MYSQL_PORT}/${IPO_MYSQL_DATABASE} + +# Enter the username for your Target database. +liquibase.command.username=${IPO_MYSQL_USER} + +# Enter the password for your Target database. +liquibase.command.password=${IPO_MYSQL_PASSWORD} + +# mysql connector jar classpath +classpath=./lib/mysql-connector-j-8.4.0.jar:./lib/liquibase-natural-comparator.jar diff --git a/scripts/ipo-blog/db/liquibase.sh b/scripts/ipo-blog/db/liquibase.sh new file mode 100755 index 0000000..631c690 --- /dev/null +++ b/scripts/ipo-blog/db/liquibase.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +if [ $# -lt 1 ]; then + echo "Usage: $0 [options]" + echo "Commands:" + echo " update-one - Apply next 1 change" + echo " update-all - Apply all pending changes" + echo " rollback-one - Rollback last 1 change" + echo " rollback-tag - Rollback to specific tag" + echo " status - Show pending changes" + echo " history - Show change history" + echo " validate - Validate changelog" + echo " tag - Tag current database state" + exit 1 +fi + +COMMAND=$1 +LIQUIBASE_PROPERTY=liquibase.properties + +echo "COMMAND: $COMMAND | LIQUIBASE_PROPERTY: $LIQUIBASE_PROPERTY" + +# Liquibase 실행 +case $COMMAND in + update-one) + liquibase --defaults-file=$LIQUIBASE_PROPERTY update-count 1 + ;; + update-all) + liquibase --defaults-file=$LIQUIBASE_PROPERTY update + ;; + rollback-one) + liquibase --defaults-file=$LIQUIBASE_PROPERTY rollback-count 1 + ;; + rollback-tag) + if [ $# -lt 2 ]; then + echo "Usage: $0 rollback-tag " + exit 1 + fi + liquibase --defaults-file=$LIQUIBASE_PROPERTY rollback $2 + ;; + status) + liquibase --defaults-file=$LIQUIBASE_PROPERTY status --verbose + ;; + history) + liquibase --defaults-file=$LIQUIBASE_PROPERTY history + ;; + validate) + liquibase --defaults-file=$LIQUIBASE_PROPERTY validate + ;; + tag) + if [ $# -lt 2 ]; then + echo "Usage: $0 tag " + exit 1 + fi + liquibase --defaults-file=$LIQUIBASE_PROPERTY tag $2 + ;; + *) + echo "Unknown command: $COMMAND" + exit 1 + ;; +esac \ No newline at end of file diff --git a/scripts/ipo-blog/db/scripts/mysql_backup.sh b/scripts/ipo-blog/db/scripts/mysql_backup.sh new file mode 100755 index 0000000..ab0a050 --- /dev/null +++ b/scripts/ipo-blog/db/scripts/mysql_backup.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +echo "Starting IPO database backup..." + +BACKUP_ROOT="./backup" +DATE=$(date '+%Y%m%d_%H%M%S') +echo "Backup date: $DATE" + +# 환경변수에서 DB 정보 읽기 +MYSQL_HOST=${IPO_MYSQL_HOST} +MYSQL_PORT=${IPO_MYSQL_PORT} +MYSQL_DATABASE=${IPO_MYSQL_DATABASE} +MYSQL_USER=${IPO_MYSQL_USER} +MYSQL_PASSWORD=${IPO_MYSQL_PASSWORD} + +function main() { + mkdir -p $BACKUP_ROOT/$DATE + echo "Backing up database: $MYSQL_DATABASE" + + mysqldump --column-statistics=0 \ + --databases $MYSQL_DATABASE \ + -h $MYSQL_HOST \ + -P $MYSQL_PORT \ + -u $MYSQL_USER \ + -p"$MYSQL_PASSWORD" \ + > $BACKUP_ROOT/$DATE/ipo_backup.sql + + if [ $? -eq 0 ]; then + echo "Backup completed successfully: $BACKUP_ROOT/$DATE/ipo_backup.sql" + else + echo "Backup failed!" + exit 1 + fi +} + +main \ No newline at end of file diff --git a/scripts/ipo-blog/debug_38_page.py b/scripts/ipo-blog/debug_38_page.py new file mode 100644 index 0000000..580e6e6 --- /dev/null +++ b/scripts/ipo-blog/debug_38_page.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +""" +Debug script to analyze 38 Communications IPO page structure +""" +import requests +from bs4 import BeautifulSoup +import logging +import urllib3 + +# Disable SSL warnings +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) + +def analyze_38_page(url): + """Download and analyze 38 Communications page""" + + # Test URL - 뉴엔에이아이 + if not url: + url = "https://www.38.co.kr/html/fund/?o=v&no=2192" + + print(f"\n=== Analyzing 38 Communications Page ===") + print(f"URL: {url}\n") + + # Download page + session = requests.Session() + session.headers.update({ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' + }) + + try: + response = session.get(url, verify=False, timeout=10) + response.encoding = 'euc-kr' + + # Save HTML for inspection + with open('38comm_debug.html', 'w', encoding='utf-8') as f: + f.write(response.text) + print("✓ Saved HTML to 38comm_debug.html") + + # Parse with BeautifulSoup + soup = BeautifulSoup(response.text, 'html.parser') + + # Find all tables + tables = soup.find_all('table') + print(f"\n✓ Found {len(tables)} tables") + + # Analyze each table + for idx, table in enumerate(tables): + print(f"\n--- Table {idx + 1} ---") + + # Get table headers + headers = [] + header_row = table.find('tr') + if header_row: + for th in header_row.find_all(['th', 'td']): + headers.append(th.get_text(strip=True)) + + if headers: + print(f"Headers: {headers}") + + # Get first few rows to understand structure + rows = table.find_all('tr')[1:4] # Get first 3 data rows + for row_idx, row in enumerate(rows): + cells = [cell.get_text(strip=True) for cell in row.find_all(['td', 'th'])] + if cells: + print(f"Row {row_idx + 1}: {cells}") + + # Look for specific keywords + print("\n=== Searching for Key Information ===") + + keywords = [ + "희망공모가", "확정공모가", "공모금액", "공모주식수", + "수요예측", "기관경쟁률", "통합경쟁률", + "주간사", "대표주관", "청약일", "상장일", + "매출액", "영업이익", "당기순이익", "자본금", + "업종", "주요제품", "최대주주" + ] + + for keyword in keywords: + elements = soup.find_all(text=lambda text: keyword in text if text else False) + if elements: + print(f"\n✓ Found '{keyword}' in {len(elements)} places:") + for elem in elements[:2]: # Show first 2 occurrences + parent = elem.parent + if parent: + # Try to get the associated value + next_sibling = parent.find_next_sibling() + if next_sibling: + value = next_sibling.get_text(strip=True) + print(f" - {elem.strip()} → {value}") + else: + # Check if value is in the same row + row = parent.find_parent('tr') + if row: + cells = row.find_all(['td', 'th']) + cell_texts = [c.get_text(strip=True) for c in cells] + print(f" - Row: {cell_texts}") + + except Exception as e: + print(f"Error: {e}") + +if __name__ == "__main__": + # Test with 뉴엔에이아이 + analyze_38_page("https://www.38.co.kr/html/fund/?o=v&no=2192") \ No newline at end of file diff --git a/scripts/ipo-blog/direct_page.html b/scripts/ipo-blog/direct_page.html new file mode 100644 index 0000000..47db065 --- /dev/null +++ b/scripts/ipo-blog/direct_page.html @@ -0,0 +1,2718 @@ + + + + + + IPO공모 > 대한조선 공모주청약 일정, 공모주분석 - 비상장,장외주식시장 NO.1 38커뮤니케이션 + + + + + + + + + + + + + + + + + + + + + +
+ + 38커뮤니케이션 로고 + + +
+ + + + + + +
+ + + + +
+ + + + + +
+
+ +
+
+ + + + + + + +
+ + + + + +
+ + 실시간 인기주동 + + +
+
+ + + + + +
+ 비상장 + + . + +
+ + + + + +
+ K-OTC + + . + +
+ + + + + +
+ 코넥스 + + . + +
+
+ +
+
+
+ +
+ + + + + + + + +
+ 장외시장 NO.1 독점적 점유율 기록 +
+ + 빨간색매매 + + + 매도매수 + + + 팝니다 + + + + 장외시세 + +
+
+ + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + 비상장매매 + + + + 시세정보 + + + + 비상장(장외) + + + + IPO공모 + + + + IPO예정분석 + + + + 기업정보 + + + + 주주동호회 + + + + K-OTC + + + + 코넥스 + + + + 코스닥/거래소 + + + 전체 메뉴보기 + + + 38머니충전 + + +
+
+ +
+ + + + + + +
+
+ + + + + + + +
+ + + + + + + +
+
+
+ + + + + + + + + + + +
+ 기업개요 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 종목명 + + + + + 대한조선 + + + + + 진행상황 + + 공모주 +
+ 시장구분 + + 거래소 + + 종목코드 + + 439260 +
+ 업종 + + 선박 및 수상 부유 구조물 건조업 +
+ 대표자 + + 김광호, 왕삼동 + + 기업구분 + + 중소일반 +
+ 본점소재지 + + 전남 해남군 화원면 구림리 887 +
+ 홈페이지 + + + www.daehanship.com + + + 대표전화 + + 061-531-1534 +
+ 최대주주 + + 케이에이치아이 65% +
+ 매출액 + + 1,075,312 (백만원) + + 법인세비용차감전 +
+ 계속사업이익 +
+ 156,409 (백만원) +
+ 순이익 + + 172,651 (백만원) + + 자본금 + + 152,631 (백만원) +
+
+ + + + + + + + + + +
+ 공모정보 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 총공모주식수 + + 10,000,000 주 + + 액면가 + + 5,000 원 +
+ 상장공모 + + 신주모집 : 8,000,000 주 (80%)  + /   구주매출 : 2,000,000 주 (20%) +
+ 희망공모가액 + + 42,000 ~ 50,000 원 + + 청약경쟁률 + +
+ 확정공모가 + + + - + + 원 + + 공모금액 + + 420,000 (백만원) +
+ 주간사 + + + KB증권,NH투자증권,신영증권 + + + 주식수: 2,500,000~3,000,000 주   /   청약한도: - 주 +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ 인수회사 + + 주식수 + + 청약한도 + + 기타 +
+ KB증권 + + 900,000 ~ 1,080,000 주 + + 37,000 ~ 45,000 주 + + 공동대표 +
+ NH투자증권 + + 860,000 ~ 1,032,000 주 + + 35,000 ~ 43,000 주 + + 공동대표 +
+ 신영증권 + + 240,000 ~ 288,000 주 + + 10,000 ~ 12,000 주 + + 공동주관 +
+
+ + + + + + + + + + +
+ 공모청약일정 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 주요일정 + + 수요예측일 + + 2025.07.11  ~   2025.07.17 +
+ 공모청약일 + + 2025.07.22  ~   2025.07.23 +
+ 배정공고일(신문) + + 2025.07.25 (주간사 홈페이지 참조) +
+ 납입일 + + 2025.07.25 +
+ 환불일 + + 2025.07.25 +
+ 상장일 + +
+ 공모사항 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 확정공모가 + + + - + + 원 + + + + + + + + +
+ 주당액면가 :  5,000 원 +
+ 희망공모가액 :  42,000 ~ 50,000 원 +
+
+ 총공모주식수 + + 10,000,000 주 + + + + + +
+ 공모금액 : 420,000 (백만원) +
+
+ 그 +
+ 룹 +
+ 별 +
+ 배 +
+ 정 +
+ 우리사주조합 + + 1,600,000 주  (20.0%) + + 청약증거금율 : 100% +
+ 기관투자자등 + + 5,500,000~7,500,000 주  (55.0~75.0%) + + 최고한도 :  - 주 +
+ 일반청약자 + + 2,500,000~3,000,000 주  (25.0~30.0%) + + 청약증거금율 : 50% +
+ 청약 최고한도 : + + - + + 주 + + 최저 :  - 주 +
+
+ IR일정 + + + + + + + + +
+ + IR일자 + + + 2025.06.25 ~ 07.16 + + + IR장소/시간 + + + 기관 : +
+ 일반 : +
+
+ 수요예측결과 + + + + + + + + +
+ + 기관경쟁률 + + + + + 의무보유확약 + + + 0.00% +
+
+
+
+ + + + + + + + + + +
+ 공모분석 +
+
+
+ + + + + + + + + + +
+ + + + +
+ +

+              
+
+
+ + 목록보기 + +
+ + IPO 공모주 정보, 공모가, 공모주식수, 공모청약일정등은 유가증권신고서 수리(금감위)과정에서 + 변경될 수 있습니다. + +
+

+

+ + + + +
+
+
+ + + + +
+
+
+ + + + + +
+ +
+
+
+ + + +
+

+ + 대한조선 IPO공모,대한조선 공모일정,대한조선 공모주,대한조선 상장,대한조선 청약일정,대한조선 공모가,대한조선 청약경쟁률,대한조선 공모주식수,대한조선 확정공모가,대한조선 공모금액,대한조선 공모분석,대한조선 공모청약,공모주분석,공모주청약일정,공모청약일정 + +

+
+ + + +
+ + +
+
+ + ※ IPO공모주 정보, 공모청약일정 등은 증권신고서 수리과정에서 변경될 수 있으며 입력오류도 배제 못하니 본인 책임하에 투자바랍니다 + +
+
+
+
+ + + + + + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + + + +
+ + + + +
+
+ +
+ + + + + +
+ + 아이디,비밀번호찾기 + + + + 무료회원가입 + +
+
+
+ +
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 최근 IPO 청구종목 + + + +
+ + + 06/27 에스팀 + +
+ + + 06/26 삼진식품 + +
+ + + 06/26 삼성스팩11호 + +
+ + + 06/26 KB스팩33호 + +
+ + + 06/24 비엔케이스팩3호 + +
+ + + 06/19 싸이몬 + +
+
+ +
+
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + 최근 IPO 승인종목 + + + +
+ + + 06/27 삼성스팩10호 + +
+ + + 06/24 에스투더블유 + +
+ + + 06/24 하나스팩35호 + +
+ + + 06/24 한라캐스트 + +
+ + + 06/23 대한조선 + +
+ + + 06/19 제이피아이헬스케 + +
+
+ +
+
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + IPO 공모주 청약일정 + + + +
+ + + 07/03 아우토크립트 + +
+ + + 07/14 도우인시스 + +
+ + + 07/15 뉴로핏 + +
+ + + 07/15 삼양컴텍 + +
+ + + 07/17 엔알비 + +
+ + + 07/18 프로티나 + +
+
+ +
+
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ + + + IPO 신규상장 일정 + + + +
+ + + 07/04 뉴엔에이아이(구. + +
+ + + 07/04 KB스팩32호 + +
+ + + 07/07 싸이닉솔루션 + +
+ + + 07/10 대신밸류리츠 + +
+
+ +
+
+
+
+ + + + 공모주 뉴스 + + + + + + +
+ + + + + + + + + + + + + + + + +
+
+ + + + + 제이피아이헬스케어, 10 + + + +
+ + + + 싸이닉솔루션 공모청약 + + +
+ + + + 그래피, 3D 프린팅 "투 + + +
+ + + + KB스팩32호 공모청약 마 + + +
+
+
+ + + + 공모주 일정 + + + + + + +
+ + + + + + + + + + + + + +
+ + + + 아이티켐, 공모청약 일 + + +
+ + + + 에스투더블유, 공모청약 + + +
+ + + + 제이피아이헬스케어(구. + + +
+ + + + 에스엔시스, 공모청약 + + +
+
+ +
+ + +
+ + +
+ + + + + +
+ + 회사소개 + + + 광고문의 + + + 기업정보문의 + + + 업무제휴문의 + + + 38에바란다 + + + 업무제휴사 + + + 사이트맵 + + + 개인정보취급방침 + + + + 정보제공윤리정책 + + + 투자자유의사항 + + + + +
+ + + + + + +
+ + 38커뮤니케이션 로고 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + Copyrightⓒ + + + 38커뮤니케이션 + + . + + All rights reserved. + + + 삼팔커뮤니케이션,38stock,삼팔,38 + +
+ + 상호 ㈜38커뮤니케이션   대표이사 서성기   사업자등록번호 108-81-21496 + + + 통신판매업 신고번호 제19-1912호 + +
+ + 주소: 서울시 구로구 디지털로 26길 111, 407호 + + + 전화 1644-3830 팩스 02-6124-6333 기사배열 책임자 이용민 + + + + 기사배열 기본방침 + + +
+ + 장외주식시장, 장외주식 시세표, 장외주식매매, 비상장주식 시세표, 비상장매매, 장외주식거래, 장외주식 현재가, 장외주식 기업분석,IPO공모 + +
+ + 본 게시판에 게시된 정보나 의견은 38커뮤니케이션과 아무런 관련이 없으며 게시물의 내용과 관련하여 발생한 법적 책임은 게시자 + +
+ + 또는 이를 열람하는 이용자가 부담해야 하며, 당사에서 제공하는 증권정보와 분석자료 및 주식시세는 단순정보제공을 목적으로 하며 + +
+ + 장외주식 거래를 목적으로 하지 않음. 투자간 매매는 일체 개입하지 않으며 정보 및 거래에 대한 손익책임은 투자자 본인에게 있습니다. + +
+
+
+ + + + diff --git a/scripts/ipo-blog/docs/design.md b/scripts/ipo-blog/docs/design.md new file mode 100644 index 0000000..252b192 --- /dev/null +++ b/scripts/ipo-blog/docs/design.md @@ -0,0 +1,470 @@ +# IPO 블로그 자동화 시스템 설계 문서 + +## 1. 시스템 아키텍처 + +### 1.1 전체 구조 + +```mermaid +graph TB + A[main.py
스크립트 실행] --> B[IPO Scraper
데이터 수집] + B --> B1[네이버 금융
IPO 목록] + B --> B2[38 커뮤니케이션
상세 정보] + B --> B3[뉴스 수집
구글/네이버] + + B1 --> C[MySQL DB
데이터 저장] + B2 --> C + B3 --> C + + C --> D[Data Processor
데이터 처리] + D --> E[ChatGPT API
콘텐츠 생성] + E --> F[Markdown Generator
파일 생성] + F --> G[Plotly
차트 생성] + + G --> H[output/
최종 결과물] + F --> H + + style A fill:#f9f,stroke:#333,stroke-width:2px + style E fill:#bbf,stroke:#333,stroke-width:2px + style H fill:#bfb,stroke:#333,stroke-width:2px +``` + + +위 다이어그램은 전체 시스템의 데이터 흐름을 보여줍니다. + +### 1.2 주요 컴포넌트 +- **IPO Scraper**: 웹 스크래핑을 통한 데이터 수집 +- **MySQL Database**: 수집된 데이터 및 포스팅 이력 저장 +- **Data Processor**: 수집된 데이터 가공 및 검증 +- **ChatGPT Integration**: 블로그 콘텐츠 생성 +- **Markdown Generator**: 최종 블로그 포스팅 생성 +- **Chart Generator**: 재무 데이터 시각화 + +## 2. 데이터베이스 설계 + +### 2.1 ER 다이어그램 + +```mermaid +erDiagram + ipo_info { + int id PK + varchar stock_code UK + varchar company_name + varchar market_type + varchar company_type + varchar industry + text main_products + varchar homepage + varchar major_shareholder + timestamp created_at + timestamp updated_at + } + + financial_info { + int id PK + varchar stock_code FK + int year + decimal revenue + decimal operating_profit + decimal net_profit + decimal total_debt + decimal capital + } + + offering_info { + int id PK + varchar stock_code FK + int desired_price_min + int desired_price_max + int fixed_price + text underwriters + decimal total_competition_rate + decimal institutional_competition_rate + int retail_allocation + int institutional_allocation + date demand_forecast_date + date subscription_date + date payment_date + date refund_date + date listing_date + } + + news_info { + int id PK + varchar stock_code FK + varchar title + varchar url + varchar source + datetime published_date + text summary + varchar sentiment + timestamp created_at + } + + posting_history { + int id PK + varchar stock_code FK + varchar file_path + timestamp created_at + varchar status + } + + ipo_info ||--o{ financial_info : "has" + ipo_info ||--|| offering_info : "has" + ipo_info ||--o{ news_info : "has" + ipo_info ||--o{ posting_history : "has" +``` + +### 2.2 테이블 관계 설명 + +- **ipo_info**: 모든 IPO 정보의 중심 테이블 (마스터) +- **financial_info**: 연도별 재무 정보 (1:N 관계) +- **offering_info**: 공모 상세 정보 (1:1 관계) +- **news_info**: 뉴스 정보 (1:N 관계) +- **posting_history**: 포스팅 생성 이력 (1:N 관계) + +### 2.3 테이블 구조 + +```sql +-- IPO 정보 테이블 +CREATE TABLE ipo_info ( + id INT AUTO_INCREMENT PRIMARY KEY, + stock_code VARCHAR(10) UNIQUE NOT NULL, + company_name VARCHAR(100) NOT NULL, + market_type VARCHAR(20), + company_type VARCHAR(50), + industry VARCHAR(100), + main_products TEXT, + homepage VARCHAR(255), + major_shareholder VARCHAR(100), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); + +-- 재무 정보 테이블 +CREATE TABLE financial_info ( + id INT AUTO_INCREMENT PRIMARY KEY, + stock_code VARCHAR(10) NOT NULL, + year INT NOT NULL, + revenue DECIMAL(15,2), + operating_profit DECIMAL(15,2), + net_profit DECIMAL(15,2), + total_debt DECIMAL(15,2), + capital DECIMAL(15,2), + FOREIGN KEY (stock_code) REFERENCES ipo_info(stock_code), + UNIQUE KEY unique_stock_year (stock_code, year) +); + +-- 공모 정보 테이블 +CREATE TABLE offering_info ( + id INT AUTO_INCREMENT PRIMARY KEY, + stock_code VARCHAR(10) NOT NULL, + desired_price_min INT, + desired_price_max INT, + fixed_price INT, + underwriters TEXT, + total_competition_rate DECIMAL(10,2), + institutional_competition_rate DECIMAL(10,2), + retail_allocation INT, + institutional_allocation INT, + demand_forecast_date DATE, + subscription_date DATE, + payment_date DATE, + refund_date DATE, + listing_date DATE, + FOREIGN KEY (stock_code) REFERENCES ipo_info(stock_code) +); + +-- 뉴스 정보 테이블 +CREATE TABLE news_info ( + id INT AUTO_INCREMENT PRIMARY KEY, + stock_code VARCHAR(10) NOT NULL, + title VARCHAR(500), + url VARCHAR(500), + source VARCHAR(50), + published_date DATETIME, + summary TEXT, + sentiment VARCHAR(20), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (stock_code) REFERENCES ipo_info(stock_code) +); + +-- 포스팅 이력 테이블 +CREATE TABLE posting_history ( + id INT AUTO_INCREMENT PRIMARY KEY, + stock_code VARCHAR(10) NOT NULL, + file_path VARCHAR(500), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + status VARCHAR(20) DEFAULT 'completed', + FOREIGN KEY (stock_code) REFERENCES ipo_info(stock_code) +); +``` + +## 3. 모듈 설계 + +### 3.1 디렉토리 구조 +``` +ipo-blog/ +├── config/ +│ └── config.py # 환경변수 및 설정 관리 +├── db/ # Liquibase 데이터베이스 관리 +│ ├── changelog/ +│ │ ├── db.changelog-master.xml +│ │ ├── changes/ +│ │ │ ├── 001-create-tables.xml +│ │ │ ├── 002-add-indexes.xml +│ │ │ └── 003-insert-initial-data.xml +│ │ └── rollback/ +│ └── liquibase.properties +├── scrapers/ +│ ├── __init__.py +│ ├── base_scraper.py # 기본 스크래퍼 클래스 +│ ├── naver_scraper.py # 네이버 금융 스크래퍼 +│ ├── comm38_scraper.py # 38 커뮤니케이션 스크래퍼 +│ └── news_scraper.py # 뉴스 스크래퍼 +├── database/ +│ ├── __init__.py +│ ├── connection.py # DB 연결 관리 +│ └── models.py # DB 모델 클래스 +├── processors/ +│ ├── __init__.py +│ ├── data_validator.py # 데이터 검증 +│ └── data_processor.py # 데이터 가공 +├── generators/ +│ ├── __init__.py +│ ├── content_generator.py # ChatGPT 콘텐츠 생성 +│ ├── markdown_generator.py # Markdown 생성 +│ └── chart_generator.py # 차트 생성 +├── utils/ +│ ├── __init__.py +│ └── logger.py # 로깅 유틸리티 +├── output/ # 생성된 블로그 포스팅 +├── logs/ # 로그 파일 +├── requirements.txt # 의존성 패키지 +└── main.py # 메인 실행 파일 +``` + +### 3.2 주요 클래스 설계 + +```python +# base_scraper.py +class BaseScraper: + def __init__(self): + self.session = requests.Session() + self.headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' + } + + def get_soup(self, url: str) -> BeautifulSoup: + """URL에서 BeautifulSoup 객체 생성""" + pass + + def respect_robots_txt(self, url: str) -> bool: + """robots.txt 준수 여부 확인""" + pass + +# models.py +class IPOInfo: + def __init__(self, stock_code: str): + self.stock_code = stock_code + self.company_name = None + self.market_type = None + # ... 기타 필드 + + def is_valid_for_posting(self) -> bool: + """포스팅 생성 가능 여부 확인""" + pass + +# content_generator.py +class ContentGenerator: + def __init__(self, api_key: str): + self.client = openai.Client(api_key=api_key) + + def generate_blog_content(self, ipo_data: dict) -> str: + """ChatGPT API를 사용하여 블로그 콘텐츠 생성""" + pass +``` + +## 4. 데이터 흐름 + +### 4.1 데이터 수집 프로세스 +1. **네이버 금융에서 IPO 목록 수집** + - 지정된 증권사 필터링 + - 기본 IPO 정보 추출 + +2. **38 커뮤니케이션에서 상세 정보 수집** + - 기업명으로 검색 + - 재무 정보, 공모 상세 정보 추출 + +3. **뉴스 수집** + - 구글, 네이버에서 최대 4개 뉴스 수집 + - 제목, URL, 요약 저장 + +### 4.2 데이터 처리 프로세스 +1. **데이터 검증** + - 필수 필드 확인 + - 데이터 형식 검증 + - 중복 확인 (종목코드 기준) + +2. **데이터 저장** + - MySQL DB에 저장 + - 트랜잭션 처리로 데이터 일관성 보장 + +3. **콘텐츠 생성** + - 수집된 데이터를 구조화 + - ChatGPT API 호출하여 블로그 콘텐츠 생성 + - 뉴스 감성 분석 + +4. **파일 생성** + - Markdown 파일 생성 + - Plotly로 차트 생성 및 저장 + +## 5. API 설계 + +### 5.1 ChatGPT API 사용 +```python +def create_blog_prompt(ipo_data: dict) -> str: + """블로그 생성을 위한 프롬프트 구성""" + prompt = f""" + 다음 IPO 정보를 바탕으로 블로그 포스팅을 작성해주세요. + + 기업명: {ipo_data['company_name']} + 업종: {ipo_data['industry']} + 주요제품: {ipo_data['main_products']} + + 다음 구조로 작성해주세요: + 1. 기업 소개 (어떤 회사인가? 뭘로 돈을 버는가?) + 2. 경쟁사 분석 + 3. 투자 포인트 + + 톤앤매너: 전문적이면서도 이해하기 쉽게 + """ + return prompt +``` + +### 5.2 환경변수 설정 +```bash +# .env 파일 +MYSQL_HOST=localhost +MYSQL_USER=ipo_user +MYSQL_PASSWORD=password +MYSQL_DATABASE=ipo_blog +OPENAI_API_KEY=your_api_key +``` + +## 6. 에러 처리 + +### 6.1 예외 처리 전략 +- **웹 스크래핑 실패**: 3회 재시도 후 실패 로깅 +- **DB 연결 실패**: 연결 풀 재생성 +- **API 호출 실패**: Rate limit 확인 후 재시도 +- **파일 생성 실패**: 디렉토리 권한 확인 + +### 6.2 로깅 +```python +# 로그 레벨 +- DEBUG: 상세 디버깅 정보 +- INFO: 일반 실행 정보 +- WARNING: 경고 (데이터 누락 등) +- ERROR: 에러 발생 +- CRITICAL: 심각한 에러 +``` + +## 7. 보안 고려사항 + +### 7.1 데이터 보안 +- 환경변수로 민감정보 관리 +- SQL Injection 방지 (Prepared Statement 사용) +- API 키 노출 방지 + +### 7.2 웹 스크래핑 윤리 +- robots.txt 준수 +- 요청 간격 준수 (최소 1초) +- User-Agent 명시 + +## 8. 성능 최적화 + +### 8.1 스크래핑 최적화 +- 동시 요청 제한 (최대 3개) +- 캐싱 활용 +- 불필요한 리소스 다운로드 방지 + +### 8.2 DB 최적화 +- 인덱스 설정 (stock_code) +- 배치 Insert 활용 +- 연결 풀 사용 + +## 9. 테스트 전략 + +### 9.1 단위 테스트 +- 각 스크래퍼 모듈 테스트 +- 데이터 검증 로직 테스트 +- DB 연결 테스트 + +### 9.2 통합 테스트 +- 전체 파이프라인 테스트 +- 에러 시나리오 테스트 + +## 10. 배포 및 운영 + +### 10.1 실행 방법 +```bash +# 의존성 설치 +pip install -r requirements.txt + +# Liquibase로 DB 스키마 생성/업데이트 +cd db +liquibase update + +# 환경변수 설정 +export MYSQL_HOST=localhost +export MYSQL_USER=ipo_user +# ... 기타 환경변수 + +# 실행 +python main.py +``` + +### 10.2 모니터링 +- 로그 파일 확인 +- DB 상태 모니터링 +- 생성된 파일 검증 + +## 11. Liquibase를 통한 데이터베이스 버전 관리 + +### 11.1 Liquibase 설정 +Liquibase를 사용하여 데이터베이스 스키마 변경사항을 버전 관리합니다. + +### 11.2 주요 파일 +- **db.changelog-master.xml**: 마스터 changelog 파일 +- **liquibase.properties**: DB 연결 정보 및 설정 +- **changes/**: 개별 변경사항 파일들 + +### 11.3 사용 명령어 +```bash +# DB 업데이트 +liquibase update + +# 변경사항 미리보기 +liquibase updateSQL + +# 롤백 (태그까지) +liquibase rollback + +# 현재 상태 확인 +liquibase status + +# 히스토리 확인 +liquibase history +``` + +### 11.4 새로운 변경사항 추가 +1. `db/changelog/changes/` 디렉토리에 새 XML 파일 생성 +2. 변경사항 작성 (테이블 생성, 컬럼 추가 등) +3. `db.changelog-master.xml`에 include 추가 +4. `liquibase update` 실행 + +### 11.5 베스트 프랙티스 +- 각 변경사항은 별도 파일로 관리 +- 의미있는 파일명 사용 (예: 004-add-company-sector-column.xml) +- 롤백 스크립트 항상 포함 +- 프로덕션 적용 전 테스트 환경에서 검증 \ No newline at end of file diff --git a/scripts/ipo-blog/docs/prd.md b/scripts/ipo-blog/docs/prd.md new file mode 100644 index 0000000..f43f068 --- /dev/null +++ b/scripts/ipo-blog/docs/prd.md @@ -0,0 +1,127 @@ +# 공모주 (IPO) 조사 내용 작성 자동화 + +## 목적 + +국내 공모주 IPO 에 대해서 조사한 내용을 블로그 포스팅 형식으로 자동으로 작성한다. + +## 요구사항 + +### 1. 블로그 포스팅이 생성되는 기준 + +- [IPO 목록](https://finance.naver.com/sise/ipo.naver)에서 아래 증권사에 대해서만 생성한다 + - 미래에셋 + - 한국투자 + - 신한투자 + - KB + - NH + - 삼성 +- 최소한으로 아래 정보가 있어야 생성한다 + - 공모금액 + - 기관경쟁률 + +### 2. 블로그에 내용 작성하기 + +- 블로그 내용은 아래 목차를 참고해서 작성한다 + +## 구현 지침 + +### 1. 포스팅 생성 조건 + +- 스크립트를 여러 번 실행해도 중복으로 생성을 하지 않는다 + - 생성한 IPO 블로그에 대해서는 MySQL DB에 저장을 해서 확인한다 + - 중복 체크는 종목코드를 기준으로 한다 + +### 2. 데이터베이스 설계 + +- MySQL을 사용하며, 접속 정보는 환경변수로 제공된다 +- 크롤링한 데이터와 생성된 포스팅 정보를 저장한다 +- DB 스키마는 구현시 별도로 설계한다 + +### 3. IPO 포스팅 내용 목차 + +### 3.1 작성시 주의사항 + +- 블로그 작성할 내용은 ChatGPT API를 사용해서 작성을 한다 + - 여러 사이트에서 데이터 수집이 완료되면 목차 기준에 맞게 블로그 생성을 위해 ChatGPT API를 1회 호출한다 + +- 작성시 필요한 정보는 아래 링크를 참고한다 + - https://finance.naver.com/sise/ipo.naver + - https://www.38.co.kr/html/fund/index.htm?o=r + - 38 커뮤니케이션 사이트에서 IPO 정보를 검색하려면 기업검색 란에서 기업을 검색하고 검색된 목록에서 회사를 클릭해 들어가야 해당 기업에 대한 정보를 알 수 있다 + +### 3.2 목차 + +- 기업에 대한 조사 + - 어떤 회사인가? 뭘로 돈을 버는가? + - 비슷한 사업을 하는 경쟁사는 뭐가 있나 + - 기업에 대한 뉴스 + - 구글, 네이버에서 최대 4개의 뉴스를 수집한다 + - 각 뉴스에 대해서 3~5줄 정도로 요약해주고 매매에 대한 긍정/부정 적인 내용인지도 알려줘 + - 긍정/부정 판단은 ChatGPT를 사용한다 +- 공모주 기본 정보 + - 아래 정보들은 테이블 형식으로 작성한다 + - 기업 개요 + - 종목명: ex. 위너스 + - 종목코드 + - 시장구분: ex. 코스닥 + - 기업구분: ex. 중소일반 + - 업종 + - 주요제품 + - 홈페이지 + - 최대주주 + - 매출액 + - 순이익 + - 자본금 + - 공모 정보 + - 희망공모가 + - 확정 공모가 + - 청약증권사 + - 수요예측결과 + - 통합경재률 + - 기관경쟁률 + - 배정주식수 + - 일반청약자 + - 기관투자자 + - 청약 일정 + - 주요일정 + - 수요예측일 + - 공모청약일 + - 납입일 + - 환불일 + - 상장일 +- 기업 분석 내용 + - 재무현황 + - 아래 내용은 참고할 수 있는 사이트에서 데이터를 수집해서 그래프로 그려준다 + - 매출액, 영업이익, 당기순이익 + - 재무 데이터가 부족한 경우에는 그래프 대신 테이블 형태로만 작성한다 + - 부채 관련 데이터도 수집해서 그래프로 그려준다 + +### 4. 스크립트 작성 + +- 스크립트는 python으로 작성한다 + - 웹 사이트에서 데이터를 추출해야 해서 BeautifulSoup library를 사용한다 + - 여러 번 스크래핑시 차단되지 않도록 다음 사항을 준수한다: + - User-Agent 설정 + - Request 간 적절한 간격 유지 + - robots.txt 준수 + +- 결과는 Markdown 형식의 파일을 생성한다 + - 파일 경로: `output/종목코드-종목명/index.md` + +- 그래프는 plotly library를 사용해서 생성한다 + - 이미지 저장 경로는 markdown 파일과 같은 위치에 저장한다 + +- 블로그 생성이나 기업에 대한 조사는 ChatGPT API를 사용한다 + - 필요한 API 키는 환경 변수를 사용한다 + +### 5. 데이터 불완전성 처리 + +- 공개되지 않은 정보의 경우: + - 다른 값이 있으면 그 값을 사용한다 + - 없으면 "Unknown"으로 명시한다 +- 일부 정보만 있을 때에도 포스팅을 생성한다 + +### 6. 실행 방식 + +- 수동으로 스크립트를 실행한다 + \ No newline at end of file diff --git a/scripts/ipo-blog/docs/todo.md b/scripts/ipo-blog/docs/todo.md new file mode 100644 index 0000000..ca2d583 --- /dev/null +++ b/scripts/ipo-blog/docs/todo.md @@ -0,0 +1,170 @@ +# IPO 블로그 자동화 시스템 TODO List + +## 1. 프로젝트 초기 설정 +- [x] Python 가상환경 생성 및 활성화 +- [x] requirements.txt 파일 작성 + - [x] BeautifulSoup4 + - [x] requests + - [x] mysql-connector-python + - [x] openai + - [x] plotly + - [x] python-dotenv + - [x] pandas + - [x] lxml +- [x] .env 파일 생성 및 환경변수 설정 (OS 환경변수 사용) + - [x] IPO_MYSQL_* 환경변수 + - [x] OPENAI_API_KEY +- [x] .gitignore 파일 생성 + +## 2. 기본 모듈 구조 생성 +- [x] 디렉토리 구조 생성 + ``` + ├── config/ + ├── scrapers/ + ├── database/ + ├── processors/ + ├── generators/ + ├── utils/ + ├── output/ + └── logs/ + ``` +- [x] 각 모듈의 __init__.py 파일 생성 + +## 3. 유틸리티 모듈 (utils/) +- [x] ~~logger.py 작성~~ (main.py에 통합되어 별도 모듈 불필요) + - [x] 로깅 레벨 설정 + - [x] 파일 및 콘솔 출력 설정 + +## 4. 웹 스크래핑 모듈 (scrapers/) +- [x] base_scraper.py 작성 + - [x] BaseScraper 클래스 구현 + - [x] User-Agent 설정 + - [x] robots.txt 준수 로직 + - [x] 요청 간격 제어 (최소 1초) + - [x] 재시도 로직 (3회) + +- [x] naver_scraper.py 작성 + - [x] IPO 목록 수집 기능 + - [x] 증권사 필터링 로직 + - [x] 기본 IPO 정보 추출 + - [x] 종목명, 종목코드 + - [x] 시장구분, 기업구분 + - [x] 공모금액, 기관경쟁률 + +- [ ] comm38_scraper.py 작성 + - [ ] 기업 검색 기능 + - [ ] 상세 정보 수집 + - [ ] 재무 정보 + - [ ] 공모 상세 정보 + - [ ] 청약 일정 + +- [ ] news_scraper.py 작성 + - [ ] 구글 뉴스 검색 + - [ ] 네이버 뉴스 검색 + - [ ] 최대 4개 뉴스 수집 + - [ ] 뉴스 메타데이터 추출 + +## 5. 데이터 처리 모듈 (processors/) +- [ ] data_validator.py 작성 + - [ ] 필수 데이터 검증 (공모금액, 기관경쟁률) + - [ ] 데이터 형식 검증 + - [ ] 중복 체크 (종목코드 기준) + +- [ ] data_processor.py 작성 + - [ ] 수집된 데이터 정제 + - [ ] 누락 데이터 처리 ("Unknown") + - [ ] 데이터 구조화 + +## 6. 설정 관리 모듈 (config/) +- [ ] config.py 작성 + - [ ] 환경변수 로드 + - [ ] 데이터베이스 설정 + - [ ] API 키 관리 + - [ ] 증권사 리스트 정의 (미래에셋, 한국투자, 신한투자, KB, NH, 삼성) + +## 7. 데이터베이스 모듈 (database/) +- [x] DB 스키마 설계 (Liquibase SQL 방식) +- [ ] MySQL JDBC 드라이버 설치 +- [ ] Liquibase 실행하여 DB 스키마 생성 + ```bash + cd db + liquibase update + ``` +- [ ] DB 연결 테스트 +- [ ] connection.py 작성 + - [ ] MySQL 연결 풀 구현 + - [ ] 연결 관리 함수 +- [ ] models.py 작성 + - [ ] IPOInfo 클래스 + - [ ] FinancialInfo 클래스 + - [ ] OfferingInfo 클래스 + - [ ] NewsInfo 클래스 + - [ ] PostingHistory 클래스 + - [ ] CRUD 메서드 구현 + +## 8. 콘텐츠 생성 모듈 (generators/) +- [ ] content_generator.py 작성 + - [ ] ChatGPT API 클라이언트 설정 + - [ ] 프롬프트 템플릿 작성 + - [ ] 블로그 콘텐츠 생성 함수 + - [ ] 뉴스 요약 및 감성 분석 + +- [ ] markdown_generator.py 작성 + - [ ] Markdown 템플릿 작성 + - [ ] 테이블 포맷팅 + - [ ] 파일 저장 로직 + - [ ] 디렉토리 생성 (output/종목코드-종목명/) + +- [ ] chart_generator.py 작성 + - [ ] Plotly 차트 생성 + - [ ] 재무 데이터 차트 (매출액, 영업이익, 당기순이익) + - [ ] 부채 관련 차트 + - [ ] 차트 이미지 저장 + - [ ] 데이터 부족시 테이블 생성 + +## 9. 메인 실행 파일 +- [x] main.py 작성 + - [x] 전체 파이프라인 조율 + - [x] 에러 핸들링 + - [x] 실행 플로우: + 1. 설정 로드 + 2. DB 연결 + 3. IPO 목록 수집 + 4. 증권사 필터링 + 5. 각 IPO별 상세 정보 수집 + 6. 중복 체크 + 7. 뉴스 수집 + 8. 데이터 검증 및 저장 + 9. 블로그 콘텐츠 생성 + 10. 파일 및 차트 생성 + 11. 포스팅 이력 저장 + +## 10. 테스트 +- [ ] 단위 테스트 작성 + - [x] 스크래퍼 테스트 (test_naver_scraper.py) + - [ ] 데이터 처리 테스트 + - [ ] 콘텐츠 생성 테스트 + - [ ] DB 연결 테스트 +- [ ] 통합 테스트 + - [ ] 전체 파이프라인 테스트 + - [ ] 에러 시나리오 테스트 + +## 11. 문서화 및 배포 +- [ ] README.md 작성 + - [ ] 설치 가이드 + - [ ] 실행 방법 + - [ ] 환경변수 설명 +- [ ] 예제 실행 및 결과 확인 +- [ ] 최종 테스트 + +## 작업 우선순위 (업데이트됨) +1. **1단계**: 웹 스크래핑 모듈 완성 (comm38_scraper.py, news_scraper.py) +2. **2단계**: 데이터 처리 모듈 (data_validator.py, data_processor.py) +3. **3단계**: 설정 관리 모듈 (config.py) +4. **4단계**: 데이터베이스 모듈 (나중에) +5. **5단계**: 콘텐츠 생성 모듈 (generators) +6. **6단계**: 테스트, 문서화 + +## 예상 소요 시간 +- 전체 개발: 약 3-5일 +- 테스트 및 디버깅: 약 1-2일 \ No newline at end of file diff --git a/scripts/ipo-blog/generators/__init__.py b/scripts/ipo-blog/generators/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/ipo-blog/ipo_list_page.html b/scripts/ipo-blog/ipo_list_page.html new file mode 100644 index 0000000..f0e4947 --- /dev/null +++ b/scripts/ipo-blog/ipo_list_page.html @@ -0,0 +1,2535 @@ + + + + + 공모주일정 - 수요예측일정, 공모주청약, 공모주분석, 기업공개, 상장, 공모일정, 공모주청약일정, 공모가, 공모주일정, 주식수, 공모주, 공모청약 - 비상장주식거래, 장외주식시장 NO.1 38커뮤니케이션 + + + + + + + + + + + + + + + + + + + + + + +
+ + 38커뮤니케이션 로고 + + +
+ + + + + + +
+ + + + +
+ + + + + +
+
+ +
+
+ + + + + + + +
+ + + + + +
+ + 실시간 인기주동 + + +
+
+ + + + + +
+ 비상장 + + . + +
+ + + + + +
+ K-OTC + + . + +
+ + + + + +
+ 코넥스 + + . + +
+
+ +
+
+
+ +
+ + + + + + + + +
+ 장외시장 NO.1 독점적 점유율 기록 +
+ + 빨간색매매 + + + 매도매수 + + + 팝니다 + + + + 장외시세 + +
+
+ + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + 비상장매매 + + + + 시세정보 + + + + 비상장(장외) + + + + IPO공모 + + + + IPO예정분석 + + + + 기업정보 + + + + 주주동호회 + + + + K-OTC + + + + 코넥스 + + + + 코스닥/거래소 + + + 전체 메뉴보기 + + + 38머니충전 + + +
+
+ +
+ + + + + + +
+
+ + + + + + + +
+ + + + + + + +
+ + + + + +
+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + IPO뉴스 더보기 + +
+
+ + + [공모뉴스] + + + [06/26] + + + 싸이닉솔루션 공모청약 마감날 청약경쟁률 + +
+ + + [공모뉴스] + + + [06/25] + + + 그래피, 3D 프린팅 "투명 치아 교정장치" + +
+ + + [공모뉴스] + + + [06/25] + + + KB스팩32호 공모청약 마감날 청약경쟁률 + +
+
+ + + + + + + + +
+ + IPO일정 더보기 + +
+ + + + + + + + + + + + + +
+
+ + + [공모주일정] + + + + 아이티켐, 공모청약 일정 변경 + + + new +
+ + + [공모주일정] + + + + 에스투더블유, 공모청약 일정 + + +
+ + + [공모주일정] + + + + 제이피아이헬스케어(구.정원정밀공업), 공 + + +
+
+ +
+
+ +
+
+ + + + + +
+ + + Home + + IPO심사/공모 + + 수요예측일정 +
+
+
+
+ + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
+ + 전체종목 + + + 청구종목 + + + 승인종목 + + + 기업IR일정 + + + 수요예측일정 + + + 수요예측결과 + + + 공모청약일정 + + + 신규상장 + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 종목명 + + + 수요예측일 + + + 희망공모가(원) + + 확정공모가 + + 공모금액(백만) + + 주간사 +
+
+ + 에스엔시스 + + + 2025.07.28~08.01 + + 27,000~30,000 + + - + + 51,300 + + 신한투자증권 +
+ + 교보스팩18호 + + + 2025.07.28~07.29 + + 2,000~2,000 + + - + + 9,000 + + 교보증권 +
+ + 그래피 + + + 2025.07.24~07.30 + + 17,000~20,000 + + - + + 33,150 + + KB증권,신한투자증권 +
+ + 제이피아이헬스케어(구.정원정밀공업) + + + 2025.07.24~07.30 + + 16,500~20,000 + + - + + 26,070 + + 키움증권 +
+ + 하나스팩35호 + + + 2025.07.21~07.22 + + 2,000~2,000 + + - + + 11,000 + + 하나증권 +
+ + 아이티켐 + + + 2025.07.17~07.23 + + 14,500~16,100 + + - + + 29,000 + + KB증권 +
+ + 지투지바이오 + + + 2025.07.15~07.21 + + 48,000~58,000 + + - + + 43,200 + + 미래에셋증권 +
+ + 에스투더블유 + + + 2025.07.15~07.21 + + 11,400~13,200 + + - + + 18,012 + + 대신증권 +
+ + 대한조선 + + (유가) + + + + 2025.07.11~07.17 + + 42,000~50,000 + + - + + 420,000 + + KB증권,NH투자증권,신영증권 +
+ + 엔알비 + + + 2025.07.08~07.14 + + 18,000~21,000 + + - + + 37,800 + + NH투자증권,KB증권 +
+ + 프로티나 + + + 2025.07.08~07.14 + + 11,000~14,000 + + - + + - + + 한국투자증권 +
+ + 디비금융스팩14호 + + + 2025.07.07~07.08 + + 2,000~2,000 + + - + + 10,000 + + DB증권 +
+ + 뉴로핏 + + + 2025.07.04~07.10 + + 11,400~14,000 + + - + + 22,800 + + 미래에셋증권 +
+ + 삼양컴텍 + + + 2025.07.04~07.10 + + 6,600~7,700 + + - + + 95,700 + + 신한투자증권,NH투자증권 +
+ + 도우인시스 + + + 2025.07.03~07.09 + + 29,000~32,000 + + - + + 40,600 + + 키움증권 +
+ + LS스팩1호 + + + 2025.07.03~07.04 + + 2,000~2,000 + + - + + 8,000 + +
+ + 아우토크립트 + + + 2025.06.24~06.30 + + 18,700~22,000 + + - + + - + + 대신증권 +
+ + KB스팩32호 + + + 2025.06.18~06.19 + + 2,000~2,000 + + 2,000 + + 12,000 + + KB증권 +
+ + 싸이닉솔루션 + + + 2025.06.16~06.20 + + 4,000~4,700 + + 4,700 + + 16,450 + + 대신증권 +
+ + 뉴엔에이아이(구.알에스엔) + + + 2025.06.12~06.18 + + 13,000~15,000 + + 15,000 + + 33,300 + + NH투자증권,신한투자증권 +
+
+
+ +
+ +
+

+ + IPO공모, 공모일정, 상장, 공모주청약일정, 공모가, 청약경쟁률,주식수,확정공모가,공모금액,공모분석,기업공개,IPO,청구종목,승인종목,기업IR일정,수요예측일정,수요예측결과,공모청약일정,신규상장 + +

+
+
+ + ※ IPO공모주 정보, 공모청약일정 등은 증권신고서 수리과정에서 변경될 수 있으며 입력오류도 배제 못하니 본인 책임하에 투자바랍니다 + +
+
+
+
+ + + + + + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + + + +
+ + + + +
+
+ +
+ + + + + +
+ + 아이디,비밀번호찾기 + + + + 무료회원가입 + +
+
+
+ +
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 최근 IPO 청구종목 + + + +
+ + + 06/27 에스팀 + +
+ + + 06/26 삼진식품 + +
+ + + 06/26 삼성스팩11호 + +
+ + + 06/26 KB스팩33호 + +
+ + + 06/24 비엔케이스팩3호 + +
+ + + 06/19 싸이몬 + +
+
+ +
+
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + 최근 IPO 승인종목 + + + +
+ + + 06/27 삼성스팩10호 + +
+ + + 06/24 에스투더블유 + +
+ + + 06/24 하나스팩35호 + +
+ + + 06/24 한라캐스트 + +
+ + + 06/23 대한조선 + +
+ + + 06/19 제이피아이헬스케 + +
+
+ +
+
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + IPO 공모주 청약일정 + + + +
+ + + 07/03 아우토크립트 + +
+ + + 07/14 도우인시스 + +
+ + + 07/15 뉴로핏 + +
+ + + 07/15 삼양컴텍 + +
+ + + 07/17 엔알비 + +
+ + + 07/18 프로티나 + +
+
+ +
+
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ + + + IPO 신규상장 일정 + + + +
+ + + 07/04 뉴엔에이아이(구. + +
+ + + 07/04 KB스팩32호 + +
+ + + 07/07 싸이닉솔루션 + +
+ + + 07/10 대신밸류리츠 + +
+
+ +
+
+
+ +
+ + +
+ + +
+ + + + + +
+ + 회사소개 + + + 광고문의 + + + 기업정보문의 + + + 업무제휴문의 + + + 38에바란다 + + + 업무제휴사 + + + 사이트맵 + + + 개인정보취급방침 + + + + 정보제공윤리정책 + + + 투자자유의사항 + + + + +
+ + + + + + +
+ + 38커뮤니케이션 로고 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + Copyrightⓒ + + + 38커뮤니케이션 + + . + + All rights reserved. + + + 삼팔커뮤니케이션,38stock,삼팔,38 + +
+ + 상호 ㈜38커뮤니케이션   대표이사 서성기   사업자등록번호 108-81-21496 + + + 통신판매업 신고번호 제19-1912호 + +
+ + 주소: 서울시 구로구 디지털로 26길 111, 407호 + + + 전화 1644-3830 팩스 02-6124-6333 기사배열 책임자 이용민 + + + + 기사배열 기본방침 + + +
+ + 장외주식시장, 장외주식 시세표, 장외주식매매, 비상장주식 시세표, 비상장매매, 장외주식거래, 장외주식 현재가, 장외주식 기업분석,IPO공모 + +
+ + 본 게시판에 게시된 정보나 의견은 38커뮤니케이션과 아무런 관련이 없으며 게시물의 내용과 관련하여 발생한 법적 책임은 게시자 + +
+ + 또는 이를 열람하는 이용자가 부담해야 하며, 당사에서 제공하는 증권정보와 분석자료 및 주식시세는 단순정보제공을 목적으로 하며 + +
+ + 장외주식 거래를 목적으로 하지 않음. 투자간 매매는 일체 개입하지 않으며 정보 및 거래에 대한 손익책임은 투자자 본인에게 있습니다. + +
+
+
+ + + + diff --git a/scripts/ipo-blog/ipo_page.html b/scripts/ipo-blog/ipo_page.html new file mode 100644 index 0000000..943b169 --- /dev/null +++ b/scripts/ipo-blog/ipo_page.html @@ -0,0 +1,7745 @@ + + + + + + IPO : 네이버페이 증권 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ +
+ + + + +

+ IPO(기업공개) +

+ +
+
+

+ 기업이 최초로 외부투자자에게 주식을 공개하는 것으로 한국거래소에 공식상장하는 것을 말합니다. +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ IPO(기업공개) 종목 정보 +
+ 종목 + + 투자정보 +
+
+

+ + 코스닥 + + + 지에프씨생명과학 + +

+
    +
  • + + 공모가 + + + 15,300 + +
  • +
  • + + 업종 + + 기타 화학제품 제조업 +
  • +
  • + + 주관사 + + 대신증권 +
  • +
  • + + 개인청약경쟁률 + + + 2,161.33:1 + +
  • +
  • + + 개인청약 + + + 25.06.19~06.20 + +
  • +
  • + + 상장일 + + + 25.06.30 + +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + KB제32호스팩 + +

+
    +
  • + + 공모가 + + + 2,000 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + KB증권 +
  • +
  • + + 개인청약경쟁률 + + + 326.27:1 + +
  • +
  • + + 개인청약 + + + 25.06.24~06.25 + +
  • +
  • + + 상장일 + + + 25.07.04 + +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 뉴엔에이아이 + +

+
    +
  • + + 공모가 + + + 15,000 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + NH투자증권, 신한투자증권 +
  • +
  • + + 개인청약경쟁률 + + + 1,468.79:1 + +
  • +
  • + + 개인청약 + + + 25.06.23~06.24 + +
  • +
  • + + 상장일 + + + 25.07.04 + +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 싸이닉솔루션 + +

+
    +
  • + + 공모가 + + + 4,700 + +
  • +
  • + + 업종 + + 반도체 제조업 +
  • +
  • + + 주관사 + + 대신증권 +
  • +
  • + + 개인청약경쟁률 + + + 2,148.34:1 + +
  • +
  • + + 개인청약 + + + 25.06.25~06.26 + +
  • +
  • + + 상장일 + + + 25.07.07 + +
  • +
+
+
+ +
+
+

+ + 코스피 + + + 대신밸류리츠위탁관리부동산투자회사 + +

+
    +
  • + + 공모가 + + + 5,000 + +
  • +
  • + + 업종 + + 부동산 임대 및 공급업 +
  • +
  • + + 주관사 + + 한국투자증권, 대신증권, 삼성증권 +
  • +
  • + + 개인청약경쟁률 + + + 3.19:1 + +
  • +
  • + + 개인청약 + + + 25.06.23~06.24 + +
  • +
  • + + 상장일 + + + 25.07.10 + +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 아우토크립트 + +

+
    +
  • + + 공모가 + + + 18,700~22,000 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + 대신증권 +
  • +
  • + + 진행상태 + + 수요예측 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.03~07.04 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 엘에스스팩1호 + +

+
    +
  • + + 공모가 + + + 2,000 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + 엘에스증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.08~07.09 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 디비금융제14호스팩 + +

+
    +
  • + + 공모가 + + + 2,000 + +
  • +
  • + + 업종 + + 기타 금융업 +
  • +
  • + + 주관사 + + DB증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.10~07.11 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 아이티켐 + +

+
    +
  • + + 공모가 + + + 14,500~16,100 + +
  • +
  • + + 업종 + + 기타 화학제품 제조업 +
  • +
  • + + 주관사 + + KB증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.10~07.11 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 도우인시스 + +

+
    +
  • + + 공모가 + + + 29,000~32,000 + +
  • +
  • + + 업종 + + 전자부품 제조업 +
  • +
  • + + 주관사 + + 키움증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.14~07.15 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 뉴로핏 + +

+
    +
  • + + 공모가 + + + 11,400~14,000 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + 미래에셋증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.15~07.16 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 삼양컴텍 + +

+
    +
  • + + 공모가 + + + 6,600~7,700 + +
  • +
  • + + 업종 + + 무기 및 총포탄 제조업 +
  • +
  • + + 주관사 + + 신한투자증권, NH투자증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.15~07.16 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 엔알비 + +

+
    +
  • + + 공모가 + + + 18,000~21,000 + +
  • +
  • + + 업종 + + 기타 금속 가공제품 제조업 +
  • +
  • + + 주관사 + + NH투자증권, KB증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.17~07.18 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 프로티나 + +

+
    +
  • + + 공모가 + + + 11,000~14,000 + +
  • +
  • + + 업종 + + 자연과학 및 공학 연구개발업 +
  • +
  • + + 주관사 + + 한국투자증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.18~07.21 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스피 + + + 대한조선 + +

+
    +
  • + + 공모가 + + + 42,000~50,000 + +
  • +
  • + + 업종 + + 선박 및 보트 건조업 +
  • +
  • + + 주관사 + + NH투자증권, KB증권, 신영증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.22~07.23 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 에스투더블유 + +

+
    +
  • + + 공모가 + + + 11,400~13,200 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + 대신증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.24~07.25 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 지투지바이오 + +

+
    +
  • + + 공모가 + + + 48,000~58,000 + +
  • +
  • + + 업종 + + 의약품 제조업 +
  • +
  • + + 주관사 + + 미래에셋증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.24~07.25 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 하나35호스팩 + +

+
    +
  • + + 공모가 + + + 2,000 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + 하나증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.25~07.28 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 제이피아이헬스케어 + +

+
    +
  • + + 공모가 + + + 16,500~20,000 + +
  • +
  • + + 업종 + + 의료용 기기 제조업 +
  • +
  • + + 주관사 + + 키움증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.08.04~08.05 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 교보18호스팩 + +

+
    +
  • + + 공모가 + + + 2,000 + +
  • +
  • + + 업종 + + 기타 금융업 +
  • +
  • + + 주관사 + + 교보증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.08.05~08.06 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 그래피 + +

+
    +
  • + + 공모가 + + + 17,000~20,000 + +
  • +
  • + + 업종 + + 합성고무 및 플라스틱 물질 제조업 +
  • +
  • + + 주관사 + + KB증권, 신한투자증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.08.05~08.06 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 에스엔시스 + +

+
    +
  • + + 공모가 + + + 27,000~30,000 + +
  • +
  • + + 업종 + + 전동기, 발전기 및 전기 변환 · 공급 · 제어 장치 제조업 +
  • +
  • + + 주관사 + + 신한투자증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.08.07~08.08 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 한라캐스트 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 자동차 신품 부품 제조업 +
  • +
  • + + 주관사 + + 대신증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + KB제33호스팩 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + KB증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 노타 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + 미래에셋증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 닷 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 그외 기타 제품 제조업 +
  • +
  • + + 주관사 + + 삼성증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 더핑크퐁컴퍼니 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 영화, 비디오물, 방송프로그램 제작 및 배급업 +
  • +
  • + + 주관사 + + 미래에셋증권, 삼성증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 레메디 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 의료용 기기 제조업 +
  • +
  • + + 주관사 + + 신한투자증권, KB증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 리브스메드 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 의료용 기기 제조업 +
  • +
  • + + 주관사 + + 미래에셋증권, 삼성증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스피 + + + 명인제약 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 의약품 제조업 +
  • +
  • + + 주관사 + + KB증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 비엔케이제3호스팩 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 기타 금융업 +
  • +
  • + + 주관사 + + BNK투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 비츠로넥스텍 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 항공기,우주선 및 부품 제조업 +
  • +
  • + + 주관사 + + NH투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 빅텍스 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 특수 목적용 기계 제조업 +
  • +
  • + + 주관사 + + 신한투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 삼성스팩10호 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + 삼성증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 삼성스팩11호 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + 삼성증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 삼진식품 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 동물용 사료 및 조제식품 제조업 +
  • +
  • + + 주관사 + + 대신증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 세나테크놀로지 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 통신 및 방송 장비 제조업 +
  • +
  • + + 주관사 + + 신한투자증권, KB증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 세레신 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 자연과학 및 공학 연구개발업 +
  • +
  • + + 주관사 + + 삼성증권, 하나증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 싸이몬 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 측정, 시험, 항해, 제어 및 기타 정밀기기 제조업; 광학기기 제외 +
  • +
  • + + 주관사 + + 미래에셋증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 아로마티카 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 기타 화학제품 제조업 +
  • +
  • + + 주관사 + + 신한투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 아이나비시스템즈 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + 키움증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 아크릴 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + 신한투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 엔에이치스팩32호 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + NH투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 엘에스이 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 특수 목적용 기계 제조업 +
  • +
  • + + 주관사 + + 미래에셋증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 이노테크 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 특수 목적용 기계 제조업 +
  • +
  • + + 주관사 + + KB증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 이지스 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + NH투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 젠바디 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 의료용품 및 기타 의약 관련제품 제조업 +
  • +
  • + + 주관사 + + 한국투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 큐리오시스 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 사진장비 및 광학기기 제조업 +
  • +
  • + + 주관사 + + 키움증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 키움히어로제1호스팩 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + 키움증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 테라뷰 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 기타 금융업 +
  • +
  • + + 주관사 + + 삼성증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 페스카로 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 그외 기타 전문, 과학 및 기술 서비스업 +
  • +
  • + + 주관사 + + NH투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+ +
+
+ + +
+ + + + diff --git a/scripts/ipo-blog/main.py b/scripts/ipo-blog/main.py new file mode 100755 index 0000000..3ff36bf --- /dev/null +++ b/scripts/ipo-blog/main.py @@ -0,0 +1,260 @@ +#!/usr/bin/env python3 +""" +IPO Blog Automation System - Main Entry Point +""" +import sys +import json +import logging +from datetime import datetime +from pathlib import Path +from typing import List, Dict, Any +import os + +# Add project root to path +project_root = Path(__file__).parent +sys.path.insert(0, str(project_root)) + +from scrapers.naver_scraper import NaverScraper +from scrapers.comm38_scraper import Comm38Scraper + +# Initial logging configuration (console only) +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + handlers=[ + logging.StreamHandler(sys.stdout) + ] +) +logger = logging.getLogger(__name__) + + +class IPOBlogAutomation: + """Main class for IPO blog automation system""" + + def __init__(self): + """IPO 블로그 자동화 시스템 초기화""" + self.base_dir = Path(__file__).parent + self.output_dir = self.base_dir / "output" + self.logs_dir = self.base_dir / "logs" + + # 디렉토리 생성 + self.output_dir.mkdir(exist_ok=True) + self.logs_dir.mkdir(exist_ok=True) + + # 로깅 설정 + self._setup_logging() + + # 스크레이퍼 초기화 + self.naver_scraper = NaverScraper() + self.comm38_scraper = Comm38Scraper() + + logger.info("IPO Blog Automation System initialized") + + def _setup_logging(self): + """로깅 설정 - 날짜와 시간을 포함한 로그 파일 생성""" + # 날짜와 시간을 포함한 로그 파일명 + log_filename = f"ipo_blog_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log" + log_filepath = self.logs_dir / log_filename + + # 기존 로거의 핸들러 가져오기 + root_logger = logging.getLogger() + + # 파일 핸들러 추가 + file_handler = logging.FileHandler(log_filepath, encoding='utf-8') + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) + + # 루트 로거에 파일 핸들러 추가 + root_logger.addHandler(file_handler) + + logger.info(f"Logging to file: {log_filepath}") + + def collect_ipo_data(self) -> List[Dict[str, Any]]: + """ + Collect IPO data from various sources + + Returns: + List of IPO information + """ + logger.info("Starting IPO data collection...") + + # 1. Get IPO list from Naver + ipo_list = self.naver_scraper.get_ipo_list() + logger.info(f"Found {len(ipo_list)} IPOs from target underwriters") + + # 2. Get detailed information for each IPO + enriched_ipos = [] + for idx, ipo in enumerate(ipo_list, 1): + logger.info(f"\nProcessing {idx}/{len(ipo_list)}: {ipo['company_name']} ({ipo['stock_code']})") + logger.info(f" - Market: {ipo.get('market_type', 'N/A')}") + logger.info(f" - Underwriters: {ipo.get('underwriters', 'N/A')}") + logger.info(f" - Status: {ipo.get('status', 'N/A')}") + + # Get detailed info from Naver + detail = self.naver_scraper.get_ipo_detail(ipo['stock_code']) + + # Merge basic and detailed info + if detail: + ipo.update(detail) + logger.info(f" ✓ Collected detailed information from Naver") + if 'industry' in detail: + logger.info(f" - Industry: {detail['industry']}") + if 'homepage' in detail: + logger.info(f" - Homepage: {detail['homepage']}") + else: + logger.warning(f" ⚠ Failed to get detailed information from Naver") + + # Get detailed info from 38 Communications + logger.info(f" → Searching on 38 Communications...") + comm38_detail = self.comm38_scraper.get_ipo_detail(ipo['company_name']) + + if comm38_detail: + # Merge data, prioritizing comm38 for financial data + for key, value in comm38_detail.items(): + if key == 'financial_data' or (key not in ipo and value): + ipo[key] = value + logger.info(f" ✓ Collected detailed information from 38 Communications") + if 'financial_data' in comm38_detail: + logger.info(f" - Financial data collected") + if 'offering_amount' in comm38_detail: + logger.info(f" - Offering amount: {comm38_detail['offering_amount']}") + if 'institutional_competition_rate' in comm38_detail: + logger.info(f" - Institutional competition rate: {comm38_detail['institutional_competition_rate']}") + else: + logger.warning(f" ⚠ Failed to get information from 38 Communications") + + # TODO: Add news scraper when implemented + + enriched_ipos.append(ipo) + + return enriched_ipos + + def save_ipo_data(self, ipo_list: List[Dict[str, Any]]): + """ + Save IPO data to JSON file + + Args: + ipo_list: List of IPO information + """ + timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') + + # Save all IPO data to a single file with timestamp + data_file = self.output_dir / f'ipo_data_{timestamp}.json' + with open(data_file, 'w', encoding='utf-8') as f: + json.dump(ipo_list, f, indent=2, ensure_ascii=False) + logger.info(f"Saved IPO data to {data_file}") + logger.info(f"Total {len(ipo_list)} IPOs saved") + + def generate_summary_report(self, ipo_list: List[Dict[str, Any]]): + """ + Generate a summary report of collected IPOs + + Args: + ipo_list: List of IPO information + """ + timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + report_file = self.output_dir / f'summary_report_{datetime.now().strftime("%Y%m%d")}.md' + + with open(report_file, 'w', encoding='utf-8') as f: + f.write(f"# IPO Summary Report\n\n") + f.write(f"Generated: {timestamp}\n\n") + f.write(f"## Overview\n\n") + f.write(f"Total IPOs found: {len(ipo_list)}\n\n") + + # Calculate statistics + market_stats = {} + status_stats = {} + underwriter_stats = {} + + for ipo in ipo_list: + # Market statistics + market = ipo.get('market_type', 'Unknown') + market_stats[market] = market_stats.get(market, 0) + 1 + + # Status statistics + status = ipo.get('status', 'Unknown') + status_stats[status] = status_stats.get(status, 0) + 1 + + # Underwriter statistics + underwriter = ipo.get('underwriters', 'Unknown') + if underwriter not in underwriter_stats: + underwriter_stats[underwriter] = [] + underwriter_stats[underwriter].append(ipo) + + # Write statistics + f.write("### By Market\n\n") + for market, count in market_stats.items(): + f.write(f"- **{market}**: {count} IPOs\n") + + f.write("\n### By Status\n\n") + for status, count in status_stats.items(): + f.write(f"- **{status}**: {count} IPOs\n") + + f.write("\n### By Underwriter\n\n") + for underwriter, ipos in underwriter_stats.items(): + f.write(f"- **{underwriter}**: {len(ipos)} IPOs\n") + + f.write("\n## IPO List\n\n") + f.write("| Company | Stock Code | Market | Industry | Underwriters | Status | Price | Subscription Date | Listing Date |\n") + f.write("|---------|------------|--------|----------|--------------|--------|-------|-------------------|-------------|\n") + + for ipo in ipo_list: + f.write(f"| {ipo.get('company_name', 'N/A')} ") + f.write(f"| {ipo.get('stock_code', 'N/A')} ") + f.write(f"| {ipo.get('market_type', 'N/A')} ") + f.write(f"| {ipo.get('industry', 'N/A')[:30] + '...' if len(ipo.get('industry', '')) > 30 else ipo.get('industry', 'N/A')} ") + f.write(f"| {ipo.get('underwriters', 'N/A')} ") + f.write(f"| {ipo.get('status', 'N/A')} ") + f.write(f"| {ipo.get('offering_price', 'N/A')} ") + f.write(f"| {ipo.get('subscription_date', 'N/A')} ") + f.write(f"| {ipo.get('listing_date', 'N/A')} |\n") + + logger.info(f"Generated summary report: {report_file}") + + def run(self): + """Main execution flow""" + try: + logger.info("=" * 50) + logger.info("Starting IPO Blog Automation System") + logger.info("=" * 50) + + # Step 1: Collect IPO data + ipo_list = self.collect_ipo_data() + + if not ipo_list: + logger.warning("No IPOs found. Exiting.") + return + + # Step 2: Save collected data + self.save_ipo_data(ipo_list) + + # Step 3: Generate summary report + self.generate_summary_report(ipo_list) + + # TODO: Add data validation when processor module is ready + # TODO: Add content generation when generator module is ready + # TODO: Add chart generation when implemented + # TODO: Add database storage when DB module is ready + + logger.info("=" * 50) + logger.info(f"IPO Blog Automation completed successfully!") + logger.info(f"Processed {len(ipo_list)} IPOs") + logger.info(f"Check output directory for results: {self.output_dir}") + logger.info("=" * 50) + + except KeyboardInterrupt: + logger.info("\nProcess interrupted by user") + sys.exit(0) + except Exception as e: + logger.error(f"Fatal error: {e}", exc_info=True) + sys.exit(1) + + +def main(): + """Main entry point""" + automation = IPOBlogAutomation() + automation.run() + + +if __name__ == "__main__": + main() diff --git a/scripts/ipo-blog/processors/__init__.py b/scripts/ipo-blog/processors/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/ipo-blog/requirements.txt b/scripts/ipo-blog/requirements.txt new file mode 100644 index 0000000..fec700d --- /dev/null +++ b/scripts/ipo-blog/requirements.txt @@ -0,0 +1,26 @@ +# Web Scraping +beautifulsoup4==4.12.3 +requests==2.32.3 +lxml==5.2.2 +urllib3==2.2.2 + +# Database +mysql-connector-python==8.3.0 + +# Data Processing +pandas==2.2.2 +python-dateutil==2.9.0 + +# API and Configuration +openai==1.35.3 +python-dotenv==1.0.1 + +# Visualization +plotly==5.22.0 +kaleido==0.2.1 # For saving plotly charts as images + +# Utilities +typing-extensions==4.12.2 + +# Testing +pytest==8.2.2 \ No newline at end of file diff --git a/scripts/ipo-blog/scrapers/__init__.py b/scripts/ipo-blog/scrapers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/ipo-blog/scrapers/base_scraper.py b/scripts/ipo-blog/scrapers/base_scraper.py new file mode 100644 index 0000000..0e40ee5 --- /dev/null +++ b/scripts/ipo-blog/scrapers/base_scraper.py @@ -0,0 +1,193 @@ +""" +Base scraper class for all web scrapers +""" +import time +import random +import requests +import warnings +from bs4 import BeautifulSoup +from urllib.parse import urlparse, urljoin +from urllib.robotparser import RobotFileParser +from typing import Optional, Dict, Any +import logging +import ssl +from requests.adapters import HTTPAdapter +from urllib3.poolmanager import PoolManager + +# Suppress SSL warnings +from urllib3.exceptions import InsecureRequestWarning +warnings.filterwarnings('ignore', category=InsecureRequestWarning) + +logger = logging.getLogger(__name__) + + +class TLSAdapter(HTTPAdapter): + """Custom adapter to handle old TLS versions""" + + def init_poolmanager(self, *args, **kwargs): + """Initialize pool manager with TLSv1""" + # Create custom SSL context + ctx = ssl.create_default_context() + ctx.check_hostname = False + ctx.verify_mode = ssl.CERT_NONE + # Try to set minimum version to TLSv1 + ctx.minimum_version = ssl.TLSVersion.TLSv1 + ctx.set_ciphers('DEFAULT:@SECLEVEL=1') + + kwargs['ssl_context'] = ctx + return super(TLSAdapter, self).init_poolmanager(*args, **kwargs) + + +class BaseScraper: + """Base class for all web scrapers with common functionality""" + + def __init__(self): + self.session = requests.Session() + self.headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36' + } + self.session.headers.update(self.headers) + + # Mount custom adapter for HTTPS with TLS v1 support + adapter = TLSAdapter() + self.session.mount('https://', adapter) + + self.min_delay = 1.0 # Minimum delay between requests (seconds) + self.max_delay = 3.0 # Maximum delay between requests (seconds) + self.max_retries = 1 # Reduced from 3 to 1 for faster testing + self.last_request_time = 0 + self.robot_parsers: Dict[str, RobotFileParser] = {} + + def _wait_if_needed(self): + """Ensure random delay between requests (1-3 seconds)""" + # Calculate random delay between min and max + delay = random.uniform(self.min_delay, self.max_delay) + + # Check time since last request + elapsed = time.time() - self.last_request_time + if elapsed < delay: + sleep_time = delay - elapsed + logger.debug(f"Sleeping for {sleep_time:.2f} seconds") + time.sleep(sleep_time) + + self.last_request_time = time.time() + + def _get_robot_parser(self, url: str) -> RobotFileParser: + """Get or create robot parser for the domain""" + parsed_url = urlparse(url) + domain = f"{parsed_url.scheme}://{parsed_url.netloc}" + + if domain not in self.robot_parsers: + robot_parser = RobotFileParser() + robot_url = urljoin(domain, '/robots.txt') + robot_parser.set_url(robot_url) + try: + # Try to read robots.txt + robot_parser.read() + self.robot_parsers[domain] = robot_parser + except Exception as e: + logger.warning(f"Failed to read robots.txt from {robot_url}: {e}") + # Create a permissive parser if robots.txt cannot be read + # This allows the scraper to continue even if robots.txt is inaccessible + robot_parser = RobotFileParser() + # Set can_fetch to always return True for this parser + robot_parser.parse("") # Parse empty content to initialize + self.robot_parsers[domain] = robot_parser + + return self.robot_parsers[domain] + + def respect_robots_txt(self, url: str) -> bool: + """Check if URL is allowed by robots.txt""" + try: + robot_parser = self._get_robot_parser(url) + # If the parser has no rules (empty), allow access + if not robot_parser.entries: + return True + return robot_parser.can_fetch(self.headers['User-Agent'], url) + except Exception as e: + logger.warning(f"Error checking robots.txt for {url}: {e}") + # If there's an error, assume it's allowed + return True + + def get_soup(self, url: str, **kwargs) -> Optional[BeautifulSoup]: + """ + Fetch URL and return BeautifulSoup object + + Args: + url: URL to fetch + **kwargs: Additional arguments for requests.get() + + Returns: + BeautifulSoup object or None if failed + """ + # Check robots.txt + if not self.respect_robots_txt(url): + logger.warning(f"URL blocked by robots.txt: {url}") + return None + + # Retry logic + for attempt in range(self.max_retries): + try: + # Wait before request + self._wait_if_needed() + + # Make request + response = self.session.get(url, timeout=10, verify=False, **kwargs) + response.raise_for_status() + + # Parse HTML + soup = BeautifulSoup(response.content, 'lxml') + return soup + + except requests.exceptions.RequestException as e: + logger.warning(f"Request failed (attempt {attempt + 1}/{self.max_retries}): {e}") + if attempt < self.max_retries - 1: + # Exponential backoff + time.sleep(2 ** attempt) + else: + logger.error(f"Failed to fetch {url} after {self.max_retries} attempts") + return None + except Exception as e: + logger.error(f"Unexpected error fetching {url}: {e}") + return None + + def get_json(self, url: str, **kwargs) -> Optional[Dict[str, Any]]: + """ + Fetch URL and return JSON response + + Args: + url: URL to fetch + **kwargs: Additional arguments for requests.get() + + Returns: + JSON response as dictionary or None if failed + """ + # Check robots.txt + if not self.respect_robots_txt(url): + logger.warning(f"URL blocked by robots.txt: {url}") + return None + + # Retry logic + for attempt in range(self.max_retries): + try: + # Wait before request + self._wait_if_needed() + + # Make request + response = self.session.get(url, timeout=10, verify=False, **kwargs) + response.raise_for_status() + + # Parse JSON + return response.json() + + except requests.exceptions.RequestException as e: + logger.warning(f"Request failed (attempt {attempt + 1}/{self.max_retries}): {e}") + if attempt < self.max_retries - 1: + # Exponential backoff + time.sleep(2 ** attempt) + else: + logger.error(f"Failed to fetch {url} after {self.max_retries} attempts") + return None + except Exception as e: + logger.error(f"Unexpected error fetching {url}: {e}") + return None \ No newline at end of file diff --git a/scripts/ipo-blog/scrapers/comm38_scraper.py b/scripts/ipo-blog/scrapers/comm38_scraper.py new file mode 100644 index 0000000..2c857b5 --- /dev/null +++ b/scripts/ipo-blog/scrapers/comm38_scraper.py @@ -0,0 +1,409 @@ +""" +38 Communications IPO detail scraper +""" +from typing import Dict, Optional, Any, List +import re +import logging +from datetime import datetime +from .base_scraper import BaseScraper +from urllib.parse import urljoin, quote +from bs4 import BeautifulSoup + +logger = logging.getLogger(__name__) + + +class Comm38Scraper(BaseScraper): + """Scraper for 38 Communications IPO detailed information""" + + def __init__(self): + super().__init__() + self.base_url = "https://www.38.co.kr" + self.search_url = f"{self.base_url}/html/fund/index.htm" + + def search_company(self, company_name: str) -> Optional[str]: + """ + Search for a company and return its detail page URL + + Args: + company_name: Company name to search for + + Returns: + Company detail page URL or None if not found + """ + logger.info(f"Searching for company: {company_name}") + + # Search using POST request + search_url = f"{self.base_url}/html/fund/index.htm" + + try: + # Prepare form data for search + form_data = { + 'p': 's', + 'o': 'r', + 'string': company_name + } + + # Make POST request + response = self.session.post(search_url, data=form_data, timeout=10, verify=False) + response.encoding = 'euc-kr' # 38 Communications uses EUC-KR encoding + + soup = BeautifulSoup(response.text, 'html.parser') + + # Find all tables with IPO data + tables = soup.find_all('table') + logger.debug(f"Found {len(tables)} tables on search result page") + + # Look for the company in all links on the page + all_links = soup.find_all('a') + logger.debug(f"Found {len(all_links)} links on search result page") + + for link in all_links: + if link.get('href'): + link_text = link.get_text(strip=True) + # Check if this link contains our company name + if company_name in link_text: + href = link['href'] + logger.debug(f"Found potential link: {link_text} -> {href}") + + # Check if this is a fund detail page link (contains o=v parameter and correct path) + if 'o=v' in href and 'no=' in href: + # Build full URL + if href.startswith('./'): + # Remove ./ and append to current directory + href = href[2:] # Remove ./ + detail_url = search_url.rsplit('/', 1)[0] + '/' + href + elif href.startswith('/'): + detail_url = self.base_url + href + elif href.startswith('http'): + detail_url = href + else: + # Relative to current directory + detail_url = search_url.rsplit('/', 1)[0] + '/' + href + + # Only accept URLs with /html/fund/ pattern + if '/html/fund/' in detail_url: + logger.info(f"Found company detail URL: {detail_url}") + return detail_url + else: + logger.debug(f"Skipping non-fund URL: {detail_url}") + + logger.warning(f"Company '{company_name}' not found in search results") + + except Exception as e: + logger.error(f"Error searching for company: {e}") + + return None + + def _parse_table_data(self, table, key_col_idx: int = 0, value_col_idx: int = 1) -> Dict[str, str]: + """ + Parse table data into dictionary + + Args: + table: BeautifulSoup table element + key_col_idx: Index of the key column + value_col_idx: Index of the value column + + Returns: + Dictionary of parsed data + """ + data = {} + if not table: + return data + + for row in table.find_all('tr'): + cells = row.find_all(['td', 'th']) + if len(cells) > max(key_col_idx, value_col_idx): + key = cells[key_col_idx].get_text(strip=True) + value = cells[value_col_idx].get_text(strip=True) + if key and value: + data[key] = value + + return data + + def _parse_financial_table(self, table) -> Dict[str, List[float]]: + """ + Parse financial data table + + Args: + table: BeautifulSoup table element + + Returns: + Dictionary with financial metrics as keys and list of values + """ + financial_data = {} + if not table: + return financial_data + + # Get headers (years) + headers = [] + header_row = table.find('tr') + if header_row: + for th in header_row.find_all(['th', 'td'])[1:]: # Skip first column + headers.append(th.get_text(strip=True)) + + # Get data rows + for row in table.find_all('tr')[1:]: # Skip header row + cells = row.find_all(['td', 'th']) + if len(cells) > 1: + metric_name = cells[0].get_text(strip=True) + values = [] + + for cell in cells[1:]: + value_text = cell.get_text(strip=True) + # Parse number, handling Korean number formats + value = self._parse_korean_number(value_text) + values.append(value) + + if metric_name and values: + financial_data[metric_name] = values + + return financial_data + + def _parse_korean_number(self, text: str) -> Optional[float]: + """ + Parse Korean number format to float + + Args: + text: Number text in Korean format (e.g., "1,234억원", "12.34%") + + Returns: + Parsed float value or None + """ + if not text or text.strip() in ['-', 'N/A', '']: + return None + + try: + # Remove commas + text = text.replace(',', '') + + # Handle complex Korean units (e.g., "1조 2,345억") + total = 0 + + # Process 조 (trillion) + if '조' in text: + parts = text.split('조') + if parts[0].strip(): + jo_match = re.search(r'[-+]?\d*\.?\d+', parts[0]) + if jo_match: + total += float(jo_match.group()) * 1000000000000 + text = parts[1] if len(parts) > 1 else '' + + # Process 억 (hundred million) + if '억' in text: + parts = text.split('억') + if parts[0].strip(): + eok_match = re.search(r'[-+]?\d*\.?\d+', parts[0]) + if eok_match: + total += float(eok_match.group()) * 100000000 + text = parts[1] if len(parts) > 1 else '' + + # Process 만 (ten thousand) + if '만' in text: + parts = text.split('만') + if parts[0].strip(): + man_match = re.search(r'[-+]?\d*\.?\d+', parts[0]) + if man_match: + total += float(man_match.group()) * 10000 + text = parts[1] if len(parts) > 1 else '' + + # Remove currency symbols and percentage signs + text = re.sub(r'[원%]', '', text) + + # If there's still a number left (no units), add it + if total == 0: + number_match = re.search(r'[-+]?\d*\.?\d+', text) + if number_match: + total = float(number_match.group()) + else: + # Add any remaining number + number_match = re.search(r'[-+]?\d*\.?\d+', text) + if number_match: + total += float(number_match.group()) + + return total if total != 0 else None + + except Exception as e: + logger.warning(f"Failed to parse number '{text}': {e}") + + return None + + def get_ipo_detail(self, company_name: str, detail_url: Optional[str] = None) -> Optional[Dict[str, Any]]: + """ + Get detailed IPO information for a company + + Args: + company_name: Company name + detail_url: Direct URL to company detail page (optional) + + Returns: + Dictionary with IPO details or None if failed + """ + # If no detail URL provided, search for the company + if not detail_url: + detail_url = self.search_company(company_name) + if not detail_url: + logger.warning(f"Could not find detail page for {company_name}") + return None + + logger.info(f"Fetching IPO details from: {detail_url}") + + soup = self.get_soup(detail_url) + if not soup: + logger.error(f"Failed to fetch detail page: {detail_url}") + return None + + ipo_detail = { + 'company_name': company_name, + 'source': '38communications', + 'url': detail_url + } + + try: + # Extract company overview + overview_section = soup.find('div', {'class': 'company_info'}) + if not overview_section: + # Try alternative selectors + overview_section = soup.find('div', {'class': 'sub_cont'}) + + if overview_section: + # Extract basic info table + info_table = overview_section.find('table') + if info_table: + basic_info = self._parse_table_data(info_table) + + # Map to standard fields + ipo_detail['industry'] = basic_info.get('업종', '') + ipo_detail['major_products'] = basic_info.get('주요제품', '') + ipo_detail['major_shareholder'] = basic_info.get('최대주주', '') + ipo_detail['capital'] = self._parse_korean_number(basic_info.get('자본금', '')) + ipo_detail['employees'] = self._parse_korean_number(basic_info.get('종업원수', '')) + + # Extract financial data + financial_section = soup.find('div', {'class': 'financial'}) + if not financial_section: + # Look for financial tables by content + for table in soup.find_all('table'): + # Check if this is a financial table + first_cell = table.find(['td', 'th']) + if first_cell and any(keyword in first_cell.get_text() for keyword in ['매출액', '영업이익', '당기순이익']): + financial_section = table.parent + break + + if financial_section: + financial_table = financial_section.find('table') + if financial_table: + financial_data = self._parse_financial_table(financial_table) + ipo_detail['financial_data'] = financial_data + + # Extract offering information + offering_section = soup.find('div', {'class': 'offering'}) + if not offering_section: + # Look for offering info by keywords + for section in soup.find_all(['div', 'table']): + if any(keyword in section.get_text() for keyword in ['공모가', '청약일', '상장일']): + offering_section = section + break + + if offering_section: + offering_table = offering_section if offering_section.name == 'table' else offering_section.find('table') + if offering_table: + offering_info = self._parse_table_data(offering_table) + + # Extract key offering details + ipo_detail['offering_price_range'] = offering_info.get('희망공모가', '') + ipo_detail['final_offering_price'] = self._parse_korean_number(offering_info.get('확정공모가', '')) + ipo_detail['offering_amount'] = self._parse_korean_number(offering_info.get('공모금액', '')) + ipo_detail['offering_shares'] = self._parse_korean_number(offering_info.get('공모주식수', '')) + + # Extract schedule information + schedule_section = soup.find('div', {'class': 'schedule'}) + if not schedule_section: + # Look for schedule table + for table in soup.find_all('table'): + if any(keyword in table.get_text() for keyword in ['수요예측', '청약일', '납입일', '상장일']): + schedule_section = table + break + + if schedule_section: + schedule_table = schedule_section if schedule_section.name == 'table' else schedule_section.find('table') + if schedule_table: + schedule_info = self._parse_table_data(schedule_table) + + # Parse dates + ipo_detail['demand_forecast_date'] = self._parse_date(schedule_info.get('수요예측일', '')) + ipo_detail['subscription_date'] = self._parse_date(schedule_info.get('공모청약일', '')) + ipo_detail['payment_date'] = self._parse_date(schedule_info.get('납입일', '')) + ipo_detail['refund_date'] = self._parse_date(schedule_info.get('환불일', '')) + ipo_detail['listing_date'] = self._parse_date(schedule_info.get('상장일', '')) + + # Extract competition rates + competition_section = soup.find('div', {'class': 'competition'}) + if not competition_section: + # Look for competition info + for section in soup.find_all(['div', 'table']): + if any(keyword in section.get_text() for keyword in ['경쟁률', '기관경쟁률']): + competition_section = section + break + + if competition_section: + competition_table = competition_section if competition_section.name == 'table' else competition_section.find('table') + if competition_table: + competition_info = self._parse_table_data(competition_table) + + ipo_detail['total_competition_rate'] = self._parse_korean_number(competition_info.get('통합경쟁률', '')) + ipo_detail['institutional_competition_rate'] = self._parse_korean_number(competition_info.get('기관경쟁률', '')) + + except Exception as e: + logger.error(f"Error parsing IPO details: {e}") + + return ipo_detail + + def _parse_date(self, date_str: str) -> Optional[str]: + """ + Parse date string to standard format + + Args: + date_str: Date string in various formats + + Returns: + Date in YYYY-MM-DD format or None + """ + if not date_str or date_str.strip() in ['-', 'N/A', '']: + return None + + try: + # Remove extra whitespace + date_str = date_str.strip() + + # Try different date formats + date_formats = [ + '%Y.%m.%d', + '%Y-%m-%d', + '%Y/%m/%d', + '%Y년 %m월 %d일', + '%Y년%m월%d일', + '%m.%d', + '%m/%d', + '%m월 %d일' + ] + + for fmt in date_formats: + try: + parsed_date = datetime.strptime(date_str, fmt) + # If year is missing, use current year + if parsed_date.year == 1900: + parsed_date = parsed_date.replace(year=datetime.now().year) + return parsed_date.strftime('%Y-%m-%d') + except ValueError: + continue + + # If date contains ranges (e.g., "12.20~12.21"), take the first date + if '~' in date_str or '-' in date_str: + date_parts = re.split(r'[~\-]', date_str) + if date_parts: + return self._parse_date(date_parts[0]) + + except Exception as e: + logger.warning(f"Failed to parse date '{date_str}': {e}") + + return date_str # Return original if parsing fails \ No newline at end of file diff --git a/scripts/ipo-blog/scrapers/ipo_page.html b/scripts/ipo-blog/scrapers/ipo_page.html new file mode 100644 index 0000000..c230895 --- /dev/null +++ b/scripts/ipo-blog/scrapers/ipo_page.html @@ -0,0 +1,7413 @@ + + + + + + IPO : 네이버페이 증권 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ +
+ + + + +

+ IPO(기업공개) +

+ +
+
+

+ 기업이 최초로 외부투자자에게 주식을 공개하는 것으로 한국거래소에 공식상장하는 것을 말합니다. +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ IPO(기업공개) 종목 정보 +
+ 종목 + + 투자정보 +
+
+

+ + 코스닥 + + + 지에프씨생명과학 + +

+
    +
  • + + 공모가 + + + 15,300 + +
  • +
  • + + 업종 + + 기타 화학제품 제조업 +
  • +
  • + + 주관사 + + 대신증권 +
  • +
  • + + 개인청약경쟁률 + + + 2,161.33:1 + +
  • +
  • + + 개인청약 + + + 25.06.19~06.20 + +
  • +
  • + + 상장일 + + + 25.06.30 + +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + KB제32호스팩 + +

+
    +
  • + + 공모가 + + + 2,000 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + KB증권 +
  • +
  • + + 개인청약경쟁률 + + + 326.27:1 + +
  • +
  • + + 개인청약 + + + 25.06.24~06.25 + +
  • +
  • + + 상장일 + + + 25.07.04 + +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 뉴엔에이아이 + +

+
    +
  • + + 공모가 + + + 15,000 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + NH투자증권, 신한투자증권 +
  • +
  • + + 개인청약경쟁률 + + + 1,468.79:1 + +
  • +
  • + + 개인청약 + + + 25.06.23~06.24 + +
  • +
  • + + 상장일 + + + 25.07.04 + +
  • +
+
+
+ +
+
+

+ + 코스피 + + + 대신밸류리츠위탁관리부동산투자회사 + +

+
    +
  • + + 공모가 + + + 5,000 + +
  • +
  • + + 업종 + + 부동산 임대 및 공급업 +
  • +
  • + + 주관사 + + 한국투자증권, 대신증권, 삼성증권 +
  • +
  • + + 개인청약경쟁률 + + + 3.19:1 + +
  • +
  • + + 개인청약 + + + 25.06.23~06.24 + +
  • +
  • + + 상장일 + + + 25.07.10 + +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 싸이닉솔루션 + +

+
    +
  • + + 공모가 + + + 4,700 + +
  • +
  • + + 업종 + + 반도체 제조업 +
  • +
  • + + 주관사 + + 대신증권 +
  • +
  • + + 진행상태 + + 공모청약 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.06.25~06.26 + +
  • +
  • + + 상장일 + + + 25.07.07 + +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 아우토크립트 + +

+
    +
  • + + 공모가 + + + 18,700~22,000 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + 대신증권 +
  • +
  • + + 진행상태 + + 수요예측 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.03~07.04 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 엘에스스팩1호 + +

+
    +
  • + + 공모가 + + + 2,000 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + 엘에스증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.08~07.09 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 디비금융제14호스팩 + +

+
    +
  • + + 공모가 + + + 2,000 + +
  • +
  • + + 업종 + + 기타 금융업 +
  • +
  • + + 주관사 + + DB증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.10~07.11 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 아이티켐 + +

+
    +
  • + + 공모가 + + + 14,500~16,100 + +
  • +
  • + + 업종 + + 기타 화학제품 제조업 +
  • +
  • + + 주관사 + + KB증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.10~07.11 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 도우인시스 + +

+
    +
  • + + 공모가 + + + 29,000~32,000 + +
  • +
  • + + 업종 + + 전자부품 제조업 +
  • +
  • + + 주관사 + + 키움증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.14~07.15 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 뉴로핏 + +

+
    +
  • + + 공모가 + + + 11,400~14,000 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + 미래에셋증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.15~07.16 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 삼양컴텍 + +

+
    +
  • + + 공모가 + + + 6,600~7,700 + +
  • +
  • + + 업종 + + 무기 및 총포탄 제조업 +
  • +
  • + + 주관사 + + 신한투자증권, NH투자증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.15~07.16 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 엔알비 + +

+
    +
  • + + 공모가 + + + 18,000~21,000 + +
  • +
  • + + 업종 + + 기타 금속 가공제품 제조업 +
  • +
  • + + 주관사 + + NH투자증권, KB증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.17~07.18 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 프로티나 + +

+
    +
  • + + 공모가 + + + 11,000~14,000 + +
  • +
  • + + 업종 + + 자연과학 및 공학 연구개발업 +
  • +
  • + + 주관사 + + 한국투자증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.18~07.21 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스피 + + + 대한조선 + +

+
    +
  • + + 공모가 + + + 42,000~50,000 + +
  • +
  • + + 업종 + + 선박 및 보트 건조업 +
  • +
  • + + 주관사 + + NH투자증권, KB증권, 신영증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.22~07.23 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 지투지바이오 + +

+
    +
  • + + 공모가 + + + 48,000~58,000 + +
  • +
  • + + 업종 + + 의약품 제조업 +
  • +
  • + + 주관사 + + 미래에셋증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.07.24~07.25 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 그래피 + +

+
    +
  • + + 공모가 + + + 17,000~20,000 + +
  • +
  • + + 업종 + + 합성고무 및 플라스틱 물질 제조업 +
  • +
  • + + 주관사 + + KB증권, 신한투자증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.08.05~08.06 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 에스엔시스 + +

+
    +
  • + + 공모가 + + + 27,000~30,000 + +
  • +
  • + + 업종 + + 전동기, 발전기 및 전기 변환 · 공급 · 제어 장치 제조업 +
  • +
  • + + 주관사 + + 신한투자증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + + 25.08.07~08.08 + +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 교보18호스팩 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 기타 금융업 +
  • +
  • + + 주관사 + + 교보증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 제이피아이헬스케어 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 의료용 기기 제조업 +
  • +
  • + + 주관사 + + 키움증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 하나35호스팩 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + 하나증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 한라캐스트 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 자동차 신품 부품 제조업 +
  • +
  • + + 주관사 + + 대신증권 +
  • +
  • + + 진행상태 + + 심사승인 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 노타 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + 미래에셋증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 닷 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 그외 기타 제품 제조업 +
  • +
  • + + 주관사 + + 삼성증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 더핑크퐁컴퍼니 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 영화, 비디오물, 방송프로그램 제작 및 배급업 +
  • +
  • + + 주관사 + + 미래에셋증권, 삼성증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 레메디 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 의료용 기기 제조업 +
  • +
  • + + 주관사 + + 신한투자증권, KB증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 리브스메드 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 의료용 기기 제조업 +
  • +
  • + + 주관사 + + 미래에셋증권, 삼성증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스피 + + + 명인제약 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 의약품 제조업 +
  • +
  • + + 주관사 + + KB증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 비엔케이제3호스팩 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 기타 금융업 +
  • +
  • + + 주관사 + + BNK투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 비츠로넥스텍 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 항공기,우주선 및 부품 제조업 +
  • +
  • + + 주관사 + + NH투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 빅텍스 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 특수 목적용 기계 제조업 +
  • +
  • + + 주관사 + + 신한투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 삼성스팩10호 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + 삼성증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 세나테크놀로지 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 통신 및 방송 장비 제조업 +
  • +
  • + + 주관사 + + 신한투자증권, KB증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 세레신 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 자연과학 및 공학 연구개발업 +
  • +
  • + + 주관사 + + 삼성증권, 하나증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 싸이몬 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 측정, 시험, 항해, 제어 및 기타 정밀기기 제조업; 광학기기 제외 +
  • +
  • + + 주관사 + + 미래에셋증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 아로마티카 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 기타 화학제품 제조업 +
  • +
  • + + 주관사 + + 신한투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 아이나비시스템즈 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + 키움증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 아크릴 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + 신한투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 에스투더블유 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + 대신증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 엔에이치스팩32호 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + NH투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 엘에스이 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 특수 목적용 기계 제조업 +
  • +
  • + + 주관사 + + 미래에셋증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 이노테크 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 특수 목적용 기계 제조업 +
  • +
  • + + 주관사 + + KB증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 이지스 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 소프트웨어 개발 및 공급업 +
  • +
  • + + 주관사 + + NH투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 젠바디 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 의료용품 및 기타 의약 관련제품 제조업 +
  • +
  • + + 주관사 + + 한국투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 큐리오시스 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 사진장비 및 광학기기 제조업 +
  • +
  • + + 주관사 + + 키움증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 키움히어로제1호스팩 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 금융 지원 서비스업 +
  • +
  • + + 주관사 + + 키움증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+
+
+
+
+

+ + 코스닥 + + + 테라뷰 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 기타 금융업 +
  • +
  • + + 주관사 + + 삼성증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+

+ + 코스닥 + + + 페스카로 + +

+
    +
  • + + 공모가 + + + 미정 + +
  • +
  • + + 업종 + + 그외 기타 전문, 과학 및 기술 서비스업 +
  • +
  • + + 주관사 + + NH투자증권 +
  • +
  • + + 진행상태 + + 예심청구 + +
    +
    +
      + +
    • + + + STEP1 + + + + 예심청구 + + + 한국거래소의 상장을 준비하는 기업이 첨부서류와 상장 예비 심사를 청구하는 것. + +
    • +
    • + + + STEP2 + + + + 심사승인 + + + 상장 예비심사 신청서를 제출한 기업에 대해 상장적격성 심사결과 승인이 인정된 것. + +
    • + +
    • + + + STEP3 + + + + 수요예측 + + + 주식을 공모함에 있어 기관투자자의 수요를 파악하는 것으로 최종 공모가격이 결정됨. + +
    • +
    • + + + STEP4 + + + + 공모청약 + + + 일반인으로부터 공모주식에 대해 청약을 받아 주식을 배정하는 것. + +
    • +
    +
    + + + 닫기 + + +
    +
  • +
  • + + 개인청약 + + 미정 +
  • +
  • + + 상장일 + + 미정 +
  • +
+
+
+ +
+
+ +
+
+ + +
+ + + + diff --git a/scripts/ipo-blog/scrapers/naver_scraper.py b/scripts/ipo-blog/scrapers/naver_scraper.py new file mode 100644 index 0000000..34c5281 --- /dev/null +++ b/scripts/ipo-blog/scrapers/naver_scraper.py @@ -0,0 +1,277 @@ +""" +Naver Finance IPO scraper +""" +from typing import List, Dict, Optional, Any +import re +import logging +from .base_scraper import BaseScraper + +logger = logging.getLogger(__name__) + + +class NaverScraper(BaseScraper): + """Scraper for Naver Finance IPO information""" + + # Target underwriters to filter + TARGET_UNDERWRITERS = [ + '미래에셋', + '한국투자', + '신한투자', + 'KB', + 'NH', + '삼성' + ] + + def __init__(self): + super().__init__() + self.base_url = "https://finance.naver.com" + self.ipo_list_url = f"{self.base_url}/sise/ipo.naver" + + def _parse_number(self, text: str) -> Optional[float]: + """Parse Korean number format to float""" + if not text or text.strip() == '-': + return None + + # Remove commas and convert + try: + # Remove any non-numeric characters except dots and minus + cleaned = re.sub(r'[^\d.-]', '', text) + return float(cleaned) if cleaned else None + except ValueError: + logger.warning(f"Failed to parse number: {text}") + return None + + def _is_target_underwriter(self, underwriters: str) -> bool: + """Check if any of the target underwriters are in the underwriter list""" + if not underwriters: + return False + + for target in self.TARGET_UNDERWRITERS: + if target in underwriters: + return True + return False + + def get_ipo_list(self) -> List[Dict[str, Any]]: + """ + Get IPO list from Naver Finance + + Returns: + List of IPO information dictionaries + """ + logger.info("Fetching IPO list from Naver Finance") + + soup = self.get_soup(self.ipo_list_url) + if not soup: + logger.error("Failed to fetch IPO list page") + return [] + + ipo_list = [] + + # Find all IPO items (new div structure) + ipo_items = soup.find_all('div', {'class': 'item_area'}) + + if not ipo_items: + logger.error("No IPO items found") + return [] + + logger.info(f"Found {len(ipo_items)} total IPO items") + + for item in ipo_items: + try: + # Extract company name and stock code + name_elem = item.find('h4', {'class': 'item_name'}) + if not name_elem: + continue + + link_elem = name_elem.find('a') + if not link_elem: + continue + + company_name = link_elem.text.strip() + href = link_elem.get('href', '') + + # Extract stock code from div id or href + stock_code = item.get('id') # The div has stock code as id + if not stock_code: + stock_code_match = re.search(r'/ipo/([A-Z0-9]+)', href) + stock_code = stock_code_match.group(1) if stock_code_match else None + + if not stock_code: + logger.warning(f"Failed to extract stock code for {company_name}") + continue + + # Extract market type + market_elem = name_elem.find('span', {'class': 'type'}) + market_type = market_elem.text.strip() if market_elem else '' + + # Extract info from list + info_list = item.find('ul', {'class': 'lst_info'}) + if not info_list: + continue + + ipo_info = { + 'company_name': company_name, + 'stock_code': stock_code, + 'market_type': market_type + } + + # Parse all info items + for li in info_list.find_all('li'): + title_elem = li.find('em', {'class': 'tit'}) + if not title_elem: + continue + + title = title_elem.text.strip() + + # Handle special cases for values + if title == '공모가': + # Extract price from span if exists + price_span = li.find('span', {'class': 'num'}) + ipo_info['offering_price'] = price_span.text.strip() if price_span else li.text.replace(title, '').strip() + elif title == '업종': + # Get only direct text content, not from nested elements + value = ''.join([str(x) for x in li.contents if isinstance(x, str)]) + ipo_info['industry'] = value.replace(title, '').strip() + elif title == '주관사': + # Get only direct text content + value = ''.join([str(x) for x in li.contents if isinstance(x, str)]) + ipo_info['underwriters'] = value.replace(title, '').strip() + elif title == '진행상태': + # Extract only the direct text, excluding nested elements like buttons or tooltips + # Find all direct text nodes + texts = [] + for content in li.contents: + if isinstance(content, str): + texts.append(content.strip()) + elif hasattr(content, 'name') and content.name not in ['button', 'div', 'span']: + # Get text from non-button/div/span elements + if hasattr(content, 'string') and content.string: + texts.append(content.string.strip()) + + status_text = ' '.join(texts).replace(title, '').strip() + # Clean up any remaining whitespace + status_text = ' '.join(status_text.split()) + ipo_info['status'] = status_text + elif title == '개인청약': + # Extract date from span if exists + date_span = li.find('span', {'class': 'num'}) + ipo_info['subscription_date'] = date_span.text.strip() if date_span else li.text.replace(title, '').strip() + elif title == '상장일': + value = ''.join([str(x) for x in li.contents if isinstance(x, str)]) + ipo_info['listing_date'] = value.replace(title, '').strip() + + # Set default values for missing fields + ipo_info.setdefault('offering_amount', None) + ipo_info.setdefault('competition_rate', None) + ipo_info.setdefault('underwriters', '') + ipo_info.setdefault('subscription_date', '') + + # Check if has subscription date (not empty, not "미정") + has_subscription_date = ( + ipo_info.get('subscription_date') and + ipo_info['subscription_date'].strip() and + ipo_info['subscription_date'].strip() != '미정' + ) + + # Filter by target underwriters AND subscription date + if self._is_target_underwriter(ipo_info['underwriters']) and has_subscription_date: + logger.info(f"Found IPO with subscription date: {company_name} ({stock_code})") + logger.info(f" - Market: {ipo_info.get('market_type', 'N/A')}") + logger.info(f" - Industry: {ipo_info.get('industry', 'N/A')}") + logger.info(f" - Underwriters: {ipo_info['underwriters']}") + logger.info(f" - Status: {ipo_info.get('status', 'N/A')}") + logger.info(f" - Offering Price: {ipo_info.get('offering_price', 'N/A')}") + logger.info(f" - Subscription Date: {ipo_info.get('subscription_date', 'N/A')}") + logger.info(f" - Listing Date: {ipo_info.get('listing_date', 'N/A')}") + ipo_list.append(ipo_info) + else: + if not self._is_target_underwriter(ipo_info['underwriters']): + logger.debug(f"Skipping IPO: {company_name} - Wrong underwriters: {ipo_info['underwriters']}") + elif not has_subscription_date: + logger.debug(f"Skipping IPO: {company_name} - No subscription date: {ipo_info.get('subscription_date', 'N/A')}") + + except Exception as e: + logger.error(f"Error parsing IPO item: {e}") + continue + + logger.info(f"Found {len(ipo_list)} IPOs with target underwriters and subscription dates") + return ipo_list + + def get_ipo_detail(self, stock_code: str) -> Optional[Dict[str, Any]]: + """ + Get detailed IPO information for a specific stock + + Args: + stock_code: Stock code to get details for + + Returns: + Dictionary with detailed IPO information or None if failed + """ + detail_url = f"{self.base_url}/item/main.naver?code={stock_code}" + logger.info(f"Fetching IPO details for {stock_code}") + + soup = self.get_soup(detail_url) + if not soup: + logger.error(f"Failed to fetch detail page for {stock_code}") + return None + + detail_info = { + 'stock_code': stock_code + } + + try: + # Extract company name from title + title_elem = soup.find('div', {'class': 'wrap_company'}) + if title_elem: + company_name_elem = title_elem.find('h2') + if company_name_elem: + detail_info['company_name'] = company_name_elem.text.strip() + + # Extract market info + market_elem = soup.find('img', {'class': 'img_logo'}) + if market_elem and market_elem.get('alt'): + detail_info['market_type'] = market_elem['alt'] + + # Extract company type and other basic info from summary + summary_info = soup.find('div', {'class': 'section_summary'}) + if summary_info: + # Try to find IPO related information + ipo_table = summary_info.find('table') + if ipo_table: + for row in ipo_table.find_all('tr'): + cells = row.find_all(['th', 'td']) + if len(cells) >= 2: + key = cells[0].text.strip() + value = cells[1].text.strip() + + if '업종' in key: + detail_info['industry'] = value + elif '대표' in key or '최대주주' in key: + detail_info['major_shareholder'] = value + elif '홈페이지' in key: + link = cells[1].find('a') + if link: + detail_info['homepage'] = link.get('href', '') + + # Extract financial information if available + finance_section = soup.find('div', {'class': 'section_finance'}) + if finance_section: + finance_table = finance_section.find('table') + if finance_table: + # Extract financial data + headers = [th.text.strip() for th in finance_table.find_all('th')] + rows = finance_table.find_all('tr')[1:] # Skip header row + + for row in rows: + cells = row.find_all('td') + if cells and cells[0].text.strip() == '매출액': + detail_info['revenue'] = [self._parse_number(cell.text) for cell in cells[1:]] + elif cells and cells[0].text.strip() == '영업이익': + detail_info['operating_profit'] = [self._parse_number(cell.text) for cell in cells[1:]] + elif cells and cells[0].text.strip() == '당기순이익': + detail_info['net_profit'] = [self._parse_number(cell.text) for cell in cells[1:]] + + except Exception as e: + logger.error(f"Error extracting detail information for {stock_code}: {e}") + + return detail_info \ No newline at end of file diff --git a/scripts/ipo-blog/scrapers/test_ipo_list_debug.py b/scripts/ipo-blog/scrapers/test_ipo_list_debug.py new file mode 100644 index 0000000..42fefe6 --- /dev/null +++ b/scripts/ipo-blog/scrapers/test_ipo_list_debug.py @@ -0,0 +1,96 @@ +""" +Debug IPO list page to find 대한조선 +""" +import sys +import os +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from scrapers.base_scraper import BaseScraper +from bs4 import BeautifulSoup +import re + +def debug_ipo_list(): + """Debug IPO list page structure""" + scraper = BaseScraper() + + # Get IPO list page + ipo_list_url = "https://www.38.co.kr/html/fund/index.htm?o=r" + + print("1. Fetching IPO list page...") + soup = scraper.get_soup(ipo_list_url) + if not soup: + print("Failed to fetch page") + return + + # Save the page for analysis + with open('ipo_list_page.html', 'w', encoding='utf-8') as f: + f.write(soup.prettify()) + print(" Saved to ipo_list_page.html") + + # Find all tables + tables = soup.find_all('table') + print(f"\n2. Found {len(tables)} tables") + + # Look for 대한조선 + print("\n3. Looking for '대한조선'...") + found = False + + for idx, table in enumerate(tables): + if '대한조선' in table.get_text(): + print(f"\n Found '대한조선' in table {idx}") + found = True + + # Check if this is an IPO table + table_text = table.get_text() + if any(keyword in table_text for keyword in ['수요예측일', '희망공모가', '공모금액', '주간사']): + print(" This is an IPO table!") + + # Find the specific row + for row_idx, row in enumerate(table.find_all('tr')): + if '대한조선' in row.get_text(): + print(f"\n Found in row {row_idx}") + + # Print row HTML + print(" Row HTML:") + print(" " + "-"*60) + print(row.prettify()[:1000]) + print(" " + "-"*60) + + # Check all cells + cells = row.find_all(['td', 'th']) + for cell_idx, cell in enumerate(cells): + cell_text = cell.get_text(strip=True) + print(f"\n Cell {cell_idx}: {cell_text[:50]}...") + + # Check for onclick + if cell.get('onclick'): + print(f" onclick: {cell.get('onclick')}") + + # Check for links + links = cell.find_all('a') + for link in links: + print(f" link href: {link.get('href')}") + print(f" link text: {link.get_text(strip=True)}") + + # Check parent elements for onclick + parent = row.parent + if parent and parent.name == 'tbody': + parent = parent.parent + if parent and parent.name == 'table': + print("\n Checking table for onclick handlers...") + # Check if table has any JavaScript handlers + + if not found: + print("\n '대한조선' not found in any table") + + # Look for JavaScript that might handle clicks + print("\n4. Looking for JavaScript patterns...") + scripts = soup.find_all('script') + for script in scripts: + if script.string and ('대한조선' in script.string or 'location.href' in script.string): + print(f"\n Found relevant script:") + print(script.string[:500]) + + +if __name__ == "__main__": + debug_ipo_list() \ No newline at end of file diff --git a/scripts/ipo-blog/scrapers/test_naver_scraper.py b/scripts/ipo-blog/scrapers/test_naver_scraper.py new file mode 100644 index 0000000..bac6cf2 --- /dev/null +++ b/scripts/ipo-blog/scrapers/test_naver_scraper.py @@ -0,0 +1,125 @@ +""" +Test script for Naver IPO scraper +""" +import pytest +import logging +from pathlib import Path +import sys + +# Add project root to path for imports +project_root = Path(__file__).parent.parent +sys.path.insert(0, str(project_root)) + +from scrapers.naver_scraper import NaverScraper + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) + +logger = logging.getLogger(__name__) + + +class TestNaverScraper: + """Test cases for Naver IPO scraper""" + + @pytest.fixture + def scraper(self): + """Create a scraper instance for testing""" + return NaverScraper() + + def test_scraper_configuration(self, scraper): + """Test that scraper is properly configured""" + assert hasattr(scraper, 'ipo_list_url'), "Scraper should have ipo_list_url attribute" + assert scraper.ipo_list_url == "https://finance.naver.com/sise/ipo.naver", "IPO URL should be correct" + assert len(scraper.TARGET_UNDERWRITERS) > 0, "Target underwriters list should not be empty" + assert isinstance(scraper.TARGET_UNDERWRITERS, list), "TARGET_UNDERWRITERS should be a list" + + def test_html_fetch(self, scraper): + """Test that we can fetch and parse the IPO page""" + soup = scraper.get_soup(scraper.ipo_list_url) + assert soup is not None, "Should be able to fetch the IPO page" + + # Check for expected elements + items = soup.find_all('div', {'class': 'item_area'}) + assert len(items) > 0, "Should find at least one IPO item on the page" + + def test_ipo_list_structure(self, scraper): + """Test that get_ipo_list returns properly structured data""" + ipo_list = scraper.get_ipo_list() + + # Basic assertions + assert isinstance(ipo_list, list), "get_ipo_list should return a list" + + # If we have IPOs, validate their structure + if ipo_list: + first_ipo = ipo_list[0] + + # Check required fields + required_fields = ['company_name', 'stock_code', 'market_type', 'underwriters'] + for field in required_fields: + assert field in first_ipo, f"IPO data should contain '{field}' field" + assert first_ipo[field], f"'{field}' should not be empty" + + # Validate data types + assert isinstance(first_ipo['company_name'], str), "company_name should be string" + assert isinstance(first_ipo['stock_code'], str), "stock_code should be string" + assert len(first_ipo['stock_code']) > 0, "stock_code should not be empty" + + def test_market_type_validation(self, scraper): + """Test that market types are valid""" + ipo_list = scraper.get_ipo_list() + + if ipo_list: + valid_markets = ['코스피', '코스닥', '코넥스'] + for ipo in ipo_list: + assert ipo['market_type'] in valid_markets, \ + f"Invalid market type: {ipo['market_type']} for {ipo['company_name']}" + + def test_underwriter_filtering(self, scraper): + """Test that all returned IPOs have target underwriters""" + ipo_list = scraper.get_ipo_list() + + for ipo in ipo_list: + assert any(target in ipo['underwriters'] for target in scraper.TARGET_UNDERWRITERS), \ + f"IPO {ipo['company_name']} should have at least one target underwriter, but has: {ipo['underwriters']}" + + def test_parse_number_method(self, scraper): + """Test the _parse_number helper method""" + # Test valid numbers + assert scraper._parse_number('1,234.56') == 1234.56 + assert scraper._parse_number('1234') == 1234.0 + assert scraper._parse_number('-123.45') == -123.45 + + # Test invalid/empty values + assert scraper._parse_number('-') is None + assert scraper._parse_number('') is None + assert scraper._parse_number(None) is None + assert scraper._parse_number('abc') is None + + def test_is_target_underwriter_method(self, scraper): + """Test the _is_target_underwriter helper method""" + # Test positive cases + assert scraper._is_target_underwriter('미래에셋증권') is True + assert scraper._is_target_underwriter('한국투자증권, 미래에셋증권') is True + assert scraper._is_target_underwriter('KB증권') is True + + # Test negative cases + assert scraper._is_target_underwriter('하나증권') is False + assert scraper._is_target_underwriter('') is False + assert scraper._is_target_underwriter(None) is False + + @pytest.mark.slow + def test_ipo_detail_fetch(self, scraper): + """Test fetching detailed IPO information (slow test)""" + ipo_list = scraper.get_ipo_list() + + if ipo_list: + first_ipo = ipo_list[0] + detail = scraper.get_ipo_detail(first_ipo['stock_code']) + + if detail: + assert isinstance(detail, dict), "get_ipo_detail should return a dictionary" + assert 'stock_code' in detail, "Detail should contain stock_code" + assert detail['stock_code'] == first_ipo['stock_code'], "Stock code should match" \ No newline at end of file diff --git a/scripts/ipo-blog/search_result_curl.html b/scripts/ipo-blog/search_result_curl.html new file mode 100644 index 0000000..65839ab --- /dev/null +++ b/scripts/ipo-blog/search_result_curl.html @@ -0,0 +1,1022 @@ + + + + - 俹, û, ֺм, , , , û, , , ֽļ, , û - ֽİŷ, ֽĽ NO.1 38Ŀ´̼ + + + + + + + + + + + + + + + + + + + + + + + +
38Ŀ´̼ ΰ +
+ + + + + + +
+ + + + +
+ + + +
+
+
+ + + + + + + + + + + + +
+ + + + +
ǽð αֵ + +
+
+ + + + + + + +
.
+ + + + + +
K-OTC.
+ + + + + +
ڳؽ.
+ +
+ + +
+ +
+
+ + + +
+ + + + + + + +
ܽ NO.1
Ÿ ŵż ˴ϴ ܽü
+ + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ÿü()IPOIPOмֵȣȸK-OTCڳؽڽ/ŷü ޴38Ӵ
+
+ + + + + + + +
+ + + + + + +
+ + + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + +
IPO
[𴺽][06/26] ̴мַ û û
[𴺽][06/25] ׷, 3D " ġ ġ"
[𴺽][06/25] KB32ȣ û û
+ + + + + + + + +
IPO
+ + + + + + + + + + + + + + + + + + + +
 []Ƽ, û new
 [], û
 []Ǿコɾ(.а),
+
+ + +
+ +
+ + + + + +
Home IPOɻ/
+
+ +
+ + + + + + + + + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 ü û  IR   û űԻ 
+
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
() Ȯ ݾ(鸸) ְ
ϵ ڷᰡ ϴ
+  
+ +

+IPO, , , û, , û,ֽļ,Ȯ,ݾ,м,,IPO,û,,IR,俹,俹,û,űԻ

+ + +
IPO , û ǽŰ Է¿ ϴ åϿ ڹٶϴ

+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ +
+ +
+ + + + + +
̵,йȣãȸ
+
+
+ +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
 ֱ IPO û
+ 06/27
+ 06/26 ǰ
+ 06/26 Z11ȣ
+ 06/26 KB33ȣ
+ 06/24 ̽3ȣ
+ 06/19 ̸
+
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
 ֱ IPO
+ 06/27 Z10ȣ
+ 06/24
+ 06/24 ϳ35ȣ
+ 06/24 ѶijƮ
+ 06/23
+ 06/19 Ǿコ
+
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
 IPO û
+ 07/03 ƿũƮ
+ 07/14 νý
+ 07/15
+ 07/15
+ 07/17 ˺
+ 07/18 Ƽ
+
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
 IPO űԻ
+ 07/04 ̾(.
+ 07/04 KB32ȣ
+ 07/07 ̴мַ
+ 07/10 Ź
+
+
 
+ + +
+ + + + +
+ + +
+ + + + + + + + + + +
޴
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ÿ
ֽĽü
м
IPO м
м
û
DZ/Ϲݰ
Ķ
+
topΰ
+
+
+ + + + + + +
ȸҰ޹ + + 38ٶ޻Ʈ޹ħåǻ +
+ + + + + + +
38Ŀ´̼ ΰ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Copyright + 38Ŀ´̼. All rights reserved.       + Ŀ´̼,38stock,,38
ȣ 38Ŀ´̼   ǥ̻    ڵϹȣ 108-81-21496   Ǹž Űȣ 19-1912ȣ
+ ּ: α з 26 111, 407ȣ  ȭ 1644-3830 ѽ 02-6124-6333 迭 å ̿ 迭 ⺻ħ +
ֽĽ, ֽ üǥ, ֽĸŸ, ֽ üǥ, Ÿ, ֽİŷ, ֽ 簡, ֽ м,IPO
Խǿ Խõ ǰ 38Ŀ´̼ǰ ƹ Խù Ͽ ߻ å Խ
Ǵ ̸ ϴ ̿ڰ δؾ ϸ, 翡 ϴ мڷ ֽĽü ܼ ϸ
ֽ ŷ . ڰ ŸŴ ü ŷ å ο ֽϴ.
+ +
+ + + + + + diff --git a/scripts/ipo-blog/test_subscription_filter.py b/scripts/ipo-blog/test_subscription_filter.py new file mode 100644 index 0000000..8ce502e --- /dev/null +++ b/scripts/ipo-blog/test_subscription_filter.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +""" +Test subscription date filtering in Naver scraper +""" +import logging +from scrapers.naver_scraper import NaverScraper + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) + +def test_subscription_filter(): + """Test the subscription date filtering""" + scraper = NaverScraper() + + print("\n=== Testing Naver IPO List with Subscription Date Filter ===\n") + + # Get filtered IPO list + ipo_list = scraper.get_ipo_list() + + print(f"\nTotal IPOs found with target underwriters AND subscription dates: {len(ipo_list)}") + + if ipo_list: + print("\nIPOs with subscription dates:") + for idx, ipo in enumerate(ipo_list, 1): + print(f"\n{idx}. {ipo['company_name']} ({ipo['stock_code']})") + print(f" - Market: {ipo.get('market_type', 'N/A')}") + print(f" - Underwriters: {ipo.get('underwriters', 'N/A')}") + print(f" - Status: {ipo.get('status', 'N/A')}") + print(f" - Subscription Date: {ipo.get('subscription_date', 'N/A')}") + print(f" - Offering Price: {ipo.get('offering_price', 'N/A')}") + else: + print("\nNo IPOs found with both target underwriters and subscription dates.") + +if __name__ == "__main__": + test_subscription_filter() \ No newline at end of file