본문 바로가기
App Programming/Web Crawler

[Web Crawler] 네이버 이미지 수집용 웹 크롤러 만들기

by goatlab 2022. 8. 28.
728x90
반응형
SMALL

네이버 이미지 수집용 웹 크롤러 만들기

 

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

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

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

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

# URL 생성
def make_url(query_txt):
    # 네이버 이미지 검색
    base_url = 'https://search.naver.com/search.naver?where=image&section=image&query='
    
    # CCL 상업적 이용 가능 옵션
    end_url = '&res_fr=0&res_to=0&sm=tab_opt&color=&ccl=2' \
              '&nso=so%3Ar%2Ca%3Aall%2Cp%3Aall&recent=0&datetype=0&startdate=0&enddate=0&gif=0&optStr=&nso_open=1'
    
    return base_url + quote_plus(query_txt) + end_url

url = make_url(query_txt)

# 크롬 드라이버를 사용하여 웹 브라우저를 실행한 후 검색
s_time = time.time()

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

# 페이지 스크롤 다운
body = driver.find_element_by_css_selector('body')
# 또는 body = driver.find_element(By.CSS_SELECTOR, 'body')

for i in range(100): # 스크롤 횟수 지정
    body.send_keys(Keys.PAGE_DOWN)
    time.sleep(1) # delay 주기
        
# 이미지 추출해서 저장
file_no = 0
count = 1
img_src2 = []

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

# 이미지 긁어오기
imgs = driver.find_elements_by_class_name('_image')
# 또는 imgs = driver.find_element(By.CLASS_NAME, '_image')

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