
4. 픽사베이 이미지 데이터 크롤링
픽사베이 공식 홈페이지: https://pixabay.com/ko/
# Google Chrome 브라우저의 버전에 맞는 ChromeDriver를 자동으로 설치하는 모듈
import chromedriver_autoinstaller
# sleep() 함수를 사용하여 프로그램에 지연을 도입하는 데 사용하는 시간 관련 모듈
import time
# 파일과 디렉터리에 접근하고 조작이 목적인 운영 체제와 상호 작용하는 모듈
import os
# webdriver는 Selenium을 사용하여 웹 브라우저를 자동화하는 데 사용되는 핵심 클래스
from selenium import webdriver
# By는 Selenium에서 요소를 찾는 데 사용되는 다양한 방법을 정의하는 클래스
from selenium.webdriver.common.by import By
# Request는 URL에 대한 요청을 생성하는 데 사용되며, urlopen은 URL에서 데이터를 가져오는 데 사용.
# 여기서는 이미지를 불러올 수 있게 함.
from urllib.request import Request, urlopen
# Chrome 웹 드라이버를 생성. Chrome 브라우저와 상호 작용하여 웹 자동화 작업을 수행
driver = webdriver.Chrome()
# 페이지가 로드되는 데 최대 3초까지 기다리도록 설정하는 것을 의미
driver.implicitly_wait(3)
# Pixabay 웹사이트에서 '우주'로 검색한 이미지 페이지를 url로 나타냄.
url = 'https://pixabay.com/ko/images/search/우주/'
# 웹 드라이버가 해당 URL로 이동하도록 함.
driver.get(url)
# 3초 동안 프로그램 실행을 지연시킴. 이는 웹 페이지가 로드되기를 기다리는 데 사용됨.
time.sleep(3)
# 파일 소스 불러오기
(xpath: XML 문서의 요소와 속성을 선택하기 위한 경로 언어.)
image_xpath = '/html/body/div[1]/div[1]/div/div[2]/div[3]/div/div/div[1]/div[1]/div/a/img'
# 웹 드라이버를 사용하여 XPath를 이용해 요소를 찾을 것을 나타냄.
# find_element()로 찾은 요소에서 'src' 속성을 가져오며 이를 통해 이미지의 URL을 추출함.
image_url = driver.find_element(By.XPATH, image_xpath).get_attribute('src')
print('image_url: ', image_url)
=======================================================================
image_url: https://cdn.pixabay.com/photo/2017/08/30/01/05/milky-way-2695569_1280.jpg

# 파일 소스 다운로드
image_byte = Request(image_url, headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'})
# 파일을 'cosmic.jpg'라는 이름의 바이너리 쓰기 모드로 쓰기 위해 open() 함수를 사용하여 파일을 열음.
f = open('cosmic.jpg', 'wb')
# urlopen() 함수를 사용하여 주어진 URL에서 데이터를 가져옴.
# 그리고 read() 메서드를 호출하여 데이터를 읽고, write() 메서드를 사용하여 파일에 데이터를 씀.
# 이렇게 함으로써 이미지 데이터를 cosmic.jpg 파일에 씀.
f.write(urlopen(image_byte).read())
f.close()
4-1. 여러 개의 이미지 수집하기
driver = webdriver.Chrome()
driver.implicitly_wait(3)
url = 'https://pixabay.com/ko/images/search/우주/'
driver.get(url)
time.sleep(2)
image_area_xpath = '/html/body/div[1]/div[1]/div/div[2]/div[3]/div/div'
image_area = driver.find_element(By.XPATH, image_area_xpath)
image_elements = image_area.find_elements(By.TAG_NAME, 'img')
image_urls = [ ]
# 이미지 요소들을 하나씩 순회하는 반복문.
for image_element in image_elements:
image_url = image_element.get_attribute('data-lazy-src')
# 이미지 요소에 'data-lazy-src' 속성이 없거나 값이 없는 경우를 처리하기 위한 조건문.
# 이미지 요소의 'data-lazy-src' 속성이 없을 경우, 대체로 'src' 속성 값을 가져와 image_url 변수에 할당
if image_element.get_attribute('data-lazy-src') is None:
image_url = image_element.get_attribute('src')
image_urls.append(image_url)
print(image_url)

# image_urls 리스트 내 url의 갯수를 기준으로 반복문을 실행하여 가져옴.
for i in range(len(image_urls)):
image_url = image_urls[i]
image_byte = Request(image_url, headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'})
f = open(f'cosmic{i}.jpg', 'wb')
f.write(urlopen(image_byte).read())
f.close()

4-2. 위의 내용들을 함수로 리팩토링
crawl_image(keyword)
# 키워드들 입력받고, 특정 페이지를 선택해서 그 페이지까지 크롤링해오는 함수
def crawl_image(keyword, pages):
image_urls = [ ]
for i in range(1, pages+1):
url = f'https://pixabay.com/ko/images/search/{keyword}/?pagi={i}'
driver.get(url)
time.sleep(2)
image_area_xpath = '/html/body/div[1]/div[1]/div/div[2]'
image_area = driver.find_element(By.XPATH, image_area_xpath)
image_elements = image_area.find_elements(By.TAG_NAME, 'img')
for image_element in image_elements:
image_url = image_element.get_attribute('data-lazy-src')
if image_element.get_attribute('data-lazy-src') is None:
image_url = image_element.get_attribute('src')
image_urls.append(image_url)
return image_urls
#저장하는 함수
def crawl_and_save_image(keyword, pages):
image_urls = crawl_image(keyword, pages)
if not os.path.exists(keyword):
os.mkdir(keyword)
for i in range(len(image_urls)):
image_url = image_urls[i]
image_byte = Request(image_url,
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'})
filename = image_url.split('/')[-1]
f = open(f'{keyword}/{filename}', 'wb')
f.write(urlopen(image_byte).read())
f.close()
driver = webdriver.Chrome()
driver.implicitly_wait(3)
crawl_and_save_image('우주',2)
과제
# 과제1
바나프레소 매장명, 주소를 크롤링해서 엑셀로 내보내기
# 과제2
쇼핑몰 1개 선정 후 카테고리별로 정해 크롤링하고 해당 카테고리 사진을 폴더로 정리하기
→ mysql에 테이블을 만든 후 카테고리와 파일경로를 저장