본문 바로가기

6.Numpy | Pandas | Crawling

6/2(금) IT K-DT(64일차) / 4. 픽사베이 이미지 데이터 크롤링

 

 

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에 테이블을 만든 후 카테고리와 파일경로를 저장