카테고리 없음

크롤링 DAY 3 ( 포켓몬 이미지 데이터 크롤링 실습 )

도키마 2024. 9. 26. 11:15



 

 

 

오늘의 노래 추천 ♡

 

 
Love wins all
아티스트
아이유
앨범
The Winning
발매일
2024.02.20

 

아이유랑 디오랑 듀엣한거 아시나요 그거 요즘 많이 들음

 

 

 

 

 

 

 

 

 

 

DAY 3

 

 

 

 

 

 

 

 

 

 

ㅡ  포켓몬 이미지 데이터 크롤링 실습 ㅡ

바탕화면에 포켓몬 도감 폴더를 생성하고

포켓몬 이미지 데이터를 폴더에 저장

 

 

 

from bs4 import BeautifulSoup as bs
import requests as req
import time
from selenium import webdriver as wb
# 웹 브라우저를 제어하기 위한 라이브러리
from selenium.webdriver.common.keys import Keys
# 웹에게 값을 입력하기위한 라이브러리
from selenium.webdriver.common.by import By
# html문서에서 선택자와 태그의 위치를 찾기위한 라이브러리
from selenium.webdriver.chrome.service import Service
# 사용자가 사요하는 크롬 드라이버와 일치하는 버전의 드라이버 찾는 라이브러리
from webdriver_manager.chrome import ChromeDriverManager
# 가장 최신버전의 크롬드라이버를 업데이트  및 설치하는 라이브러리

import os # 파일이나 폴더를 생성해주는 라이브러리 (파일 시스템 라이브러리)
from urllib.request import urlretrieve # 이미지 경로를 받아서 파일로 변환시켜주는 라이브러리

 

필요한 라이브러리 import

 

 

 

 

ㅡ 포켓몬 데이터를 넣을 폴더 생성하기 ㅡ

 

# 바탕화면에 '포켓몬도감' 폴더 생성하기

if not os.path.isdir("C:/Users/smhrd12/Desktop/pocketmonList"):
    os.mkdir("C:/Users/smhrd12/Desktop/pocketmonList")
    print("폴더를 생성 완료했습니다.")
else:
    print("이 대상에 이름이 'pocketmonList'인 폴더가 이미 있습니다")

 

os.path.isdir ( ) : 해당 경로가 존재하는지 확인

os.mkdir ( ) :  해당 디렉토리 생성

 

출력 결과
출력 결과

 

 

 

 

# pokemonster 공식사이트 정보 가져오기
service = Service(ChromeDriverManager().install())
driver = wb.Chrome(service=service)
driver.get('https://pokemonkorea.co.kr/pokedex')

# 객체화 
soup = bs(driver.page_source, 'lxml')

 

pokemon 사이트 정보 불러오기 및 객체화

이정도는 외우기

 

 

 

 

# 이미지 태그 데이터 가져오기
pokeImg = soup.select('img.img-fluid')

# 이미지의 경로를 가져올 때는 content를 가져오는 것이 아닌 태그 안의 src값을 가져와야함

 

select를 이용해 이미지 태그값 가져오기

 

 

# 이미지 태그 안의 src 값 빼오기 (속성값 인덱싱)
# img 태그의 src값을 리스트에 저장
imgList = []

for i in range(len(pokeImg)):
    imgList.append(pokeImg[i]['src']) # 인덱싱
imgList

 

imgList 출력 결과

 

'속성값 인덱싱' 을 이용해 img 태그 안의 src값을 빼오고

for문으로 src값을 리스트에 저장

 

 

 

 

# 이미지 파일 저장
for i in range(len(imgList)):
    urlretrieve(imgList[i], f"C:/Users/smhrd12/Desktop/pokemonList/pokemon{i}.jpg")

 

저장 결과

 

urlretrieve ( ) : 이미지 경로(src) 값을 활용해서 임시 파일로 변환해주는 라이브러리

리스트 내의 url 값을 미리 만들어놓은 폴더의 파일로 저장

 

 

 

 

 

그런데 이때...!

페이지의 모든 포켓몬 이미지를 가져오려면

스크롤을 통해 전체 데이터를 로딩해야함

 

스크롤 키 ↓, page down, end, spacebar 중 end 키가 가장 빠름

body 태그에 지정 !

 

# 키보드의 end 키를 사용해서 스크롤을 내려보자(자동화)
# body 태그에 지정
scroll = driver.find_element(By.TAG_NAME, 'body')
scroll.send_keys(Keys.END)

 

find_element 메서드를 사용해 body 태그의 위치를 찾고

send_keys 메서드Keys.END 명령을 통해 end 키를 전송

 

스크롤 결과

 

 

 

 

 

 

service = Service(ChromeDriverManager().install())
driver = wb.Chrome(service=service)
driver.get('https://pokemonkorea.co.kr/pokedex')
soup = bs(driver.page_source, 'lxml')
scroll = driver.find_element(By.TAG_NAME, 'body')
imgList = []

for i in range(20):
    scroll.send_keys(Keys.END)
    time.sleep(1)

soup = bs(driver.page_source, 'lxml')
pokeImg = soup.select('img.img-fluid')

for i in range(len(pokeImg)):
    imgList.append(pokeImg[i]['src']) # 인덱싱

for i in range(len(imgList)):
    urlretrieve(imgList[i], f"C:/Users/smhrd12/Desktop/pokemonList/pokemon{i+1}.jpg")

driver.close()

 

# 스크롤 끝까지 내리는 코드
# 스크롤 전체 높이 저장
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # 맨 밑까지 스크롤 내리기
    body.send_keys(Keys.END)

    # 페이지 로드 되는 것 기다리기
    time.sleep(1)

    # 스크롤 전체 높이와 지금까지 내린 스크롤 높이를 비교하는 코드
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:  # 만약 현재 높이와 스크롤 전체 높이가 같아지면
        break    # 반복문을 빠져나가주세요
    last_height = new_height

 

(수정중)

 




 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 



 

 

 

 

 

BYE