본문 바로가기
Python

[python] 구글 드라이브 내 이미지 텍스트 변환 해보기

by 퍼포먼스마케팅코더 2022. 10. 12.
반응형

python 구글 드라이브 내 이미지 텍스트 변환

python 구글 드라이브 내 이미지 텍스트 변환

오늘은 구글 드라이브 내에서 이미지를 텍스트로 변환해 보는 것에 대해 이야기하려고 합니다. 오늘은 어떤 특정 url에서 어떻게 url을 수집하고 어떤 이미지를 가지고 와서 그걸 구글 드라이브에 올려놓고 OCR을 통해서 해당 이미지를 텍스트로 자동화할 수 있는 전체적으로 코딩화시켜서 가져왔습니다. 의외로 쉬워요.

 

첫 번째 경우는 사이트 맵이 있죠. 어떤 특정 사이트 맵 안에 들어가서 url 전체를 긁어옵니다. 전체를 긁어오는 것부터 시작했어요.

import advertools as adv #설치완료
import pandas as pd
import requests
import json
import time
import requests
import json
import time
import  datetime
import dateutil.parser
from bs4 import BeautifulSoup as bp
import re
import datetime
from datetime import datetime, timedelta


sitemap_urls = adv.sitemap_to_df("http://dig.yunje.net/sitemap.xml") #사이트맵 URL 

#url = sitemap_urls["loc"].to_list() #리스트화

 

 

두 번째 경우는 이 특정 url 중에 이미지 부분이 많이 있습니다. 내 이미지는 많이 긁고 싶은 부분만 고려해서 다 긁어오는 방향으로만 선택했어요. 어떤 특정한 url에 의해서 긁어오는 게 좋을 것 같아서 그걸 가져왔어요.그리고 url 안에서 이미지 등을 url을 알아야 합니다. 해당하는 url 중에서 실제로 이미지를 받고 싶은 url만 따로 긁어오도록 코딩을 만들어 놓았습니다.

 

import requests
from bs4 import BeautifulSoup
import re
import time


n = 1
urls = [ 'http://dig.yunje.net/bbs.php?table=06&query=view&uid=16',
'http://dig.yunje.net/bbs.php?table=06&query=view&uid=18',
'http://dig.yunje.net/bbs.php?table=06&query=view&uid=17',
'http://dig.yunje.net/bbs.php?table=06&query=view&uid=19',
'http://dig.yunje.net/bbs.php?table=06&query=view&uid=26',
'http://dig.yunje.net/bbs.php?table=07&query=view&uid=20',
'http://dig.yunje.net/bbs.php?table=07&query=view&uid=23',
'http://dig.yunje.net/bbs.php?table=07&query=view&uid=24',
'http://dig.yunje.net/bbs.php?table=07&query=view&uid=18',
'http://dig.yunje.net/bbs.php?table=07&query=view&uid=10',
'http://dig.yunje.net/bbs.php?table=07&query=view&uid=21',
'http://dig.yunje.net/bbs.php?table=07&query=view&uid=19',
'http://dig.yunje.net/bbs.php?table=07&query=view&uid=22',
'http://dig.yunje.net/bbs.php?table=07&query=view&uid=17',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=21',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=24',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=26',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=23',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=31',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=32',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=36',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=18',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=29',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=33',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=34',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=28',
'http://dig.yunje.net/bbs.php?table=08&query=view&uid=19',
'http://dig.yunje.net/bbs.php?table=09&query=view&uid=18',
'http://dig.yunje.net/bbs.php?table=09&query=view&uid=19',
'http://dig.yunje.net/bbs.php?table=09&query=view&uid=30',
'http://dig.yunje.net/bbs.php?table=09&query=view&uid=25',
'http://dig.yunje.net/bbs.php?table=09&query=view&uid=29',
'http://dig.yunje.net/bbs.php?table=09&query=view&uid=5',
'http://dig.yunje.net/bbs.php?table=09&query=view&uid=6',
'http://dig.yunje.net/bbs.php?table=09&query=view&uid=7',
'http://dig.yunje.net/bbs.php?table=09&query=view&uid=8',
'http://dig.yunje.net/bbs.php?table=09&query=view&uid=9',
'http://dig.yunje.net/bbs.php?table=09&query=view&uid=115',
'http://dig.yunje.net/bbs.php?table=10&query=view&uid=17',
'http://dig.yunje.net/bbs.php?table=10&query=view&uid=22',
'http://dig.yunje.net/bbs.php?table=10&query=view&uid=23',
'http://dig.yunje.net/bbs.php?table=10&query=view&uid=24',
'http://dig.yunje.net/bbs.php?table=10&query=view&uid=16',
'http://dig.yunje.net/bbs.php?table=10&query=view&uid=21',
'http://dig.yunje.net/bbs.php?table=10&query=view&uid=20',
'http://dig.yunje.net/bbs.php?table=10&query=view&uid=19',
'http://dig.yunje.net/bbs.php?table=10&query=view&uid=25'

]

f = open('C:/Users/user/raw/down/img_down/img_down_list.txt', 'w', encoding ='utf-8')

for url in urls :
    #url = 'http://dig.yunje.net/bbs.php?table=06&query=view&uid=16'  #URL 입력

    headers = { 'Accept-Language' : 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
                'Accept-Encoding': 'gzip'
    }


    raw = requests.get(url=url, headers=headers)
    

    html = BeautifulSoup(raw.content.decode('euc-kr', 'replace'), 'html.parser')  #글자 깨질시 컨텐츠로 하면됨.


    results = html.find('td', {'class' : 'contents'})

    results_2 = results.find_all('img')
    
    for i in results_2 :
        i = i['src']
        f.write(str(i) + '\n')
    
    print(str(n) + "의 페이지 내 이미지 다운로드를 완료했습니다.")
    
    time.sleep(1) #1초만
    
    n +=1
    
f.close()
print('완료')

 

그리고 이 세 번째는 url 이미지가 있던 url을 다 다운받아야 하잖아요.이 다운로드를 세 번째로 진행했습니다. 특정 폴더를 만들어 놓고 폴더 안에 이메일 주소만 호출해서 내려받을 수 있도록 자동화 해놨어요.

 

 

import  urllib.request



f = open ('C:/Users/user/raw/down/img_down/img_down_list.txt', 'r', encoding='utf-8')


url = f.readlines()

n= 1

for i in url :
    urllib.request.urlretrieve(i, "C:/Users/user/raw/down/img_down/img_down_list/"+str(n)+".jpg")   #png 아닌 jpg 파일로 저장
    n = n+1
    print(str(n) + "번째 다운로드가 완료되었습니다.")
print("다운로드 완료되었습니다.")

 

마지막으로 구글 드라이버의 이미지를 업로드합니다. 그걸 올리는데 올리는 게 아니라 좋게 말하면 구글 드라이브에서 좋았던 점이 이미지 파일로 되어 있으면 텍스트 파일로 변환할 수 있습니다. 즉, 이미지를 구글 문서로 바꿀 수 있습니다. 구글 문서로 바꾸면 이미지 속에 있던 한글 텍스트나 기타 영어가 모두 텍스트 형식으로 변환되어 표시됩니다. 인식률 같은 경우는 지금까지 제가 확인한 바로는 거의 90% 정도 괜찮은 것 같습니다. 다행이네요 바뀐 부분 알아두셨으면 좋겠고 텍스트 파일이 구글 문서로 바뀌었잖아요.텍스트가 변환되잖아요. 그걸 자동으로 다시 폴더에 다운받아 놓고 메모장 형식으로 최종적으로 보는 거예요. 만들어놓은 거예요. 제가 약 250개 정도의 이미지를 텍스트로 변환하여 확인한 결과로는 나름 만족스러운 상황에서 공유하게 되었습니다.

 

#자료수집
from __future__ import print_function
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import os
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
from googleapiclient.http import MediaFileUpload, MediaIoBaseDownload
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import  warnings
from    selenium import webdriver
from    selenium.webdriver.support.ui import WebDriverWait
from    selenium.webdriver.support import expected_conditions as EC
from    selenium.webdriver.common.by import By
from    selenium.webdriver.common.keys import Keys 
from    selenium.webdriver.common.action_chains import ActionChains
from    selenium.common.exceptions import NoSuchElementException,StaleElementReferenceException
from    bs4      import BeautifulSoup
import  time
import  pyperclip
import  requests
import  datetime
import  pymssql
import  pandas as pd
from  pandas.core.frame import DataFrame
import  matplotlib.pyplot as plt
import  chromedriver_autoinstaller
import  subprocess
from    selenium import webdriver
from    selenium.webdriver.chrome.options import Options
from    selenium.webdriver.common.alert import Alert
import  chromedriver_autoinstaller
import  subprocess
import  shutil 
import  xlrd
import  openpyxl 
import  pygsheets
import  csv
import  re
import  webbrowser
import  os
import  sys
import  urllib.request
import  json
from    pandas.io.json import json_normalize
import  hashlib
import  hmac
import  base64
import  numpy as np
import  autoit #autoit는 반드시 autoit 프로그램이 깔려있어야됨
import  pyautogui
from PIL import ImageGrab
try:
    from PIL import Image
except ImportError:
    import Image
import pytesseract
import cv2
import numpy as np
import glob
from googleapiclient.http import MediaFileUpload, MediaIoBaseDownload
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import io

warnings.filterwarnings('ignore')




############################## 구글인증 ##########################################
# 권한 인증 및 토큰 확인

SCOPES = ["https://www.googleapis.com/auth/drive.file",
"https://www.googleapis.com/auth/drive",
"https://www.googleapis.com/auth/spreadsheets", 
"https://www.googleapis.com/auth/documents"]


#https://www.googleapis.com/auth/drive.file,
#https://www.googleapis.com/auth/drive,
#https://www.googleapis.com/auth/spreadsheets, 
#https://www.googleapis.com/auth/documents

creds = None

# 이미 발급받은 Token이 있을 때

if os.path.exists('token.pickle'):
    with open('token.pickle', 'rb') as token:
        creds = pickle.load(token)

# 발급받은 토큰이 없거나 AccessToken이 만료되었을 때

if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
        creds.refresh(Request())
    else:
        flow = InstalledAppFlow.from_client_secrets_file('C:/Users/user/raw/credentials.json', SCOPES)
        creds = flow.run_local_server(port=0)
    # 현재 토큰 정보를 저장
    
    with open('token.pickle', 'wb') as token:
        pickle.dump(creds, token)

# 연결 인스턴스 생성

service = build('drive', 'v3', credentials=creds)




############################## 이미지 파일 디렉토리 경로 리스트 담기 및 파일 업로드 ##########################################


path = 'C:/Users/user/raw/down/img_down/img_down_list/'
file_names = os.listdir(path)

#file_directory = []
num = 1

for file_name in file_names :
    file_directory = (str(path) + str(file_name))  #파일디렉토리
    request_body = {
        'name': file_name, # 파일명 정보
        'mimeType': 'application/vnd.google-apps.document', #문서형식(document)
        #'parents': [folder_id] # 부모가 될 폴더의 ID. 즉 업로드할 폴더 위치
    }
   
    media = MediaFileUpload(file_directory,resumable=True)
    file = service.files().create(body=request_body,media_body=media,fields='id').execute()
    print(str(num)+ "번째 업로드 완료")
    num +=1
    
    
#구글 드라이브 내 메모장 파일 ID 확인
    
results = service.files().list(pageSize=250,fields="nextPageToken, files(id, name)").execute() #파일 내 아이템 긁어오기
items = results.get('files', []) #파일명
if not items: 
    print('No files found.')
else: 
    print('Files:') 
    for item in items: 
        print(item) 
        #print('{0} ({1})'.format(item['name'], item['id']))         

        
#구글 드라이브로 다운받자

max_cnt = len(items)
#print(max_cnt)

for i in range(0, max_cnt) :
    file_id = items[i]['id']
    name = items[i]['name']
    #print(file_id) 
    request = service.files().export_media(fileId=file_id, mimeType='text/plain')
    fb=io.FileIO('C:/Users/user/raw/down/img_down/img_down_list/'+str(name)+'.google.txt', 'wb')
    downloader = MediaIoBaseDownload(fb, request)
    done = False 
    while done is False: 
        try :
            status, done = downloader.next_chunk() 
            print('Download %d%%.' % int(status.progress() * 100))
        except :
            break
print('끝')

여기서 한 가지 누락되었던 점은 구글 드라이브에서 api key로 다운로드하는 것입니다. 처음에는 귀찮지만 자세히 말하자면 권한 인증과 토큰을 확인해야 하는 이 부분이 있습니다. 상황 이외의 나머지 부분은 누구나 코딩화해서 쓸 수 있는 정도니까요. 참고하셔서 사용하시면 됩니다.

반응형

댓글