오늘의 노래 추천 ♡
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
'속성값 인덱싱' 을 이용해 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