Ai - 미니 프로젝트 : 닮은 꼴 연예인 찾기 (2)

Minhyeok Kim·2022년 10월 9일
0

방대한 데이터의 중요성, 그리고 크롤링?

머신러닝 배우면서 데이터의 중요성을 체감하게 되었다. 개인 프로젝트로 닮은꼴 연예인 찾기를 구현하기로 결정하면서 training 을 위한 데이터를 모으는게 생각보다 만만치 않았기 때문이다.
그래서 방법을 좀 찾아보았는데, 크롤링이라는 방법이 있다고 했다.

웹 크롤링의 개념

source : https://jun-itworld.tistory.com/30

  1. 웹 크롤러(Web Crawler)란 ?
    자동화 된 방법으로 www(world wide web)을 탐색하는 컴퓨터 프로그래밍

  2. 웹 크롤링에서 데이터 수집이란 ?
    SNS, 금융권, 이미지, 공공기관, 쇼핑몰 등 이미지나 텍스트 정보를 가져오는 것

  3. 웹 크롤링 데이터 가공이란 ?
    수집된 정보를 가공하여 excel, csv, xml, txt, binary 파일 등으로 변환 시키는 것

  4. 웹 스크래핑(Web Scraping)이란 ?

  • 마음에 드는 사진을 직접 다운받거나, 내가 원하는 정보를 그때 그때 웹에서 가져오는 것
  • CMS(Content Management System) 어플리케이션의 원천 기술
  • 프로토콜 방식과 브라우저 방식이 존재한다.
  • 사람이 직접 하기 떄문에 손수 해야하는 번거로움이 있다.
  1. 웹 크롤링(Web Crawlering)이란 ?
  • 웹 스크래핑의 정식 명칭
  • 일정한 간격 또는 주기적으로 웹에서 정보를 추출하여 저장한다.(DB 및 파일 시스템에 저장)
  • 주로 사람이 수행하는 것보다 크롤러(Crawler)가 수행한다.
  • 최신 정보를 유지한다. (검색 엔진은 웹 크롤러를 이용해 인터넷의 자료를 수집)

==>> 프로그램이 웹 사이트를 정기적으로 돌며 정보를 추출하는 기술.

그니까, 나 대신 프로그램이 원하는 이미지를 수집해준댄다.
Very Nice, So Brilliant.


Ai 수업은 파이썬으로 진행되었다. 기본적인 사용법을 배웠으니 크롤링을 하는 과정에서 어떤식으로 사용되는지 한번 보고 적용해보자.

소스코드

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from urllib.request import urlretrieve
import time
import urllib.request
import os



a = input ("검색할 키워드를 입력하세요 : ")
b = int(input("개수 : "))
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument("start-maximized")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
driver.get ('http://www.google.com/imghp?hl=en')


elem = driver.find_element("name", "q")

elem.send_keys(a)
elem.send_keys(Keys.RETURN)
CSS_SELECTOR = "css selector"
XPATH = "xpath"

images = driver.find_elements(By.CSS_SELECTOR, ".rg_i.Q4LuWd")


count = 0
for image in images :
    try :
        image.click()

        time.sleep(3)
        
        imgUrl = driver.find_element(By.XPATH, '//*[@id="islrg"]/div[1]/div[' + str(count + 1) +']/a[1]/div[1]/img').get_attribute("src")
        print("test2", imgUrl)
                                

        urllib.request.urlretrieve(imgUrl, "kpop_img/" + a + str(count) + ".jpg")
        imgUrl = ""
        
        count += 1
        if count > b:
            break
    except :
        pass
driver.close()

Selenium 라이브러리
웹 브라우저의 드라이버에 접속하여 제어를 할 수 있게 하는 라이브러리.
크롬이면 크롬드라이버를, 파이어폭스면 파이어폭스드라이버를 다운받아서 진행

urllib 라이브러리
url 을 작업을 위한 여러 모듈을 모은 패키지로 URL을 열고 읽고 구문을 분석하는데 사용한다.

from urllib.request import urlretrieve =>> url 이 가리키는 주소에 접근해서 해당 자원을 로컬 컴퓨터에 저장하는 기능

동작과정

기본적인 코드의 동작과정은 파이썬이 크롬드라이버를 통해서 구글이미지검색을 제어하여 유저가 입력한 값을 구글이미지 검색에 적용시킨다.

검색결과에서 CSS 접근자를 이용하여 이미지 하나하나에 접근한뒤 배열에 담고 각 배열의 key 값중 url 에 접근해 이미지만 따로 떼어낸 뒤에 로컬 컴퓨터에 저장하는 과정을 요청한 횟수만큼 반복한다.

원하는 검색어와 갯수 입력 -> 구글 드라이버를 통해 이미지 검색결과 도출

-> 검색결과를 맨 앞에서부터 접근하여 url 로 담고 -> url 에서 이미지 정보를담는 부분만 잘라


-> 입력한 수만큼 반복 -> 로컬 컴퓨터에 저장


처음에는 구글링해서 짜집기한 소스코드로 동작시켜보았는데 제대로 동작하지 않았다. selenium 라이브러리가 업데이트 되서 그런지 구글에서 저작권때문에 막아서 그런지 라이브러리를 import 시키는 부분부터 문제가 많았고, 제대로 동작시키기까지 시간이 걸렸다. (CSS 에서 이미지가 저장되어 있는 위치도 바뀌어서 수정해야했음)

찾아보니 크롤링한 데이터로 크롤링한 상대방의 허가없이 상업적인 서비스를 하게 되면 소송당하고 처벌을 받을 수도 있다고 한다. 또한 상업적이지 않다고 하더라도 상대방에게 거슬리는 트래픽을 만들경우 이 역시 처벌이 가능. 거슬린다는 기준은 매우 주관적이므로 public 한 서비스보다는 개인소장이나 테스트로 사용하는게 좋을 듯하다.

0개의 댓글