오늘은~
종일 실습을 하며 시간가는 줄 몰랐던 것 같다. 실습 내용을 바로 공유하겠습니다.
Selenium과 OS 라이브러리를 활용하여, 크롤링을 통해 원하는 이미지를 저장하는 실습입니다.
"호날두"라는 이미지를 크롤링하고 저장하기 위해, 먼저 파일을 만들어 줍니다.
이때, os를 사용합니다. 경로에 "search = 검색명"의 파일이 없다면, os.mkdir("search")로 파일을 생성합니다.
# search 폴더 만들고 (만약, 있다면 안 만듦)
if not os.path.isdir(search):
os.mkdir(search)
else:
print("Already Exists")
그리고, 저번 시간에 배운 Selenium webdriver를 활용하여 이미지 검색을 위한 url을 설정하고, Chrome으로 접속합니다.
url = "https://search.naver.com/search.naver?where=image"
search = input("검색어를 입력하세요:")
driver = wb.Chrome()
driver.get(url)
그 후, F12를 눌러 HTML로 설정된 검색창 란을 확인하여, Send_keys를 통해 "호날두"를 입력하고, 엔터 명령키를 전송하여 호날두의 이미지를 확인합니다.
# search_keyword 사용
search_box = driver.find_element(By.ID, "nx_query")
search_box.send_keys("호날두")
search_box.send_keys(Keys.ENTER)
time.sleep(2)
그리고, 화면에 출력되는 이미지를 저장하기 위해, 다시한번 F12를 눌러 이미지에 대한 선택자를 확인합니다.
이때, 네이버 기준 이미지는 클래스명으로 "_fe_image_tab_content_thumbnail_image"로 모두 동일하게 저장되어 있어,
이를 활용하여 사진을 자동으로 저장하였습니다.
imgs = driver.find_elements(By.CLASS_NAME, "_fe_image_tab_content_thumbnail_image")
*** 이때, 중요한 점은 이미지를 탐색하거나 저장할 때, 화면에 보여지는 페이지만을 기준으로 하기 때문에, END or HOME 키를 넣어줘야, 화면이 Scroll Down/UP 되어 더 많은 이미지를 탐색할 수 있습니다.
저는 50개의 호날두 사진을 저장하기 위해, 탐색 시 Scroll Down을 추가하여 페이지를 내려가며 많은 사진을 탐색하도록 하였습니다.
body = driver.find_element(By.TAG_NAME, "body")
for _ in range(10):
body.send_keys(Keys.END)
time.sleep(1)
마지막으로, 크롤링한 결과를 생성한 폴더에 저장하기 위해, 이미지의 url을 get_attribute를 통해 각 이미지가 갖는 주소를 가져옵니다. 이미지의 주소를 통해 이미지의 데이터도 가져온 후, 이러한 정보들을 활용하여 지정된 경로에 저장합니다.
또한, 이미지 파일은 binary형태 이기 때문에 "wirte" 모드가 아닌 "write binary" 모드를 사용해야 합니다.
실행 결과:
전체 코드:
위에서 한 실습 내용을 바탕으로 포켓몬 도감도 만들었다.
포켓몬 페이지 : https://pokemonkorea.co.kr/pokedex
:::포켓몬 도감
포켓몬 도감:::
pokemonkorea.co.kr
포켓몬 페이지는 이런식의 형태였고, 우리는 포켓몬 사진 저장, 이름, 타입, 키에 대해서 저장하는 실습을 하였다.
띠부띠부씰만 모아봤지 이런 방식의 컬랙팅(?)은 처음이지만, 실습 내내 재미있었다.
컬랙팅 방법에 대해 여러 방법들이 있었고,
교수님께서는 포켓몬 이미지 클릭 -> 정보 저장 -> 되돌아오기 -> 페이지 다운 ->이미지 저장의 방식으로 크롤링 하셨다.
나 같은 경우에는 되돌아오기, 페이지 다운의 번거로움이 귀찮아 꼼수 아닌 꼼수 방식을 사용하였다.
(교수님의 방식이 정석적인 방식이긴 하다.)
포켓몬 카드 옆에 다음 포켓몬으로 넘어가는 키가 있어, 나는 이미지 저장, 정보 탐색 후, 이걸 누르도록 하였다.
도감만들기 코드:
151개의 포켓몬이 근본이여서 151개를 찾으라는 교수님의 설명에, while문을 통해 151번 찾도록 설정하였다.
( 최종적으로 포켓몬 정보는 CSV 파일로 저장하고 추출하기 위해 Class 모듈로 함수를 만들어 놓았는데 캡처를 깜빡... 다음에 수정하며 꼭 올리겠습니다 ㅜㅠㅜ)
#포켓몬 도감을 만들자
#포켓몬 이름, 타입(두개 이상일 수 있음), 키
from selenium import webdriver as wb
from seleniuhttp://m.webdriver.common.keys import Keys
from seleniuhttp://m.webdriver.common.by import By
import time
import requests
import os # 폴더 생성
url1 = "https://pokemonkorea.co.kr/pokedex"
search1 = input("입력하세요")
if not os.path.isdir(search1):
os.mkdir(search1)
else:
print("Already Exists")
driver = wb.Chrome()
driver.get(url1)
result = []
cnt = 0
pokemon = driver.find_element(By.CLASS_NAME, "img-fluid")
pokemon.click()
time.sleep(1)
name_list= []
type_list = []
height_list = []
while cnt <= 10 :
name = driver.find_element(By.TAG_NAME, "h3")
names = name.text
name_list.append(names)
print(name_list[cnt])
#print(names)
type1 = driver.find_element(By.CLASS_NAME, "d-flex")
types = type1.text
type_list.append(types)
print(type_list[cnt])
#print(types)
height = driver.find_element(By.CSS_SELECTOR, ".col-4>p")
heights = height.text
height_list.append(heights)
print(height_list[cnt])
#print(heights)
a=Poke(names, types, heights)
result.append(a)
time.sleep(1)
#이미지 저장
imgs = driver.find_element(By.CSS_SELECTOR, ".col-lg-6.col-12>img")
img_url = imgs.get_attribute("src")
response = requests.get(img_url)
img_data = response.content
img_path = f"{send_text}/{cnt+1}.jpg"
with open(img_path, "wb") as file:
file.write(img_data)
print(f"{names} 저장 완료")
button = driver.find_element(By.CLASS_NAME, "icon-next-book")
button.click()
cnt +=1
-----> while문을 돌리며 할꺼 다하고 cnt 1씩 증가시키며 cnt만큼 반복
for r in result:
r.show_poke()
----> 저장된 값을 출력
---> csv로 출력(메모장)으로 확인 가능
import csv
with open("pokemon_dogam.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["names", "types", "heights"]) # 리스트 형태로 전달
for r in result:
writer.writerow(r.poke_to_csv().split(','))
결과:
느낀점: 실습을하며 집중하다보니 시간이 굉장히 빨리 갔던 것 같다. 오늘 실습을 하며 어제 배웠던 크롤링에 대해 더 이해할 수 있었고, 조금 어려웠던 어제보다 수월하게 진행할 수 있었다. 이 내용들을 바탕으로 프로젝트를 진행해야 하는데 뭐가 있으면 좋을까. 자동화가 필요한 정보들을 추출하고 분석하는 프로그램을 만들어야 하는데... 흠... 일상 생활을 더욱 편리하고 윤택하게 할 수 있는 것들을 모으고 모아 의미있는 프로젝트를 진행하고 싶다.
'[HARMAN] 세미콘 아카데미 > 공부내용' 카테고리의 다른 글
[Harman 세미콘 아카데미] Day_11(Python) (0) | 2025.02.18 |
---|---|
[Harman 세미콘 아카데미] Day_10(Python) (0) | 2025.02.17 |
[Harman 세미콘 아카데미] Day_8 (Python) (0) | 2025.02.13 |
[Harman 세미콘 아카데미] Day_7 (Python) (0) | 2025.02.12 |
[Harman 세미콘 아카데미] Day_6 (Python 기초) (0) | 2025.02.11 |