ch0nny_log

[빅데이터분석] Python_46. 크몽 디지털 화면 개발 본문

빅데이터 분석(with 아이티윌)/python

[빅데이터분석] Python_46. 크몽 디지털 화면 개발

chonny 2024. 8. 28. 16:40
※ 실습. 화면 개발하기 1탄 (국내 신문사)
# 화면 개발에 필요한 모듈을 임폴트 합니다.
import  tkinter  as  tk
from  tkinter  import  ttk, messagebox

# 6.  한국일보 데이터 수집 함수 2개 
import   urllib.request
from bs4  import BeautifulSoup
import  time

# 상세 기사 url 수집함수

def hankook_detail_url(keyword, num):
    
    text1 = urllib.parse.quote(keyword)
    
    params = [ ]   # 비어있는 리스트를 생성합니다. 
    
    for  i  in  range(1,num+1):
        list_url = "https://search.hankookilbo.com/Search?Page=" + str(i) + "&tab=NEWS&sort=relation&searchText=" + text1 + "&searchTypeSet=TITLE,CONTENTS&selectedPeriod=%EC%A0%84%EC%B2%B4&filter=head"
        url = urllib.request.Request( list_url )
        f = urllib.request.urlopen(url).read().decode("utf-8")
    
        soup = BeautifulSoup(  f ,  "html.parser")
        
        for  i   in  soup.select( "div.inn > h3.board-list.h3.pc_only > a" ):
            params.append( i.get("href")  )
            
        time.sleep(1)
    
    return  params

# 기사 본문 수집 함수

def hankook(keyword, num):
    f_hankook = open("c:\\data\\hankook.txt", "w", encoding="utf8" )
    
    result =  hankook_detail_url(keyword, num)
    
    for i  in result:
        url = urllib.request.Request( i )
        f = urllib.request.urlopen(url).read().decode("utf-8")
        
        soup = BeautifulSoup( f , "html.parser") 

        # 날짜 가져오기
        date_text = ""
        for  d  in  soup.select("div.innerwrap > div > div.info > dl"):
            date_text = d.text.strip()
            f_hankook.write( date_text + '\n') # 날짜 저장
            print( d.text ) 

        # 본문 가져오기 
        for  i  in  soup.select("div.innerwrap div.col-main p"):  # div.innterwrap 밑에 p 테그들은 다 선택해라
            article_text = i.text.strip()   # 본문 기사 양쪽에 공백을 잘라냄
            f_hankook.write( article_text + '\n') # 본문기사 저장
            print(article_text) 

        f_hankook.write("/n" + "="*50 + "\n\n") # 기사 구분

    f_hankook.close()
    messagebox.showinfo('성공', '한국일보 데이터 수집이 완료되었습니다.')
    

# 동아일보사 스크롤링 코드
import urllib.request
from bs4 import BeautifulSoup
import time

# 상세 기사 url 수집함수
def da_detail_url(keyword, num):
    text1 = urllib.parse.quote(keyword)
    params = []

    for i in range(0, num):
        list_url = "https://www.donga.com/news/search?p=" + str(i) + "1&query=" + text1 + "&check_news=91&sorting=1&search_date=1&v1=&v2=&more=1"
        url = urllib.request.Request(list_url)
        f = urllib.request.urlopen(url).read().decode("utf-8")
    
        soup = BeautifulSoup(f, "html.parser")
        
        for i in soup.select("article > div > h4 > a"):
            params.append(i.get("href"))
            
        time.sleep(1)
    
    return params

# 동아일보 기사 수집 함수
def dongah(keyword, num):
    f_dongah = open("c:\\data\\dongah.txt", "w", encoding="utf8")
    
    result = da_detail_url(keyword, num)
    
    for i in result:
        url = urllib.request.Request(i)
        f = urllib.request.urlopen(url).read().decode("utf-8")
        
        soup = BeautifulSoup(f, "html.parser") 
        
        # 날짜 가져오기
        date_text = ""
        for d in soup.select("header > div > section > ul > li:nth-child(2)"):
            date_text = d.text.strip()
            print(date_text) # 노트북에 날짜 출력
        
        # 본문 가져오기
        article_text = ""
        for i in soup.select("div.main_view > section.news_view"):  
            article_text = i.text.strip()
            print(article_text) # 노트북에 본문 출력
            
        # 날짜와 본문을 하나의 문자열로 결합하여 파일에 작성
        f_dongah.write(date_text + ' ' + article_text + "\n" + "-"*50 + "\n\n")

    f_dongah.close()
    messagebox.showinfo('성공', '동아일보 데이터 수집이 완료되었습니다.')

# 중앙일보 함수 2개
import   urllib.request
from bs4  import BeautifulSoup
import  time

# 상세 기사 url 수집함수

def ja_detail_url(keyword, num):
    
    text1 = urllib.parse.quote(keyword)
    
    params = [ ]   # 비어있는 리스트를 생성합니다. 
    
    for  i  in  range(1,num+1):
        list_url = "https://www.joongang.co.kr/search/news?keyword=" + text1 + "&page=" + str(i)
        url = urllib.request.Request( list_url )
        f = urllib.request.urlopen(url).read().decode("utf-8")
    
        soup = BeautifulSoup(  f ,  "html.parser")

        #container > section > div > section > ul > li:nth-child(1) > div > h2 > a
        for  i   in  soup.select( "div.card_body > h2.headline > a" ):
            params.append( i.get("href")  )

        if  len(params) > 5 :  # 맨끝에 불필요한 5개의 기사를 제외 시킵니다. 
            params = params[:-5]
            
        time.sleep(1)
    
    return  params

import urllib.request
from bs4 import BeautifulSoup

# 기사 본문 수집 함수


def ja(keyword, num):
    # 중앙일보 데이터 수집 함수
    try:
        f_ja = open("c://data//joongang.txt", "w", encoding="utf8")
        result = ja_detail_url(keyword, num)
        for i in result:
            url = urllib.request.Request(i)
            f = urllib.request.urlopen(url).read().decode("utf-8")
            soup = BeautifulSoup(f, "html.parser")

            # 날짜 가져오기
            date_text = ""
            date_element = soup.select_one("time")
            if date_element:
                date_text = date_element['datetime'].strip()
                f_ja.write(date_text + '\n')

            # 본문 가져오기
            for i in soup.select("article.article > div p"):
                article_text = i.text.strip()
                f_ja.write(article_text + '\n')

            f_ja.write("\n" + "="*50 + "\n\n")
        f_ja.close()
        messagebox.showinfo("성공", "중앙일보 데이터 수집이 완료되었습니다!")
    except Exception as e:
        messagebox.showerror("오류", f"데이터 수집 중 오류가 발생했습니다: {e}")

# 한겨례 신문사
# 한겨례 신문사 

import   urllib.request
from bs4  import BeautifulSoup
import  time
from  datetime  import  datetime 

# 상세 기사 url 수집함수

def han_detail_url(keyword, num):
    
    text1 = urllib.parse.quote(keyword)
    
    params = [ ]   #  상세기사 url 을 저장하기 위한 리스트 입니다.  
    params2 = [ ]  # 날짜를 저장하기 위한 리스트 입니다. 
    
    today = datetime.today()   
    date = str(today)[0:10].replace("-", "." )  
    
    for  i  in  range(1,num+1):
        list_url = "https://search.hani.co.kr/search/newslist?searchword=" + text1 + "&startdate=1988.01.01&enddate=" + date + "&page=" + str(i) + "&sort=desc"
        url = urllib.request.Request( list_url )
        f = urllib.request.urlopen(url).read().decode("utf-8")
    
        soup = BeautifulSoup(  f ,  "html.parser")
        #content > section > div > div.flex-inner > div.left > div.search-result-section > ul > li:nth-child(1) > article > a
        # 상세 기사 url 가져오기 
        for  i   in  soup.select( "article > a" ):
            params.append( i.get("href")  )

        # 상세 기사의 날짜 가져오기
        for  i   in  soup.select( "span.article-date" ):
            params2.append( i.text  )
            
        time.sleep(1)
    
    return  params, params2

# 기사 본문 수집 함수


def han(keyword, num):
    # 한겨레 데이터 수집 함수
    try:
        f_han = open("c://data//han.txt", "w", encoding="utf8")
        result1, result2 = han_detail_url(keyword, num)
        for i, d in zip(result1, result2):
            url = urllib.request.Request(i)
            f = urllib.request.urlopen(url).read().decode("utf-8")
            soup = BeautifulSoup(f, "html.parser")

            # 날짜 가져오기
            f_han.write(d + '\n')

            # 본문 가져오기
            for i in soup.select("div > p"):
                article_text = i.text.strip()
                f_han.write(article_text + '\n')

            f_han.write("\n" + "="*50 + "\n\n")
        f_han.close()
        messagebox.showinfo("성공", "한겨레 데이터 수집이 완료되었습니다!")
    except Exception as e:
        messagebox.showerror("오류", f"데이터 수집 중 오류가 발생했습니다: {e}")

# 화면 개발
root = tk.Tk()
root.title('국내 신문사 데이터 수집기')
root.geometry('800x400')

# 신문사 선택 라벨과 콤보박스
label_func = tk.Label(root, text='신문사를 선택하세요', font=('Arial', 16))
label_func.pack(pady=10)

newspapers = ['한국일보', '동아일보', '중앙일보', '한겨례']
combo_func = ttk.Combobox(root, values=newspapers, font=('Arial',14))
combo_func.pack()

# 키워드 입력 필드 
label_keyword = tk.Label(root, text='키워드를 입력하세요', font=('Arial',14) )
label_keyword.pack(pady=10)
entry_keyword = tk.Entry(root, font=('Arial',14))
entry_keyword.pack()

# 페이지수 입력 필드
label_num = tk.Label(root, text='페이지수를 입력하세요', font=('Arial',14))
label_num.pack(pady=10)
entry_num = tk.Entry(root, font=('Arial',14))
entry_num.pack()

# 실행 버튼 
def  execute_function():
    newspaper = combo_func.get()  # 선택된 신문사 데이터 수집
    keyword = entry_keyword.get() # 입력한 키워드 데이터 수집
    num = entry_num.get()         # 입력된 페이지 번호 수집

    if  not  keyword  or  not  num:
        messagebox.showerr('입력 오류', '모든 필드를 입력하세요')
        return

    num = int(num)  # 입력된 페이지 번호를 숫자로 변환

    if  newspaper == '한국일보':
        hankook(keyword, num)
    elif newspaper =='동아일보':
        dongah(keyword, num)
    elif newspaper =='중앙일보':
        ja(keyword, num)
    elif newspaper =='한겨례':
        han(keyword, num)
    
    else:
        messagbox.showerr('오류', '올바른 신문사를 선택하세요')

# 실행 버튼 생성하기 

btn_execute = tk.Button(root, text='실행', command=execute_function,font=('Arial',14))
btn_execute.pack(pady=20)


#화면 띄우기 
root.mainloop()

 


1. c:\\data\\my_project 생성 (폴더생성)

2. anaconda prompt 창열기

3. 아래와 같이 설치

4. C:\my_project\dist 에 있는 exe 파일 확인(exe 파일로 다른 pc에서도 사용가능)


+ 실행해보기


 

 

★ 국내 신문사 화면 개발하기

# 화면 개발에 필요한 모듈을 임폴트 합니다.
import  tkinter  as  tk
from  tkinter  import  ttk, messagebox

# 6.  한국일보 데이터 수집 함수 2개 
import   urllib.request
from bs4  import BeautifulSoup
import  time

# 상세 기사 url 수집함수

def hankook_detail_url(keyword, num):
    
    text1 = urllib.parse.quote(keyword)
    
    params = [ ]   # 비어있는 리스트를 생성합니다. 
    
    for  i  in  range(1,num+1):
        list_url = "https://search.hankookilbo.com/Search?Page=" + str(i) + "&tab=NEWS&sort=relation&searchText=" + text1 + "&searchTypeSet=TITLE,CONTENTS&selectedPeriod=%EC%A0%84%EC%B2%B4&filter=head"
        url = urllib.request.Request( list_url )
        f = urllib.request.urlopen(url).read().decode("utf-8")
    
        soup = BeautifulSoup(  f ,  "html.parser")
        
        for  i   in  soup.select( "div.inn > h3.board-list.h3.pc_only > a" ):
            params.append( i.get("href")  )
            
        time.sleep(1)
    
    return  params

# 기사 본문 수집 함수

def hankook(keyword, num):
    f_hankook = open("c:\\data\\hankook.txt", "w", encoding="utf8" )
    
    result =  hankook_detail_url(keyword, num)
    
    for i  in result:
        url = urllib.request.Request( i )
        f = urllib.request.urlopen(url).read().decode("utf-8")
        
        soup = BeautifulSoup( f , "html.parser") 

        # 날짜 가져오기
        date_text = ""
        for  d  in  soup.select("div.innerwrap > div > div.info > dl"):
            date_text = d.text.strip()
            f_hankook.write( date_text + '\n') # 날짜 저장
            print( d.text ) 

        # 본문 가져오기 
        for  i  in  soup.select("div.innerwrap div.col-main p"):  # div.innterwrap 밑에 p 테그들은 다 선택해라
            article_text = i.text.strip()   # 본문 기사 양쪽에 공백을 잘라냄
            f_hankook.write( article_text + '\n') # 본문기사 저장
            print(article_text) 

        f_hankook.write("/n" + "="*50 + "\n\n") # 기사 구분

    f_hankook.close()
    messagebox.showinfo('성공', '한국일보 데이터 수집이 완료되었습니다.')
    

# 동아일보사 스크롤링 코드
import urllib.request
from bs4 import BeautifulSoup
import time

# 상세 기사 url 수집함수
def da_detail_url(keyword, num):
    text1 = urllib.parse.quote(keyword)
    params = []

    for i in range(0, num):
        list_url = "https://www.donga.com/news/search?p=" + str(i) + "1&query=" + text1 + "&check_news=91&sorting=1&search_date=1&v1=&v2=&more=1"
        url = urllib.request.Request(list_url)
        f = urllib.request.urlopen(url).read().decode("utf-8")
    
        soup = BeautifulSoup(f, "html.parser")
        
        for i in soup.select("article > div > h4 > a"):
            params.append(i.get("href"))
            
        time.sleep(1)
    
    return params

# 동아일보 기사 수집 함수
def da(keyword, num):
    f_da = open("c:\\data\\da.txt", "w", encoding="utf8")
    
    result = da_detail_url(keyword, num)
    
    for i in result:
        url = urllib.request.Request(i)
        f = urllib.request.urlopen(url).read().decode("utf-8")
        
        soup = BeautifulSoup(f, "html.parser") 
        
        # 날짜 가져오기
        date_text = ""
        for d in soup.select("header > div > section > ul > li:nth-child(2)"):
            date_text = d.text.strip()
            print(date_text) # 노트북에 날짜 출력
        
        # 본문 가져오기
        article_text = ""
        for i in soup.select("div.main_view > section.news_view"):  
            article_text = i.text.strip()
            print(article_text) # 노트북에 본문 출력
            
        # 날짜와 본문을 하나의 문자열로 결합하여 파일에 작성
        f_da.write(date_text + ' ' + article_text + "\n" + "-"*50 + "\n\n")

    f_da.close()
    messagebox.showinfo('성공', '동아일보 데이터 수집이 완료되었습니다.')

# 중앙일보 기사 본문 수집 함수
# 상세 기사 url 수집함수

def ja_detail_url(keyword, num):
    
    text1 = urllib.parse.quote(keyword)
    
    params = [ ]   # 비어있는 리스트를 생성합니다. 
    
    for  i  in  range(1,num+1):
        list_url = "https://www.joongang.co.kr/search/news?keyword=" + text1 + "&page=" + str(i)
        url = urllib.request.Request( list_url )
        f = urllib.request.urlopen(url).read().decode("utf-8")
    
        soup = BeautifulSoup(  f ,  "html.parser")

        #container > section > div > section > ul > li:nth-child(1) > div > h2 > a
        for  i   in  soup.select( "div.card_body > h2.headline > a" ):
            params.append( i.get("href")  )

        if  len(params) > 5 :  # 맨끝에 불필요한 5개의 기사를 제외 시킵니다. 
            params = params[:-5]
            
        time.sleep(1)
    
    return  params

import urllib.request
from bs4 import BeautifulSoup

# 기사 본문 수집 함수
def ja(keyword, num):
    f_ja = open("c:\\data\\joongang.txt", "w", encoding="utf8")
    
    result = ja_detail_url(keyword, num)
   
    for i in result:
        url = urllib.request.Request(i)
        f = urllib.request.urlopen(url).read().decode("utf-8")
        
        soup = BeautifulSoup(f, "html.parser")

        # 날짜 가져오기 (datetime 속성 값)
        date_text = ""
        date_element = soup.select_one("time")  # 첫번째 time 태그를 선택합니다. 

        if date_element:
            date_text = date_element['datetime'].strip()  # datetime 속성 값 가져오기
            f_ja.write(date_text + '\n')  # 날짜 저장
            print(date_text)
    
        # 본문 가져오기 (주석 해제 시 본문도 가져옵니다)
        for i in soup.select("article.article > div p"):  # div.innterwrap 밑에 p 태그들 선택
            article_text = i.text.strip()   # 본문 기사 양쪽에 공백을 잘라냄
            f_ja.write(article_text + '\n') # 본문기사 저장
            print(article_text)

        f_ja.write("\n" + "="*50 + "\n\n")  # 기사 구분
 #   print(cnt)
    f_ja.close()
    messagebox.showinfo('성공', '중앙일보 데이터 수집이 완료되었습니다.')

# 한겨례 기사 본문 수집 함수
# 상세 기사 url 수집함수

def han_detail_url(keyword, num):
    
    text1 = urllib.parse.quote(keyword)
    
    params = [ ]   #  상세기사 url 을 저장하기 위한 리스트 입니다.  
    params2 = [ ]  # 날짜를 저장하기 위한 리스트 입니다. 
    
    today = datetime.today()   
    date = str(today)[0:10].replace("-", "." )  
    
    for  i  in  range(1,num+1):
        list_url = "https://search.hani.co.kr/search/newslist?searchword=" + text1 + "&startdate=1988.01.01&enddate=" + date + "&page=" + str(i) + "&sort=desc"
        url = urllib.request.Request( list_url )
        f = urllib.request.urlopen(url).read().decode("utf-8")
    
        soup = BeautifulSoup(  f ,  "html.parser")
        #content > section > div > div.flex-inner > div.left > div.search-result-section > ul > li:nth-child(1) > article > a
        # 상세 기사 url 가져오기 
        for  i   in  soup.select( "article > a" ):
            params.append( i.get("href")  )

        # 상세 기사의 날짜 가져오기
        for  i   in  soup.select( "span.article-date" ):
            params2.append( i.text  )
            
        time.sleep(1)
    
    return  params, params2

# 기사 본문 수집 함수

def han(keyword, num):
    f_han = open("c:\\data\\han.txt", "w", encoding="utf8" )
    
    result1, result2 =  han_detail_url(keyword, num)
    
    for i, d  in  zip(result1, result2):
        url = urllib.request.Request( i )
        f = urllib.request.urlopen(url).read().decode("utf-8")
        
        soup = BeautifulSoup( f , "html.parser") 

        # 날짜 가져오기
        f_han.write( d + '\n')
        print(d)

        # 본문 가져오기 
        for  i  in  soup.select("div > p"):  
            article_text = i.text.strip()   # 본문 기사 양쪽에 공백을 잘라냄
            f_han.write( article_text + '\n') # 본문기사 저장
            print(article_text) 

        f_han.write("/n" + "="*50 + "\n\n") # 기사 구분

    f_han.close()

    messagebox.showinfo('성공', '한겨례 데이터 수집이 완료되었습니다.')

# 국민일보 기사 본문 수집 함수
# 상세 기사 url 수집함수
# 상세 기사 url 수집함수

def km_detail_url(keyword, num):
    
    text1 = urllib.parse.quote(keyword, encoding="cp949")
#키워드도 cp949로 인코딩하지 않으면 url 삽입 시 한글키워드가 깨져서 검색이 안 됨
    
    params = [ ]   # 비어있는 리스트를 생성합니다. 
    
    for  i  in  range(1,num+1):
        list_url = "https://www.kmib.co.kr/search/searchResult.asp?searchWord=" + text1 + "&pageNo=" + str(i) +"&period="
        url = urllib.request.Request( list_url )
        f = urllib.request.urlopen(url).read().decode("cp949") 
        soup = BeautifulSoup(  f ,  "html.parser")
        for  i   in  soup.select( "div > dl > dt > a" ):
            params.append( i.get("href")  )

        time.sleep(1)
    
    return  params

import urllib.request
from bs4 import BeautifulSoup

# 기사 본문 수집 함수
def km(keyword, num):
    f_km = open("c:\\data\\kukmin.txt", "w", encoding="utf8")
    
    result = km_detail_url(keyword, num)
   
    for i in result:
        url = urllib.request.Request(i)
        f = urllib.request.urlopen(url).read().decode("cp949")
        soup = BeautifulSoup(f, "html.parser")
    
            # 날짜 가져오기
        date_text = ""
        for  d  in  soup.select("div.sub_header > div > div.nwsti > div > div.date"):
            date_text = d.text.strip()
            f_km.write( date_text + '\n') # 날짜 저장
            print( date_text ) 
        
            # 본문 가져오기 
        for i in soup.select("div.sub_content > div.NwsCon > div > div.tx "): 
            article_text = i.text.strip()   # 본문 기사 양쪽에 공백을 잘라냄
            f_km.write(article_text + '\n') # 본문기사 저장
            print(article_text)
    
        f_km.write("\n" + "="*50 + "\n\n")  # 기사 구분

        
    f_km.close()

    messagebox.showinfo('성공', '국민일보 데이터 수집이 완료되었습니다.')

# 조선일보 기사 본문 수집 함수
# 상세 기사 url 수집함수
def  js_detail_url( keyword, num ):
    # 키워드 검색
    text1 = urllib.parse.quote(keyword)
    # 크롬 드라이버의 경로 지정 
    service = Service("C:\\data\\chromedriver-win32\\chromedriver-win32\\chromedriver.exe")
    driver = webdriver.Chrome(service=service) 
    
    params = [] # 중복된 링크를 제거하기 위해서 set 을 사용합니다. 
    
    for  i  in  range( 1, num+1):
        list_url="https://www.chosun.com/nsearch/?query="+ text1 + "&page=" + str(i) + "&siteid=www&sort=1&date_period=all&date_start=&date_end=&writer=&field=&emd_word=&expt_word=&opt_chk=false&app_check=0&website=www,chosun&category="
        driver.get(list_url)  # 크롬이 열리면서 이 url 로 접속합니다.
        time.sleep(5)         # 페이지가 완전히 로드 될때까지 대기(필요따라 조정)
        #html 페이지에서 iframe 을 찾고 전환하는 코드  
        #iframe 내부에 포함된 콘텐츠는 기본 html 문서와 분리되어 있으므로
        # html 코드에 접근을 할 수  없습니다. 접근할 수 있도록 해주는 코드
        try:
            iframe = driver.find_element(By.CSS_SELECTOR,"iframe_selector_here")
            driver.switch_to.frame(iframe)
            time.sleep(2) 
        except:
            print("iframe 을 찾을 수 없습니다. 기본 페이지에서 진행합니다")
    
        # 크롬 로봇이 직접 인공지능으로 검색한 페이지의 html 코드를 BS으로 파싱합니다. 
        soup = BeautifulSoup(driver.page_source, "html.parser")
    
        # 기사 상세 URL 을 params 리스트에 추가합니다.
        for  i  in  soup.select('a.text__link.story-card__headline'):
            params.append( i.get("href"))

    driver.quit()  # 작업이 끝나면 브라우져를 종료합니다. 

    return  list(set(params))
    
# 두번재 함수 파일저장
def josun(keyword, num):
    # 조선일보 본문을 저장할 텍스트 파일 생성 
    f_josun = open("c:\\data\\josun.txt", "w", encoding="utf8" )
    
    # 상세 기사 url을 가져오는 코드
    result = js_detail_url(keyword, num)
    
    # 크롬 로봇의 위치를 지정합니다. 
    service = Service("C:\\data\\chromedriver-win32\\chromedriver-win32\\chromedriver.exe")
    driver = webdriver.Chrome(service = service)
    
    for i in result:
        driver.get(i) # 크롬 로봇이 상세 기사 url 을 하나씩 엽니다.
        time.sleep(5)
        # 자바 스크립트 코드가 있을지 모르므로 iframe을 찾아서 html을 본문에 추가함 
        try:
            iframe = driver.find_element(By.CSS_SELECTOR,"iframe_selector_here")
            driver.switch_to.frame(iframe)
            time.sleep(2)
        except:
            print('iframe을 찾을 수 없습니다. 기본 페이지에서 진행합니다')

        # 날짜 가져오기
        soup = BeautifulSoup(driver.page_source, "html.parser")
        for  i  in  soup.select("article > div > span > span"):  
            date_text = i.text.strip()   # 본문 기사 양쪽에 공백을 잘라냄
            f_josun.write( date_text + '\n') # 날짜 저장
            print(date_text)
            
        # 본문 기사의 html 코드를 뽑아냅니다. 
        for i in soup.select("article > section > p"):  
            f_josun.write(i.get_text() + '\n')
            print(i.get_text())

    driver.quit()
    f_josun.close()

    
    messagebox.showinfo('성공', '조선일보 데이터 수집이 완료되었습니다.')

# 화면 개발
root = tk.Tk()
root.title('국내 신문사 데이터 수집기')
root.geometry('800x400')

# 신문사 선택 라벨과 콤보박스
label_func = tk.Label(root, text='신문사를 선택하세요', font=('Arial', 16))
label_func.pack(pady=10)

newspapers = ['한국일보', '동아일보','중앙일보','한겨례','국민일보','조선일보']
combo_func = ttk.Combobox(root, values=newspapers, font=('Arial',14))
combo_func.pack()

# 키워드 입력 필드 
label_keyword = tk.Label(root, text='키워드를 입력하세요', font=('Arial',14) )
label_keyword.pack(pady=10)
entry_keyword = tk.Entry(root, font=('Arial',14))
entry_keyword.pack()

# 페이지수 입력 필드
label_num = tk.Label(root, text='페이지수를 입력하세요', font=('Arial',14))
label_num.pack(pady=10)
entry_num = tk.Entry(root, font=('Arial',14))
entry_num.pack()

# 실행 버튼 
def  execute_function():
    newspaper = combo_func.get()  # 선택된 신문사 데이터 수집
    keyword = entry_keyword.get() # 입력한 키워드 데이터 수집
    num = entry_num.get()         # 입력된 페이지 번호 수집

    if  not  keyword  or  not  num:
        messagebox.showerr('입력 오류', '모든 필드를 입력하세요')
        return

    num = int(num)  # 입력된 페이지 번호를 숫자로 변환

    if  newspaper == '한국일보':
        hankook(keyword, num)
        
    elif newspaper =='동아일보':
        da(keyword, num)

    elif newspaper =='중앙일보':
        ja(keyword, num)
        
    elif newspaper =='한겨례':
        han(keyword, num)   

    elif newspaper =='국민일보':
        km(keyword, num)   

    elif newspaper =='조선일보':
        josun(keyword, num)   
    
    else:
        messagbox.showerr('오류', '올바른 신문사를 선택하세요')

# 실행 버튼 생성하기 

btn_execute = tk.Button(root, text='실행', command=execute_function,font=('Arial',14))
btn_execute.pack(pady=20)


#화면 띄우기 
root.mainloop()

 

 

 


 

★ 국내 웹사이트 이미지 다운로드 코드

# 필요한 모듈 임폴트
import  tkinter  as  tk
from tkinter  import  ttk, messagebox
from tkinter  import  filedialog

## 빙이미지 스크롤링 함수
def  download_bing_image(keyword):
    # 필요한 모듈을 임폴트 합니다.
    import urllib.request
    from bs4 import BeautifulSoup
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys 
    import time
    from selenium.webdriver.common.by import By
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.service import Service 
    
    # 크롬 드라이버의 위치 지정 후 driver 객체 생성
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    
    # 빙이미지 검색 페이지로 이동
    driver.get("https://www.bing.com/images/feed?form=HDRSC2")
    
    time.sleep(5)
    
    # 검색창에 검색 키워드를 입력
    search = driver.find_element(By.XPATH, "//*[@class='b_searchbox ']")
    search.send_keys(keyword)
    search.send_keys(Keys.RETURN)
    
    # 이미지가 불러와질때까지 대기 하는 시간 지정
    time.sleep(2)
    
    # 페이지를 아래로 스크롤하여 더 많은 이미지를 로드
    for i in range(1, 10):
        driver.find_element(By.XPATH, "//body").send_keys(Keys.END) 
        time.sleep(5)
    
    try:
        # 이미지 더보기 버튼 클릭
        show_more_button = driver.find_element(By.XPATH, "//a[contains(@class,'btn_seemore')]")
        show_more_button.click()
    except  Exceptions  as  e:
        print("결과 더보기 버튼이 없습니다. 다음 단계로 넘어갑니다")
        print(f'오류:{e}')
    
    # 페이지를 아래로 스크롤하여 더 많은 이미지를 로드
    for i in range(1, 10):
        driver.find_element(By.XPATH, "//body").send_keys(Keys.END) 
        time.sleep(5)
    
    # 현재 페이지의 HTML 소스 코드를 가져와 파싱
    html = driver.page_source  
    soup = BeautifulSoup(html, "lxml")
    #print(soup)
    
    # 이미지 태그를 찾고 이미지 URL을 수집
    params = []
    imgList = soup.find_all('img', class_='mimg')
    for  i  in  imgList:
        params.append( i.get('src'))
    
    # 수집한 이미지 URL을 사용하여 이미지를 다운로드
    for idx, p in enumerate(params, 1):
        urllib.request.urlretrieve(p, "c:\\data_image4\\" + str(idx) + ".jpg")
    
    # 작업 완료 후 브라우저 닫기
    driver.quit()

## 구글 이미지 다운 로드 함수
def  download_google_image(keyword):
    # 1. 패키지를 임폴트 합니다. 
    import urllib.request
    from bs4 import BeautifulSoup
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys 
    import time
    from selenium.webdriver.common.by import By
    from selenium.webdriver.chrome.service import Service 
    from webdriver_manager.chrome import ChromeDriverManager
    
    # 2. 크롬 드라이버의 위치 지정후 driver 객체를 생성
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    
    # 3.구글 이미지 검색 페이지로 이동
    driver.get("https://www.google.co.kr/imghp?hl=ko&tab=wi&ei=l1AdWbegOcra8QXvtr-4Cw&ved=0EKouCBUoAQ")
    
    # 4. 검색창 객체 생성
    #search = driver.find_element(By.XPATH, "//*[@class='gLFyf']")
    search = driver.find_element(By.XPATH, '//*[@id="APjFqb"]')  # 동현이가 알려준 방법
    
    # 5.검색어 입력
    name = keyword
    search.send_keys(name)
    
    # 6.엔터 입력
    search.submit()
    
    # 7.스크롤을 아래로 내려서 이미지를 더 로드
    for i in range(1, 9):
        driver.find_element(By.XPATH, "//body").send_keys(Keys.END) 
        time.sleep(10)
    
    # 8. 결과 더보기 클릭 (버튼이 있는 경우에만)
    try:
        driver.find_element(By.XPATH, "//*[@class='mye4qd']").click()
        # 결과 더보기를 눌렀으니 마우스를 다시 아래로 내림
        for i in range(1, 9):
            driver.find_element(By.XPATH, "//body").send_keys(Keys.END) 
            time.sleep(10)
    except Exception as e:
        print("결과 더보기 버튼이 없습니다. 다음 단계로 넘어갑니다.")
    
    # 9. 현재 페이지의 HTML 코드를 가져옴
    html = driver.page_source
    soup = BeautifulSoup(html, "lxml")
    
    # 10. 이미지 URL들을 params 리스트에 담기
    params_g = []
    imgList = soup.find_all("g-img", class_="mNsIhb")
    
    for g_img in imgList:
        img_tag = g_img.find("img")  # g-img 태그 내의 img 태그를 찾음
        if img_tag:
            img_url = img_tag.get("src", img_tag.get("data-src"))
            params_g.append(img_url)
    
    # 결과 확인
    #print(params_g)
    
    
    # 11. 이미지들을 로컬 디렉토리에 저장
    for idx, p in enumerate(params_g, 1):
        if p:
            urllib.request.urlretrieve(p, "c:\\data_image2\\" + str(idx) + ".jpg")
        else:
            print(f"이미지 {idx}는 다운로드할 수 없습니다.")


##네이버 이미지 스크롤링 함수
def  download_naver_image(keyword):
    import urllib.request
    from bs4 import BeautifulSoup
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys 
    import time
    from selenium.webdriver.common.by import By
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.service import Service 
    
    # 크롬 드라이버의 위치 지정 후 driver 객체 생성
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    
    # 네이버 이미지 검색 페이지로 이동
    driver.get("https://search.naver.com/search.naver?where=image&sm=stb_nmr&")
    
    time.sleep(5)
    
    # 검색창에 검색 키워드를 입력
    search = driver.find_element(By.XPATH, '//*[@id="nx_query"]')
    search.send_keys(keyword)
    search.send_keys(Keys.RETURN)
    
    # 페이지를 아래로 스크롤하여 더 많은 이미지를 로드
    for i in range(1, 20):
        driver.find_element(By.XPATH, "//body").send_keys(Keys.END) 
        time.sleep(5)
    
    # 현재 페이지의 HTML 소스 코드를 가져와 파싱
    html = driver.page_source  
    soup = BeautifulSoup(html, "lxml")
    
    # 이미지 태그를 찾고 이미지 URL을 수집
    params_n = []
    imgList = soup.find_all("div", class_=["image_tile_bx", "_fe_image_viewer_focus_target"])
    for i in imgList:
        img_tag = i.find("img")  # 'img' 태그 찾기
        if img_tag:
            img_url = img_tag.get("data-src", img_tag.get("src"))  # 이미지 URL 가져오기
            if img_url:
                params_n.append(img_url)
    
    # 수집한 이미지 URL을 사용하여 이미지를 다운로드
    for idx, p in enumerate(params_n, 1):
        urllib.request.urlretrieve(p, "c:\\data_image4\\" + str(idx) + ".jpg")
    
    # 작업 완료 후 브라우저 닫기
    driver.quit()


##다음 이미지 스크롤링 함수

def  download_daum_image(keyword):
    import urllib.request
    from bs4 import BeautifulSoup
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys 
    import time
    from selenium.webdriver.common.by import By
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.service import Service 
    
    # 크롬 드라이버의 위치 지정 후 driver 객체 생성
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    
    # 네이버 이미지 검색 페이지로 이동
    driver.get("https://search.daum.net/search?nil_suggest=btn&w=img&DA=SBC&q")
    
    time.sleep(5)
    
    # 검색창에 검색 키워드를 입력
    search = driver.find_element(By.XPATH, '//*[@id="q"]') 
    search.send_keys(keyword)
    search.send_keys(Keys.RETURN)
    
    # 페이지를 아래로 스크롤하여 더 많은 이미지를 로드
    for i in range(1, 20):
        driver.find_element(By.XPATH, "//body").send_keys(Keys.END) 
        time.sleep(5)
    
    # 현재 페이지의 HTML 소스 코드를 가져와 파싱
    html = driver.page_source  
    soup = BeautifulSoup(html, "lxml")
    
    # 이미지 태그를 찾고 이미지 URL을 수집
    params_n = []
    imgList = soup.find_all("div", class_=["wrap_thumb"])
    for i in imgList:
        img_tag = i.find("img")  # 'img' 태그 찾기
        if img_tag:
            img_url = img_tag.get("data-src", img_tag.get("src")) # 이미지 URL 가져오기
            if img_url:
                params_n.append(img_url)
    
    # 수집한 이미지 URL을 사용하여 이미지를 다운로드
    for idx, p in enumerate(params_n, 1):
        urllib.request.urlretrieve(p, "c:\\data_image5\\" + str(idx) + ".jpg")
    
    # 작업 완료 후 브라우저 닫기
    driver.quit()



# 실행버튼 눌렀을때 작동되는 함수 생성하기 
def  start_image_download():
    keyword = entry_keyword.get()
    if  not  keyword:
        messagebox.showwarning('경고', '키워드를 입력하세요')
        return
    engine = var_engine.get()

    if engine =="Google":
        download_google_image(keyword)
    elif engine =="Bing":
        download_bing_image(keyword)
    elif engine =="Naver":
        download_naver_image(keyword)
    elif engine =="Daum":
        download_daum_image(keyword) 
    else:
        messagebox.showwarning('경고','검색엔진을 선택하세요')
        return 
        
    messagebox.showinfo('성공',f"{engine} 에서 '{keyword}' 이미지가 다운로드 되었습니다")
    


#화면 개발
root = tk.Tk()
root.title('이미지 스크롤링')
root.geometry("800x400")

# 검색 엔진 선택 라디오 버튼
var_engine = tk.StringVar(value="Google")
label_engine = tk.Label(root, text='검색엔진을 선택하세요')
label_engine.pack(pady=10)

radio_google = tk.Radiobutton(root, text='Google', variable=var_engine,value='Google')
radio_google.pack()

radio_bing = tk.Radiobutton(root, text='Bing', variable=var_engine,value='Bing')
radio_bing.pack()

radio_naver = tk.Radiobutton(root, text='Naver', variable=var_engine,value='Naver')
radio_naver.pack()

radio_daum = tk.Radiobutton(root, text='Daum', variable=var_engine,value='Daum')
radio_daum.pack()

# 키워드 입력
label_keyword = tk.Label(root, text='검색할 키워드를 입력하세요')
label_keyword.pack(pady=10)

entry_keyword = tk.Entry(root, width=30)
entry_keyword.pack(pady=5)

#다음로드 버튼 
button_download = tk.Button(root, text='이미지 다운로드',command= start_image_download)
button_download.pack(pady=20)


root.mainloop()