본문 바로가기

Programming/Python Program

파이썬을 이용한 구글 이미지 다운로더 만들기 | Making Image Downloader from google image by using Python

글을 쓰거나, 이미지 작업을 필요로 할 때, 인터넷 상에서 많은 이미지들을 검색 및 다운, 활용하는 사례가 많을 수 있다. 그럴 때마다 인터넷에 접속해서 관련 이미지를 찾아서 다운받고 활용하는게 상당히 번잡스럽게 느껴지곤 한다. 이를 위해 누군가 관련 이미지들을 폴더에 다운받아 놓아주었으면 할 때가 있는데, 걱정마시라(?) 우리에게는 프로그래밍 언어가 있다. 이번에는 파이썬으로 내가 필요로 하는 이미지를 하나의 폴더에 좌~악 받아주게 해 보려고 한다. 

언제나 그렇듯, 이걸 왜 만들어 할 때가 있는데, 같은 작업을 계속 반복적으로 하는 것 보다, 단순 반복작업은 그냥 컴퓨터가 알아서 하게 만들어두면 얼마나 편하겠는가. 우리는 호모 사피엔스이다. 구석기 시대의 유물인 노가다 작업(?)은 그만 두시라.

처음부터 만들어 볼까하다가도, 에이~ 누군가 만들어 둔게 있을꺼야 하는 기대감으로 인터넷 서칭을 해 보았다. 역시나 세상은 같은(!!) 생각을 하는 사람이 존재하기 마련이다. 거의 80% 가까이 만들어 둔 코드가 있는게 아닌가. 물론 제대로 작동이 안되는 상태로 말이다 -_-;. 뚝딱뚝딱 쓸고딱고 기름칠하고 조이고 하니 금새 제법 쓸만한 다운로더가 만들어졌다. 

물론 코딩을 해 보지 않은 분들이라면 아래 코드가 뭔지 도통 감을 잡지 못 할 수도 있다. 무작정 따라하다 보면 각자가 사용하는 환경이 다르기에 제대로 작동을 하지 않고 온갖 에러를 뿜어내기도 할 것이다. 이를 하나씩 해결해 나가다 보면 제법 자신만의 똘똘한 도구로 자리 매김하리라 본다. 

이 글은 다른 사람들이 읽고 활용할 수도 있지만, 개인적으로 나중에 기억이 나지 않을 때(!!!)를 대비 해 올려두고자 함이다.

import requests
import time
import urllib
import argparse
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from fake_useragent import UserAgent
from multiprocessing import Pool
from lxml.html import fromstring
import os, sys
def search(url):
    # Create a browser
    browser = webdriver.Chrome('/Users/sh/anaconda/lib/python3.5/site-packages/selenium/chromedriver')

    # Open the link
    browser.get(url)
    time.sleep(1)

    element = browser.find_element_by_tag_name("body")

    # Scroll down
    for i in range(30):
        element.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.2)

    browser.find_element_by_id("smb").click()

    for i in range(50):
        element.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.2)

    time.sleep(1)

    # Get page source and close the browser
    source = browser.page_source
    browser.close()

    return source
def download_image(link):
    # Use a random user agent header
    headers = {"User-Agent": ua.random}

    # Get the image link
    try:
        r = requests.get("https://www.google.com" + link.get("href"), headers=headers)
    except:
        print("Cannot get link.")
    title = str(fromstring(r.content).findtext(".//title"))
    link = title.split(" ")[-1]

    # Download the image
    print("At : " + os.getcwd() + ", Downloading from " + link)
    try:
        if link.split(".")[-1] == ('jpg' or 'png' or 'jpeg'):

            urllib.request.urlretrieve(link, link.split("/")[-1])
    except:
        pass
 
if __name__ == "__main__":
    # parse command line options

    parser = argparse.ArgumentParser()
    parser.add_argument("keyword", help="the keyword to search")
    args = parser.parse_args()

    # set stack limit
    sys.setrecursionlimit(100000000)

    # get user input and search on google
    query = args.keyword


    #query = input("Enter the name you want to search")



    url = "https://www.google.com/search?as_st=y&tbm=isch&as_q=" + query + \
              "&as_epq=&as_oq=&as_eq=&cr=&as_sitesearch=&safe=images&tbs=isz:lt,islt:svga,itp:photo,ift:jpg"
    source = search(url)

    # Parse the page source and download pics
    soup = BeautifulSoup(str(source), "html.parser")
    ua = UserAgent()

    # check directory and create if necessary
    if not os.path.isdir(args.keyword):
        os.makedirs(args.keyword)

    os.chdir(str(os.getcwd()) + "/" + str(args.keyword))
    # get the links
    links = soup.find_all("a", class_="rg_l")

    # open some processes to download
    with Pool() as pool:
        pool.map(download_image, links)