Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 회귀분석
- Sum
- Dense_Rank
- 데이터분석가
- if문 작성법
- max
- 단순회귀 분석
- 총과 카드만들기
- 불순도제거
- count
- sql
- 그래프시각화
- 히스토그램 그리기
- 빅데이터
- difftime
- 상관관계
- 팀스파르타
- 회귀분석 알고리즘
- Intersect
- 그래프 생성 문법
- sqld
- 여러 데이터 검색
- loop 문
- 순위출력
- 데이터분석
- 막대그래프
- merge
- %in%
- 빅데이터분석
- 정보획득량
Archives
- Today
- Total
ch0nny_log
[빅데이터분석] Python_46. 크몽 디지털 화면 개발 본문
※ 실습. 화면 개발하기 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()
'빅데이터 분석(with 아이티윌) > python' 카테고리의 다른 글
[빅데이터분석] Python_48. 판다스 기본 문법 1 (2 유형) (0) | 2024.09.03 |
---|---|
[빅데이터분석] Python_47. 판다스 기본 문법 1 (1 유형) (0) | 2024.08.29 |
[빅데이터분석] Python_45. 데이터 시각화 4. (비교분석) (2) | 2024.08.28 |
[빅데이터분석] Python_44. 데이터 시각화 3. (감정 분석_긍정, 부정) (0) | 2024.08.27 |
[빅데이터분석] Python_43. 데이터 시각화 2. (연관어 분석) (2) | 2024.08.27 |