-
[Crawliing Project _ 회고_ 어려웠던 부분(2) 이미지 복사 후 삽입]About_Datascience/Project 2023. 1. 24. 18:37
두 번째로 어려웠던 부분을 뽑자면 메일링 서비스를 진행할 때 메일을 쓰는 본문에 셀레니움을 통해 복사한 이미지를
붙여넣기 하는 작업이었다.
이 부분은 구글링을 해도 잘 나오지 않았고 , 결국 window에서만 가능한 클립보드를 이용하여 해결하였다.
따라서 이번 글에서는 이를 해결하기까지의 시행착오를 작성하고자 한다.
해결방법
import win32clipboard def send_to_clipboard(clip_type, data): win32clipboard.OpenClipboard() win32clipboard.EmptyClipboard() win32clipboard.SetClipboardData(clip_type, data) win32clipboard.CloseClipboard() for key,value in names_rates.items(): if (key == '코스피') or (key == '코스닥'): ################# 이미지 파일을 => 복사해서 클립보드에 저장 후 붙여넣기 if key == '코스피': filepath = f'{nowDate}일자 kospi.png' else: filepath = f'{nowDate}일자 kosdac.png' image = Image.open(filepath) output = BytesIO() image.convert("RGB").save(output, "BMP") data = output.getvalue()[14:] output.close() send_to_clipboard(win32clipboard.CF_DIB, data) actions = ActionChains(chrome) actions.key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()
우선 해결은 윈도우에서만 가능한 방법이긴 하지만 윈도우 클립보드와 send_keys 함수를 이용하여 해결하였다.
1. 크롤링해서 따온 이미지 링크 첨부
img 태그에 있는 src ="" 링크 부분을 복사하여 메일 쓰기 본문에 send_keys를 이용하여 붙여넣기 하였다.
하지만 링크만 붙여넣기 될 뿐 이미지가 삽입되지는 않았다.
2. pyperclip 사용
우선 from PIL import Image 를 이용하여 이미지를 변수에 저장한 후에 pyperclip.copy(변수) 를 이용하여
해결하고자 하였다. 하지만 pyperclip은 이미지 copy를 지원하지 않아 해결하지 못했다.
>> 해결방법은 윈도우 환경에서 밖에 작동되지 않아 mac 을 쓰는 사람들은 사용할 수가 없는 방법이다.. 따라서 또 열심히 구글링 해본 결과 pyauto 를 이용하여 자동화를 하면 되지 않을까 싶었다.
완벽하게 구현한 것은 아니지만 이미지를 업로드 할 수는 있었다..
import pyautogui # 네이버 로그인 chrome = webdriver.Chrome('chromedriver') chrome.implicitly_wait(10) # 요소 찾을 때 기다리기 chrome.set_window_size(800,1000) # 1.페이지 접속 chrome.get("https://www.naver.com") # 2. 로그인 창 접속 login_link = chrome.find_element(By.CLASS_NAME, 'link_login') login_link.click() # 3. 아이디,pwd 입력 script = """ document.getElementById('id').value = 'your_id' document.getElementById('pw').value = 'your_pw' """ chrome.execute_script(script) # 5. 로그인 버튼 클릭 login_btn = chrome.find_element(By.ID, "log.login") login_btn.click() chrome.find_element(By.CSS_SELECTOR,'li.nav_item').click() chrome.find_element(By.CSS_SELECTOR,'a.button_write').click() el = chrome.find_element(By.CSS_SELECTOR,'#user_input_1') el.click() el.send_keys('your e-mail') time.sleep(2) chrome.find_element(By.ID,'subject_title').send_keys('자동화 메일 테스트 제목') time.sleep(3) chrome.switch_to.frame(chrome.find_element(By.XPATH, '//*[@id="content"]/div[3]/div/div[2]/div/div[3]/iframe')) input_sum = chrome.find_element(By.XPATH,'/html/body/div/div[1]') input_sum.send_keys('gooooooood!') chrome.switch_to.parent_frame() pyautogui.moveTo(1400,220,1) time.sleep(1) pyautogui.dragTo(400,700,2,button='left') time.sleep(3) chrome.find_element(By.CLASS_NAME,'button_write_task').click()
이 부분은 네이버 로그인부터 네이버 메일로 들어가 이미지를 삽입하여 보내는 과정만 따로 구현한 코드이다.
pyauto를 이용하여 바탕화면에 다운 받아놓은 차트 이미지 위치를 찾아 메일쓰기 본문으로 dragTo를 이용하여 끌고와서 업로드를 하는 방식이다. 그 후 업로드 되는 시간이 조금 걸리니 time.sleep(3) 을 이용하여 약간의 대기를 한 후에 메일 보내기 버튼을 클릭하도록 구현하였다.
하지만 이 방법은 각자 환경마다 설정 값을 바꿔줘야 하는 일종의.. 노가다(?) 라는 점 때문에 pyauto 기능 중에 이미지 위치를 반환해주는
locateonscreen() 함수나 , 이미지 중앙 위치 값을 반환해주는 locatecenteronscreen() 함수를 이용하고 ,
이미지 파일을 다운 받을 때, os 모듈을 이용해 원하는 경로로 다운이 받아지도록 코드를 구현하면 더 좋을 것 같다는 생각을 하였다.
'About_Datascience > Project' 카테고리의 다른 글
[Crawliing Project _ 회고_ 어려웠던 부분(1) iframe안으로 이동] (0) 2023.01.24 [Crawling Project_급등된 주가에 대한 기사 분석 및 자료 메일링 서비스_최종코드] (0) 2023.01.24