본문 바로가기
IT

파이썬으로 구글 이미지 자동 다운로더 프로그램 만들기

by 친절한껍데기 2018. 9. 2.

파이썬 구글 이미지 크롤러

블로그에 글을 작성하다보면 관련 사진을 찾아서 수십개 올려야 할 경우가 있는데,

구글에서 찾아서 하나하나 저장하면 시간이 많이 걸립니다.

그래서 저는 파이썬 2.7에 이미지 크롤링 스크립트를 작성하여 사용하고 있습니다.


스크립트를 하기에 공유합니다. 

저도 인터넷에서 찾은건데, 예전하고 구글의 이미지 관련 사이트가 달라져서 디버깅을 한 버전입니다.

(전체소스는 최하단 참고)


모듈 선언부입니다. 모듈이 없으면 PIP로 추가하시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -*- coding: utf-8 -*-
 
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
import wget
 
no=1
cs



url로 검색하는 부분입니다.

크롬을 미리 깔아야하고 chromedriver를 깔아줘야합니다. 링크

하기 소스는 크롬을 실행해서 열고 매개변수로 받은 url(본 예제는 구글 이미지 검색페이지)로 들어가서

페이지 다운을 누르고 일정 시간 후, 더 보기 버튼을 자동으로 누르고 계속 페이지 다운을 하는 겁니다.

받을 양을 조정하려면 for문 숫자를 더 늘리면 됩니다. 딜레이도 맞춰주고요...

마지막엔 검색한 html을 반환하고 크롬을 종료합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def search(url):
    # Create a browser
    browser = webdriver.Chrome('chromedriver')
    # Open the link
    browser.get(url)
    time.sleep(0.5)
    element = browser.find_element_by_tag_name("body")
 
    # Scroll down
    for i in range(40):
        element.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.1)
    
    browser.find_element_by_id("smb").click()
 
    for i in range(10):
        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
cs


다음은 위에서 받은 검색한 리스트들을  받아서 이미지 부분 주소를 추출하고 저장을 합니다.

저는 이미지 부분 주소의 마지막 4자리가 .jpg인 경우에만 다운로드 되도록 했습니다.

png등을 받고 싶으시면 해당부분을 수정하시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def download_image(link):
    global no
    #print 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 = fromstring(r.content).findtext(".//title")
    link_url = title.split(" ")[-1]
    print link_url
    
    if link_url.find(".jpg")==len(link_url)-4:
    # Download the image
        wget.download(link_url, str(os.getcwd()) + "/" + query+"/"+str(no)+".jpg")
    no=no+1
cs


다음이 마지막인데 검색어를 cmd에서 입력받고 해당 검색어로 url를 만들어 위에서 선언한 함수에 보내주고 받는 역할을 합니다.

count변수에 입력한 숫자만큼 다운로드를 진행합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# set stack limit
sys.setrecursionlimit(100000000)
# get user input and search on google
query = raw_input(u'검색어는?: ').decode("utf-8")
#query = input("Enter the name you want to search")
url = "https://www.google.com/search?as_st=y&tbs=isz%3Alt%2Cislt%3Asvga%2Citp%3Aphoto%2Cift%3Ajpg 
&tbm=isch&sa=1&ei=H_-KW6GSHImGoAS3z4DYCA&q=" +query+"&oq="+query+"&gs_l=img.3..0l10.19389.19389.0.
21095.1.1.0.0.0.0.113.113.0j1.1.0....0...1c.1.64.img..0.1.111....0.QpKT5Qs8Kdo"
print url
source = search(url)
count=60
# Parse the page source and download pics
page_text = source.encode('utf-8').decode('ascii''ignore')
soup = BeautifulSoup(page_text, "html.parser")
ua = UserAgent()
# check directory and create if necessary
if not os.path.isdir(query):
    os.makedirs(query)
#os.chdir(str(os.getcwd()) + "/" + query)
# get the links
links = soup.find_all("a", class_="rg_l")
for a in links[0:count]:
    try:
        download_image(a)
    except:
        pass
cs


google_image_crawling.py