본문 바로가기

Project/크롤러 제작

구글 크롤러 제작 프로젝트(#1) : Google 크롤링 코드 제작_저장

이전 게시물 : 2024.06.28 - [Project/크롤러 제작] - 구글 크롤러 제작 프로젝트(#0) : 시연 영상

  구글 크롤러를 구현하는 것은 어렵지 않지만, 이를 다른 사람들이 쉽고, 편하고, 유용하게 사용할 수 있도록 하려면 몇가지를 고려해봐야 한다고 생각했습니다. 현재까지 확인이 되는 오픈 구글 크롤러는 2가지 유형으로 웹 서비스, 오픈 소스로 볼 수 있었는데 각각의 단점을 아래와 같이 정리해 볼 수 있었습니다.

1. 웹 서비스 : 사용자의 진입 허들. ( '직접 검색하는 시간''해당 웹에 들어가서 검색'에 있어서 과연 메리트가 있을지....)

2.  오픈 소스 : 최신 패치 x(html, css 등의 변화)

이러한 단점들을 보완할 수 있는 방법을 마련하려고 고민을 해보았고 검색부터 저장까지의 과정을 유저 입장에서 단순화하며 중복 이미지 제거 기능, 출처 확인 기능을 추가로 넣는다면 타 서비스들과의 차별성이 있을 것 같아 해당 2가지의 기능을 주축으로한 크롤러를 제작해 보았습니다.

우선 구글 크롤링 코드가 정리되어 있는 GoogleCrawling 클래스를 소개해보겠습니다. 우선 해당 클래스의 매서드는 아래와 같습니다.


[ 메서드 ]
setup_crawling()
크롬 드라이버를 설정하고 반환합니다.

crawl_images(search_query, max_images=10, wait_time=2)
주어진 검색어로 이미지를 크롤링하여 URL 리스트를 반환합니다.

save_images(self, search_query, download_path, url_list, max_images)
이미지를 다운로드하고 저장합니다.

find_duplicates(self, download_path, similarity_threshold=30)
중복이미지를 검출합니다.


setup_crawling()은 드라이버 옵션을 설정하는 부분이고 crawl_images()도 일반 크롤링 코드라 넘어가겠습니다😊

1. save_images() : 이미지 저장 + 출처 정리 파일

    # search_query 폴더가 없으면 생성, 있으면 모든 파일 삭제
    if not os.path.exists(download_path):
        os.makedirs(download_path)
    else:
        print('기존의 파일 삭제 후 작업 시행합니다.')
        for file_name in os.listdir(download_path):
            file_path = os.path.join(download_path, file_name)
            if os.path.isfile(file_path):
                os.remove(file_path)

 

우선 해당 크롤러를 만들면서 가장 초점을 맞추려고 했던 부분이 유저에게 부여할 수 있는 최대한의 편리함입니다. 그렇기에 해당 폼에 입력 쿼리(검색어)를 넣고 저장을 할때 가장 먼저 조사하는 것이 입력된 경로의 'CrawlingImage'(이 부분은 다음에 설명!) 해당 쿼리의 이름을 가지고 있는 파일의 여부입니다. 만일 없다면 바로 폴더를 생성해서 해당 파일에 데이터를 쌓고, 있다면 제거후 재생성하는 방식을 선택했습니다. 이는 한정된 컴퓨터의 메모리에 대한 우려를 줄이기 위함과 같은 검색어를 다시 검색을 한다는 말은 기존의 데이터의 존재를 모르거나, 마음에 안드는 등의 존재가 불필요해졌음을 의미하기에 과감히 제거하는 방식을 선택했습니다.

# 확장자가 유효하지 않거나 없는 경우 기본적으로 .jpg로 설정
if ext.lower() not in ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp']:
    ext = '.jpg'

작업을 하던 도중 이미지 저장하는데 오류가 발생하는 부분이었습니다. jpg와 jpeg는 표준 확장자이기에 많은 확장자를 쉽게 표현을 할 수 있었지만 그럼에도 상당히 많은 이미지를 잘 해석하지 못하는 이슈가 있어 작업시에 확인되는 확장자를 정의하고 이외의 이미지는 jpg로 저장시키는 방법을 택했습니다.

# URL 리스트를 CSV 파일로 저장
image_num = [f'{search_query}_{num}' for num in range(1, count)]
url_df = pd.DataFrame({
    'image_name': image_num,
    'imgUrl': [url[0] for url in url_list[:count-1]],
    'siteUrl': [url[1] for url in url_list[:count-1]]
})
url_df.to_csv(os.path.join(download_path, 'image_url.csv'), encoding='utf-8-sig', index=False)
print("CSV file saved: image_url.csv")

출처를 표기하는 방식은 생각보다 쉬운 방식을 선택했습니다. 바로 csv 파일에 이미지 파일 이름과 매핑하여 정보를 쉽게 접근할 수 있도록 하는 것 입니다. 이를 폼에 연결하여 바로 확인할 수 있도록 해두었고, 출처뿐만이 아니라 이미지의 src값을 같이 저장해두어 만일 이미지 저장에 오류가 생긴 경우 개인이 따로 들어가서 확인할 수 있도록 하였습니다.

'Project > 크롤러 제작' 카테고리의 다른 글

구글 크롤러 제작 프로젝트(#0) : 시연 영상  (0) 2024.06.28