-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmin_team.py
784 lines (725 loc) · 30.9 KB
/
min_team.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
# 네이버 크롤러 Version 1.0
import BeautifulSoup
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import sys
from selenium.webdriver.common.keys import Keys
import pandas as pd
import os
import shutil
class Searcher:
def naver(self):
print("="*80)
print(f'{"네이버크롤러 version 1.0": ^65}')
print("="*80)
# 검색어 입력받기
while True:
self.search = input("검색어를 입력해주세요. > ")
print('='*80)
if self.search == '':
print("크롤링할 검색어를 입력해주세요.")
print('='*80)
continue
else:
break
# 크롬으로 네이버 연결
path = "C:\python_temp\chromedriver_win32\chromedriver.exe"
self.driver = webdriver.Chrome(path)
self.driver.get("https://www.naver.com")
# 전체화면으로 변환
self.driver.maximize_window()
time.sleep(1)
# 검색어 입력 후 검색버튼 클릭
element = self.driver.find_element_by_class_name("input_text")
element.send_keys(self.search)
self.driver.find_element_by_class_name("btn_submit").click()
time.sleep(1)
class Crawler(Searcher):
# 동일 저장리스트
no2 = []
title2 = []
content2 = []
# 카페와 블로그만 동일
writer2 = []
dates2 = []
# 다른 저장리스트들
sources = []
dic2 = []
s_title2 = []
###### 블로그 #######
def blog(self):
pass
###### 뉴스 #######
def news(self):
pass
###### 카페 #######
def cafe(self):
global no2
global writer2
global title2
global content2
global dates2
# 리스트 비우기
self.no2.clear()
self.writer2.clear()
self.title2.clear()
self.content2.clear()
self.dates2.clear()
time.sleep(2)
# 페이지 링크 가져오기
full_html = self.driver.page_source
# 페이지 해석
soup = BeautifulSoup(full_html, 'html.parser')
# VIEW카테고리에 카페글로 가기
self.driver.find_element_by_link_text("VIEW").click()
time.sleep(1)
self.driver.find_element_by_link_text("카페").click()
time.sleep(1)
html = self.driver.page_source
soup = BeautifulSoup(html, 'html.parser')
try:
div = soup.find("div", class_="api_subject_bx")
data_list = div.select('ul > li')
except AttributeError:
print("정보가 없습니다.")
print("="*80)
else:
# 크롤링할 개수 입력받기
self.save_num = int(input("크롤링할 글 개수를 입력해주세요: "))
print('\n')
# 개수만큼 스크롤 내리기
body = self.driver.find_element_by_css_selector('body')
while len(data_list) < self.save_num:
body.send_keys(Keys.PAGE_DOWN)
time.sleep(1)
html = self.driver.page_source
soup = BeautifulSoup(html, 'html.parser')
div = soup.find("div", class_="api_subject_bx")
data_list = div.select('ul > li')
# 시작시간
s_time = time.time()
# 반복문으로 입력받은 개수만큼 정보 추출하기
no = 1
for i in data_list:
if no <= self.save_num:
try:
title = i.find(
'a', class_="api_txt_lines total_tit").get_text().strip()
content = i.find(
'div', class_="api_txt_lines dsc_txt").get_text().strip()
dates = i.find(
'span', class_="sub_time sub_txt").get_text().strip()
writer = i.find(
'a', class_="sub_txt sub_name").get_text().strip()
except AttributeError:
title = '제목이 없습니다.'
self.title2.append(title)
print("2) 게시글 제목:", title)
content = '내용이 없습니다.'
self.content2.append(content)
print("3) 게시글 요약내용:", content)
print('\n')
else:
self.no2.append(no)
print("1) 글 번호:", no)
self.title2.append(title)
print("2) 게시글 제목:", title)
self.content2.append(content)
print("3) 게시글 요약내용:", content)
self.dates2.append(dates)
print("4) 게시글 작성날짜:", dates)
self.writer2.append(writer)
print("5) 카페명:", writer)
print('\n')
no += 1
else:
break
time.sleep(2)
print(f"""크롤링이 완료되었습니다.\n크롤링된 글의 개수는 {len(self.no2)}입니다.\n""")
# 작업시간 표시
e_time = time.time()
t_time = e_time-s_time
print('='*80)
print('출력에 걸린시간은 %s초 입니다' % round(t_time, 1))
print('='*80)
# 통합페이지로 돌아가기
self.driver.execute_script("window.scrollTo(0, 0)")
time.sleep(2)
self.driver.find_element_by_xpath(
'//*[@id="lnb"]/div[1]/div/ul/li[1]/a').click()
###### 카페 텍스트 저장 #######
def cafe_text(self):
global no2
global writer2
global title2
global content2
global dates2
# 페이지 링크 가져오기
full_html = self.driver.page_source
# 페이지 해석
soup = BeautifulSoup(full_html, 'html.parser')
# VIEW카테고리에 카페글로 가기
self.driver.find_element_by_link_text("VIEW").click()
time.sleep(1)
self.driver.find_element_by_link_text("카페").click()
time.sleep(1)
html = self.driver.page_source
soup = BeautifulSoup(html, 'html.parser')
try:
div = soup.find("div", class_="api_subject_bx")
data_list = div.select('ul > li')
except AttributeError:
print("정보가 없습니다.")
else:
# 개수만큼 스크롤 내리기
body = self.driver.find_element_by_css_selector('body')
while len(data_list) < self.save_num:
body.send_keys(Keys.PAGE_DOWN)
time.sleep(1)
html = self.driver.page_source
soup = BeautifulSoup(html, 'html.parser')
div = soup.find("div", class_="api_subject_bx")
data_list = div.select('ul > li')
# 반복문으로 개수만큼 정보 추출하기
no = 1
for i in data_list:
if no <= self.save_num:
try:
title = i.find(
'a', class_="api_txt_lines total_tit").get_text().strip()
content = i.find(
'div', class_="api_txt_lines dsc_txt").get_text().strip()
dates = i.find(
'span', class_="sub_time sub_txt").get_text().strip()
writer = i.find(
'a', class_="sub_txt sub_name").get_text().strip()
except AttributeError:
title = '제목이 없습니다.'
print("2) 게시글 제목:", title)
content = '내용이 없습니다.'
print("3) 게시글 요약내용:", content)
print('\n')
else:
print("1) 글 번호:", no)
print("2) 게시글 제목:", title)
print("3) 게시글 요약내용:", content)
print("4) 게시글 작성날짜:", dates)
print("5) 카페명:", writer)
print('\n')
no += 1
else:
break
time.sleep(2)
# 통합페이지로 돌아가기
self.driver.execute_script("window.scrollTo(0, 0)")
time.sleep(2)
self.driver.find_element_by_xpath(
'//*[@id="lnb"]/div[1]/div/ul/li[1]/a').click()
###### 백과사전 #######
def know(self):
global no2
global title2
global content2
global sources
global s_title2
html = self.driver.page_source
soup = BeautifulSoup(html, 'html.parser')
encyclopedia = soup.find_all(
'section', 'sc_new sp_nkindic _au_kindic_collection')
# 지식백과가 없을 시
if len(encyclopedia) == 0:
self.driver.find_element_by_xpath(
'//*[@id="_nx_lnb_more"]/a').click()
time.sleep(1)
self.driver.find_element_by_xpath(
'//*[@id="_nx_lnb_more"]/div/ul/li[2]/a').click()
encyclopedia = soup.find_all('div', 'nkindic_area')
print()
self.cnt = 0
while self.cnt <= 0:
try:
self.cnt = int(input("크롤링할 페이지는 몇 페이지 입니까?: "))
print()
if self.cnt <= 0:
print("1부터 입력가능합니다.")
print()
continue
except:
print("1이상의 숫자로 입력해주세요.")
print()
continue
print()
print('='*80)
no = 1
count = 1
for x in range(1, self.cnt+1):
html = self.driver.page_source
soup = BeautifulSoup(html, 'html.parser')
encyclopedia = soup.find_all('div', 'nkindic_area')
for i in encyclopedia:
subject = i.find_all('div', 'nkindic_tit _svp_content')
for j in subject:
content = i.find('div', 'api_txt_lines desc')
source = i.find('span', 'source_txt')
print('번호:', no)
self.no2.append(no)
print("제목:", j.text.strip())
self.title2.append(j.text.strip())
print("내용:", content.text.strip())
self.content2.append(content.text.strip())
print("출처:", source.text.strip())
self.sources.append(source.text.strip())
print()
no += 1
if self.cnt > count:
self.driver.find_element_by_xpath(
'//*[@id="main_pack"]/div[2]/div/a[2]').click()
count += 1
print(
f'-------------------{count}번째 페이지입니다.---------------')
time.sleep(1)
# 지식백과가 있을 시
else:
no = 1
count = 1
for i in encyclopedia:
title = i.find_all('div', 'nkindic_tit _svp_content')
content = i.find_all('div', 'api_txt_lines desc')
source = i.find_all('div', 'nkindic_source')
d = 0
for a in title:
b = a.find_all('a')
print()
print('번호:', no)
self.no2.append(no)
print('1.제목:', b[0].text)
self.subjects.append(b[0].text)
if len(b) > 1:
print('부제목:', b[1].text)
self.s_title2.append(b[1].text)
print('내용:', content[d].text)
self.content2.append(content[d].text)
print('출처:', source[d].text.strip())
self.sources.append(source[d].text)
print()
else:
print('부제목:', '') # 부제목 없을시
print('내용:', content[d].text)
self.content2.append(content[d].text)
print('출처:', source[d].text.strip())
self.sources.append(source[d].text.strip())
print()
d += 1
no += 1
# #통합으로 돌아가기
# self.driver.find_element_by_link_text("통합").click()
def know_text(self):
from bs4 import BeautifulSoup
from selenium import webdriver
import time
self.driver.find_element_by_xpath(
'//*[@id="main_pack"]/div[2]/div/div/a[1]').click()
time.sleep(1)
html = self.driver.page_source
soup = BeautifulSoup(html, 'html.parser')
encyclopedia =soup.find_all('div', 'nkindic_area')
print()
no = 1
count = 1
for x in range(1, self.cnt+1):
html = self.driver.page_source
soup = BeautifulSoup(html, 'html.parser')
encyclopedia = soup.find_all('div', 'nkindic_area')
for i in encyclopedia:
subject = i.find_all('div', 'nkindic_tit _svp_content')
for j in subject:
content = i.find('div', 'api_txt_lines desc')
source = i.find('span', 'source_txt')
print('번호:', no)
print("제목:", j.text.strip())
print("내용:", content.text.strip())
print("출처:", source.text.strip())
print()
no += 1
if self.cnt > count:
self.driver.find_element_by_xpath(
'//*[@id="main_pack"]/div[2]/div/a[2]').click()
count += 1
print(f'-------------------{count}번째 페이지입니다.---------------')
time.sleep(1)
###### 어학사전 #######
def lan_dic(self):
pass
class SaveMenu(Crawler):
# c:\ezen_ai\2021-09-15-16-21-가을 여행-view.txt로 저장되었습니다.
def save_folder(self):
while True:
if self.save_re == 0:
try:
self.f_dir = input(
"수집된 데이터를 저장할 폴더명을 입력해주세요.\n(예: c:\ezen_python_data\\) > ")
except OSError:
print("파일명을 제대로 써주세요.")
print("="*80)
continue
else:
print("="*80)
try:
os.makedirs(self.f_dir)
except OSError:
while True:
save_again = input("해당 폴더명이 이미 존재합니다. 폴더명을 다시 입력하시겠습니까?\
\n[메뉴] Y : 폴더명 다시 입력 / M : 존재하는 폴더에 저장 / D: 존재하는 폴더 삭제 > ")
print("="*80)
if save_again.upper() == "Y":
break
elif save_again.upper() == "M":
while True:
save_again2 = input(
"이미 존재하는 폴더명에 저장하시겠습니까?(Y/N) > ")
if save_again2.upper() == "Y":
self.save_re += 1
return os.chdir(self.f_dir)
break
elif save_again2.upper() == "N":
print("존재하는 폴더에 저장하기를 선택하지 않으셨습니다.")
print("="*80)
break
else:
print("(Y/N)로 입력해주시길 바랍니다.")
continue
elif save_again.upper() == "D":
try:
os.rmdir(self.f_dir)
except OSError:
while True:
have = input(
"해당 폴더에 있는 파일까지 모두 삭제하시겠습니까?(Y/N) > ")
if have.upper() == "Y":
try:
shutil.rmtree(self.f_dir)
except OSError:
mag = '[WinError 32] 다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다'
break
else:
time.sleep(1)
print(
f"{self.f_dir}폴더를 삭제하였습니다.")
print("="*80)
break
elif have.upper() == "N":
break
else:
print("(Y/N)로 입력해주시길 바랍니다.")
continue
break
else:
print("(Y /M /D)만 입력해주시길 바랍니다.")
continue
else:
os.chdir(self.f_dir)
self.save_re += 1
break
else:
while True:
dir_again = input("이전에 요청하신 저장폴더에 계속 저장하시겠습니까?(Y/N) > ")
if dir_again.upper() == "Y":
self.save_re += 1
return os.chdir(self.f_dir)
break
elif dir_again.upper() == "N":
self.save_re = 0
break
else:
print("(Y/N)로 입력해주시길 바랍니다.")
continue
def save_txt(self, searchType):
try:
if self.cnt >= 1:
Crawler.know_text()
else:
Crawler.know()
except:
pass
now = time.localtime()
f_name = "%04d-%02d-%02d-%02d-%02d" % (
now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min)
searchMenu = {"1": "블로그", "2": "뉴스", "3": "카페", "4": "지식백과", "5": "어학사전"}
for key, value in searchMenu.items():
if int(key) == searchType:
ff_name = self.f_dir+f_name+"-"+self.search+"-"+value+".txt"
else:
pass
orig_stdout = sys.stdout
f = open(ff_name, 'a', encoding='utf-8')
sys.stdout = f
if searchType == 1:
self.blog()
elif searchType == 2:
self.news()
elif searchType == 3:
self.cafe_text()
elif searchType == 4:
self.know_text()
elif searchType == 5:
self.lan_dic()
else:
print("숫자를 제대로 입력해주세요.")
sys.stdout = orig_stdout
f.close()
print('txt 파일 저장 경로 : %s' % ff_name)
print("="*80)
pass
def save_csv(self, searchType):
now = time.localtime()
f_name = "%04d-%02d-%02d-%02d-%02d" % (
now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min)
searchMenu = {"1": "블로그", "2": "뉴스", "3": "카페", "4": "지식백과", "5": "어학사전"}
for key, value in searchMenu.items():
if int(key) == searchType:
fc_name = self.f_dir+f_name+"-"+self.search+"-"+value+".csv"
else:
pass
#### 블로그 ####
if searchType == 1:
pass
#### 뉴스 ####
elif searchType == 2:
pass
#### 카페 ####
elif searchType == 3:
data = pd.DataFrame()
data['번호'] = self.no2
data['제목'] = self.title2
data['내용'] = self.content2
data['작성일'] = self.dates2
data['카페명'] = self.writer2
data.to_excel(fc_name)
print('xls 파일 저장 경로 : %s' % fc_name)
print("="*80)
#### 지식백과 ####
elif searchType == 4:
nav_save = pd.DataFrame()
nav_save['번호'] = self.no2
nav_save['제목'] = self.title2
try:
nav_save['부제목'] = self.s_title2
except:
pass
nav_save['내용'] = self.content2
nav_save['출처'] = self.sources
nav_save.to_excel(fc_name)
print('xls 파일 저장 경로 : %s' % fc_name)
print("="*80)
#### 어학사전 ####
elif searchType == 5:
pass
def save_xls(self, searchType):
now = time.localtime()
f_name = "%04d-%02d-%02d-%02d-%02d" % (
now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min)
searchMenu = {"1": "블로그", "2": "뉴스", "3": "카페", "4": "지식백과", "5": "어학사전"}
for key, value in searchMenu.items():
if int(key) == searchType:
fx_name = self.f_dir+f_name+"-"+self.search+"-"+value+".xls"
else:
pass
#### 블로그 ####
if searchType == 1:
pass
#### 뉴스 ####
elif searchType == 2:
pass
#### 카페 ####
elif searchType == 3:
data = pd.DataFrame()
data['번호'] = self.no2
data['제목'] = self.title2
data['내용'] = self.content2
data['작성일'] = self.dates2
data['카페명'] = self.writer2
data.to_excel(fx_name)
print('xls 파일 저장 경로 : %s' % fx_name)
print("="*80)
#### 지식백과 ####
elif searchType == 4:
nav_save = pd.DataFrame()
nav_save['번호'] = self.no2
nav_save['제목'] = self.title2
try:
nav_save['부제목'] = self.s_title2
except:
pass
nav_save['내용'] = self.content2
nav_save['출처'] = self.sources
nav_save.to_excel(fx_name)
print('xls 파일 저장 경로 : %s' % fx_name)
print("="*80)
#### 어학사전 ####
elif searchType == 5:
pass
class Run(SaveMenu):
def save_run(self, searchType):
if not len(self.no2):
while self.done > 0:
try:
question = input(
"저장할 정보가 없습니다. 다른 메뉴로 크롤링 하시겠습니까?(Y/N) > ")
except ValueError:
print("(Y/N)를 입력해주세요.")
print("="*80)
continue
else:
if question.upper() == "Y":
break
elif question.upper() == "N":
while True:
try:
self.new = int(
input("새로운 검색어로 검색하시겠습니까?(1:예/ 2:아니오) > "))
except ValueError:
print("숫자를 입력해주세요.")
print("="*80)
continue
else:
if self.new == 1:
self.new = 1
self.done = 0
break
elif self.new == 2:
self.new = 2
self.done = 0
break
else:
print("숫자만 입력해주시길 바랍니다.")
continue
else:
print("(Y/N)만 입력해주세요.")
print("="*80)
continue
else:
self.save_done = 1
while self.save_done > 0:
try:
save_q = input("추출된 데이터를 파일로 저장하시겠습니까?(Y/N) > ")
except ValueError:
print("(Y/N)를 입력해주세요.")
print("="*80)
continue
else:
if save_q.upper() == "Y":
saveType = 1
self.save_re = 0
while True:
try:
saveType = int(
input("""[메뉴] 1.txt 2.csv 3.xls (종료: 0)\n메뉴를 선택해주세요 > """))
except ValueError:
print("메뉴를 입력해주세요.")
print("="*80)
continue
else:
print("="*80)
if saveType == 1:
self.save_folder()
self.save_txt(searchType)
self.save_re += 1
elif saveType == 2:
self.save_folder()
self.save_csv(searchType)
self.save_re += 1
elif saveType == 3:
self.save_folder()
self.save_xls(searchType)
self.save_re += 1
elif saveType == 0:
self.save_done = 0
self.save_re += 0
print("저장 프로그램을 종료합니다.")
print("="*80)
break
else:
print("숫자를 제대로 입력해주세요.")
print("="*80)
continue
elif save_q.upper() == "N":
print("저장 프로그램을 종료합니다.")
print("="*80)
break
else:
print("(Y/N)만 입력해주세요.")
continue
def run(self):
self.new = 1
self.done = 1
self.save_done = 1
while True:
# 네이버크롤러 시작
if self.new == 1:
self.naver()
self.done = 1
else:
print("네이버크롤러 version 1.0를 종료합니다.")
print("웹 브라우저를 종료하겠습니다.")
print("="*80)
self.driver.close()
break
while self.done > 0:
# 메뉴 선택하여 크롤링 하기
try:
searchType = int(
input("""[메뉴] 1.블로그 2.뉴스 3.카페 4.지식백과 5.어학사전 (종료: 0)\n메뉴를 선택해주세요 > """))
except ValueError:
print("메뉴를 선택해주세요.")
print("="*80)
continue
else:
print("="*80)
#### 블로그 크롤링 ####
if searchType == 1:
self.blog()
self.save_run(searchType)
#### 뉴스 크롤링 ####
elif searchType == 2:
self.news()
self.save_run(searchType)
#### 카페 크롤링 ####
elif searchType == 3:
self.cafe()
self.save_run(searchType)
#### 백과사전 크롤링 ####
elif searchType == 4:
self.know()
self.save_run(searchType)
#### 어학사전 크롤링 ####
elif searchType == 5:
self.lan_dic()
self.save_run(searchType)
#### 크롤링 종료 ####
elif searchType == 0:
while True:
try:
self.new = int(
input("새로운 검색어로 검색하시겠습니까?(1:예/ 2:아니오) > "))
except ValueError:
print("숫자를 입력해주세요.")
print("="*80)
continue
else:
if self.new == 1:
self.new = 1
self.done = 0
break
elif self.new == 2:
self.new = 2
self.done = 0
print("="*80)
break
else:
print("숫자만 입력해주시길 바랍니다.")
continue
else:
print("숫자를 제대로 입력해주세요.")
print("="*80)
continue