코딩 강의/유용한 스킬 없을까요

파이썬 크롤링을 활용하여 캔버스 이미지 저장하기

아미넴 2020. 8. 29.
반응형

#함께보면_좋은강의

sangminem.tistory.com/83

 

파이썬 크롤링으로 URL 이미지 저장하기

#함께보면_좋은강의 sangminem.tistory.com/30 파이썬 크롤링을 활용하여 캔버스 이미지 저장하기 #함께보면_좋은강의 sangminem.tistory.com/83 Python(파이썬) 크롤링(Crawling)으로 URL 이미지 저장하기 #함께..

sangminem.tistory.com

sangminem.tistory.com/32

 

파이썬 텍스트 크롤링 따라하기

#함께보면_좋은강의 sangminem.tistory.com/30 파이썬 크롤링을 활용하여 캔버스 이미지 저장하기 #함께보면_좋은강의 sangminem.tistory.com/83 Python(파이썬) 크롤링(Crawling)으로 URL 이미지 저장하기 #함께..

sangminem.tistory.com

 

안녕하세요.

오늘은 파이썬을 활용하여 크롤링을 해보려고 합니다.

 

단순한 텍스트를 가져오는 작업이 아닌

Canvas 태그에 적용된 이미지를 png 파일로 저장하는 방법을 알아보겠습니다.

 

자바스크립트로 해보려고 하니 레퍼런스도 많이 없고 단순하지 않아 보여서

익숙하지 않지만 상대적으로 정보가 많은 파이썬으로 시도를 해보았습니다.

 

저도 파이썬을 잘 모르기 때문에 초보자 입장에서 기술하겠습니다. :)

 

먼저 아래 사이트를 방문하여 파이썬을 설치합니다.

https://www.python.org

 

Welcome to Python.org

The official home of the Python Programming Language

www.python.org

그 다음 크롤링에 필요한 모듈을 몇가지 설치해야합니다.

 

먼저 간편하게 HTTP 요청을 처리하도록 도와주는 requests 모듈을 설치해 보겠습니다.

pip install requests

파이썬 설치 후 커맨드 창에서 위와 같이 입력하면 설치가 완료됩니다.

 

다음은 웹 브라우저를 실행시키고 스크립트 명령에 따라 액션을 수행할 수 있게 해주는 selenium 패키지를 설치합니다.

pip install selenium

마찬가지로 위와 같이 입력하면 설치가 됩니다.

 

마지막으로 크롬에서 selenium webdriver를 사용할 수 있도록 해주는 ChromeDriver를 설치해야 합니다.

브라우저 별로 대부분 드라이버가 제공이 되지만 저는 크롬을 기준으로 작성해 보겠습니다.

https://sites.google.com/a/chromium.org/chromedriver/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

sites.google.com

사용하는 크롬 버전, 운영체제에 맞는 드라이버를 받아서

작업하고자 하는 경로에 복사를 해 놓으면 됩니다.

 

 

이제 파이썬 코드를 작성해 보겠습니다.

저는 Visual Studio Code 에디터에서 작성을 하였습니다.

 

필요한 모듈들을 먼저 import 하겠습니다.

import requests
from selenium import webdriver
import base64
import re

앞서 설치한 requests 모듈과 selenium 패키지 내의 webdriver 모듈,

그리고 기본적으로 제공하는 모듈인 base64 및 re 모듈을 import 했습니다.

 

base64 모듈은 HTML Canvas에서 가져온 base64 기반 인코딩 데이터를 다시 디코딩하기 위한 목적이고

re 모듈은 정규식을 활용하여 파일명에 들어갈 수 없는 특수문자를 제거하기 위해 사용할 예정입니다.

 

그럼 샘플 파일에서 필요한 정보를 읽어오도록 하겠습니다.

 

파일 내용은 다음과 같습니다.

내용 맨 앞에 있는 ID 값만을 반복적으로 바꿔가면서 이미지를 가져올 URL을 구성할 예정입니다.

http://sillok.history.go.kr/popup/viewer.do?type=view&id=

뒤에 ID 값을 넣어주고 반복 호출하면 원하는 결과를 얻을 수 있어보입니다.

내용 끝에 있는 URL은 텍스트로만 이루어진 사이트여서 여기서는 사용하지 않습니다.

 

그럼 이어서 코드를 작성해 보겠습니다.

r = open('sample.txt', mode='rt', encoding='utf-8')
id_list = []

for line in r:
    temp = line.split('^')
    id_list.append([temp[0], (temp[1]+' '+temp[2]+' '+temp[3]).strip()])

r.close()

파이썬은 파일을 읽기 위해 따로 모듈을 import할 필요는 없었습니다.

open 메서드를 이용하여 바로 내용을 읽어올 수 있었고 그 내용을 r 변수에 담았습니다.

그리고 필요한 정보를 용도에 맞게 정제하여 담을 배열 변수 id_list 를 선언하였습니다.

 

한줄 한줄 라인별로 데이터를 '^' 기준으로 분할하여 필요한 값을 id_list 배열에 담았습니다.

그리고 close 메서드로 다 사용한 파일을 메모리에서 해제시켰습니다.

 

이제 정제한 데이터를 바탕으로 실제 웹 사이트에 접속할 URL을 구성해보겠습니다.

 

http://sillok.history.go.kr/popup/viewer.do?type=view&id=wda_10204015_002

위 사이트에 접속하면 아래와 같은 이미지가 하나 보입니다.

canvas에 그려진 이미지라 일반적인 파일 다운로드 방법으로는 저장이 불가능해 보이므로

HTML Canvas 엘리먼트의 toDataURL 메서드를 사용하여 base64 인코딩을 하여 데이터를 가져오겠습니다.

browser = webdriver.Chrome()

for i, v in enumerate(id_list):
    print(i)
    browser.get('http://sillok.history.go.kr/popup/viewer.do?type=view&id='+v[0])
    base64_image = browser.execute_script("return document.querySelector('canvas').toDataURL('image/png').substring(21);")

먼저 webdriver를 이용하여 크롬 드라이버를 로드했습니다.

그리고 반복문을 사용하여 앞서 정제한 데이터를 하나씩 불러와 URL을 만들어 웹 브라우저에 띄우고

스크립트 실행 메서드를 이용하여 canvas에 그려진 이미지를 base64 데이터로 인코딩하여 가져와 담았습니다.

 

 

이제는 가져온 데이터를 파일로 저장을 해야겠죠.

for i, v in enumerate(id_list):
    print(i)
    browser.get('http://sillok.history.go.kr/popup/viewer.do?type=view&id='+v[0])
    base64_image = browser.execute_script("return document.querySelector('canvas').toDataURL('image/png').substring(21);")
    
    # 추가 작성
    output_image = base64.b64decode(base64_image)
    path = "./image/"
    file_name = re.sub('[\/:*?"<>|]','',v[1] + ".png")
    with open(path + file_name, 'wb') as f:
        f.write(output_image)

base64 모듈에서 제공하는 메서드를 이용하여 다시 png 파일 형식으로 디코딩 했고

경로 및 파일명을 알맞게 지정하여 디코딩한 데이터를 각각 파일로 저장하였습니다.


참고로 작성한 파일 실행은 다음과 같이 합니다.

python crawling_image.py

직접 한 건 한 건 URL을 호출하여 데이터를 가져오므로 건이 많으면 시간이 조금 오래 걸릴 수도 있습니다.

 

위와 같이 깔끔하게 잘 저장되었네요.

 

파이썬에서 사용한 구문 하나하나 의미를 공부하려면 시간이 좀 더 오래 걸리겠지만

간단하게 해보고 싶으신 분들은 그대로 따라하시면 어렵지는 않을 거예요.

 

궁금하신 점 있으면 밑에 댓글로 남겨 주시면 찾아서라도 알려드리겠습니다.

감사합니다. :)

반응형

댓글

💲 추천 글