본문 바로가기
App Programming/Web Crawler

[Web Crawler] 구글 이미지 다운로드용 웹 크롤러 만들기

by goatlab 2022. 3. 3.
728x90
반응형
SMALL

구글 이미지 다운로드용 웹 크롤러 만들기

 

import time
import sys
import re
import math
import os
import random
import urllib.request
import urllib
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By

# 필요한 정보를 입력 받기
print("=" *80)
print("구글 사이트에서 이미지를 검색하여 수집")
print("=" *80)

query_txt = input('크롤링할 이미지의 키워드 : ')
cnt = int(input('크롤링할 건 수 : '))

# 실제 크롤링할 페이지 수
real_cnt = math.ceil(cnt / 50)

f_dir = input('파일이 저장될 경로 (ex. c:\\temp\\): ')

if f_dir =='':
	f_dir = "c:\\temp\\"
    
print("\n")
print("데이터 수집 중...")

# 파일을 저장할 폴더 생성
now = time.localtime()
s = '%04d-%02d-%02d-%02d-%02d-%02d' % (now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec)

os.chdir(f_dir)
os.makedirs(f_dir+s+'-'+query_txt)
os.chdir(f_dir+s+'-'+query_txt)
f_result_dir = f_dir+s+'-'+query_txt
# 크롬 드라이버를 사용하여 웹 브라우저를 실행한 후 검색
s_time = time.time()

path = "c:/temp/chromedriver_240/chromedriver.exe"
driver = webdriver.Chrome(path)

driver.get('https://google.com')
time.sleep(random.randrange(2, 5))

element = driver.find_element(By.NAME, "q")
element.send_keys(query_txt)
element.submit()

# 이미지 링크를 선택
driver.find_element(By.LINK_TEXT, "이미지").click()

# 스크롤 다운 함수 만들기
def scroll_down(driver):
	driver.execute_script("window.scrollTo(0, document.body.scrollHeight); ")
    time.sleep(3)

i = 1
while (i <= real_cnt):
	scroll_down(driver)
    i += 1
    
    if i == 6: # 결과 더보기 버튼 처리
    	element = driver.find_element(By.CSS_SELECTOR, '.mye4qd')

        while not element.is_displayed():
            driver.execute_script("arguments[0].scrollIntoView();", element)
            time.sleep(1)

        if element.is_enabled():
            element.click()
        else:
            print('요소가 비활성화되어 있습니다.')
# 이미지 추출해서 저장
file_no = 0
count = 1
img_src2 = []

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

imgs = driver.find_elements(By.TAG_NAME, 'img')

for img in imgs:
	img_src1 = img.get_attribute('src')
    img_src2.append(img_src1)
    count += 1
    
for i in range(2, len(img_src2) + 1):
	try:
    	urllib.request.urlretrieve(img_src2[i], str(file_no) + '.jpg')
    
    except TypeError:
    	continue
        
	file_no += 1
    time.sleep(1)
    print("\n")
    print("%s번째 이미지 저장========" %file_no)
    print("\n")
    
    if file_no == cnt:
    	break

# 요약 정보 출력
e_time = time.time()
t_time = e_time - s_time

store_cnt = file_no - 1

print("=" *70)
print("총 소요시간은 %s초" %round(t_time, 1))
print("총 저장 건수는 %s건" %file_no)
print("파일 저장 경로는 %s" %f_result_dir)
print("=" *70)

driver.close()

728x90
반응형
LIST