ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 모듈을 이용해 원하는 경로로 다운이 받아지도록 코드를 구현하면 더 좋을 것 같다는 생각을 하였다. 

Designed by Tistory.