
먼저 작업 경로에서 크롤링을 할 폴더를 생성한다. 환경 데이터 분석 공모전을 위한 AI 모델 학습에 사용될 녹조 하천의 이미지와 일반 하천의 이미지를 크롤링하기 위해 다음 폴더로 'green_algae' 와 'clean_water' 폴더 2개를 생성해주었다.

파이썬 코드를 실행하면 작업 디렉토리에 지정한 이름의 폴더 2개가 생성된 걸 확인할 수 있다.
여러 웹 크롤링 툴이 있지만 데이터 모델을 학습시키기 위해 이미지를 많이 모아야해서 BingImageCrawler를 사용해 Bing에 있는 이미지들을 수집했다.
from icrawler.builtin import BingImageCrawler
import os
from PIL import Image
import imagehash
# ✅ 저장 경로 설정
base_dir = './'
# ✅ 카테고리별 검색어
green_algae_keywords = [
"algae bloom river", "green water lake", "eutrophication in lake",
"cyanobacteria water", "polluted green river", "toxic algae bloom",
"harmful algal bloom in water", "lake with green scum", "녹조 강", "녹조 호수"
]
clean_water_keywords = [
"clear river", "blue lake with no algae", "clean water stream",
"pristine mountain river", "unpolluted clear lake",
"transparent river water", "맑은 강", "청정 하천"
]
# ✅ 중복 제거 함수
def remove_duplicates(folder_path):
print(f"[!] Removing duplicates in: {folder_path}")
seen_hashes = set()
for filename in os.listdir(folder_path):
path = os.path.join(folder_path, filename)
try:
img = Image.open(path)
h = imagehash.average_hash(img)
if h in seen_hashes:
os.remove(path)
else:
seen_hashes.add(h)
except:
os.remove(path)
# ✅ 크롤링 함수
def crawl_images(category_name, keywords, max_per_keyword=300):
save_dir = os.path.join(base_dir, category_name)
os.makedirs(save_dir, exist_ok=True)
offset = 0
for keyword in keywords:
print(f"[{category_name.upper()}] Crawling: '{keyword}'")
crawler = BingImageCrawler(
storage={'root_dir': save_dir},
downloader_threads=8
)
crawler.crawl(keyword=keyword, max_num=max_per_keyword, file_idx_offset=offset)
offset += max_per_keyword # 인덱스 오버랩 방지
# 중복 제거
remove_duplicates(save_dir)
# ✅ 실행
crawl_images("green_algae", green_algae_keywords)
crawl_images("clean_water", clean_water_keywords)
파일이 중복되서 생기는 오류와 같은 문제를 수정하면서 크롤링을 했고 다음 사진과 같이 필요한 이미지들을 수집할 수 있었다.


아쉬운 점은 웹에서 주제어를 중심으로 크롤링을 하다보니 필터링되지 않은 항목들, 예를 들어 관련도가 낮은 사진이나 글자가 들어간 이미지들이 섞여있어서 이를 수동으로 필터링하는 작업을 거쳐야했다는 점이다. 다음 번에 크롤링을 시도할 때는 이 점도 개선하고 싶다.