야후옥에서 과거에 구입한 상품을 자동으로 PDF에 저장하는 도구 [Python]

도전



야후옥에서 상품을 구입한 경우, 기본적으로 영수증은 발행되지 않습니다. 그러므로 증명할 것이 없으면 경비로 떨어지지 않을 수 있습니다. 이 해결책은 거래 화면을 캡처하는 방법입니다. 하지만 한 개 한 개를 수작업으로 하는 것은 상당한 고행입니다 😌

이번에는 ChromeDriver를 사용하여 자동화하고 싶습니다.

운영 환경
Mac OS Mojave
파이썬 3.7.6
VSCode
ChromeDriver

처리 흐름



①【야후옥에 자동 로그인】

②【상품별 낙찰의 거래 화면을 연다】

③【PDF로 변환】

④【지정 파일에 저장】

처리 후의 예





소스 코드는 이쪽


from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time 
import json
import sys

username= "ユーザー名"
password="パスワード"

def main():
 #ヤフオクのURL
driver.get('https://login.yahoo.co.jp/config/login?.src=auc&.done=https%3A%2F%2Fauctions.yahoo.co.jp%2F' ) 
 #自動ログイン
   driver.find_element_by_id("username").send_keys(username)
   driver.find_element_by_id("btnNext").click()
   time.sleep(1)
   driver.find_element_by_id("passwd").send_keys(password)
   driver.find_element_by_id("btnSubmit").click()
 #driver.find_element_by_id("").click() *ポップアップ広告が出た時

   driver.find_element_by_xpath('//*[@id="yjMain"]/div/div[2]/div[2]/div/div[2]/table/tbody/tr[3]/td[1]/a').click()
   time.sleep(1)
 #次へのボタンがなくなるまでループ  

   while True:
     try:
        if len(driver.find_elements_by_xpath("//img[@src='https://s.yimg.jp/images/auct/template/ui/search/arrow_next.gif']")) > -1:
               print("start PDF")
               item_list= []
               for item in driver.find_elements_by_css_selector('p.decTxt01'):
                   try:
                       link = item.find_element_by_tag_name("a").get_attribute("href")
                   except:
                       link = "skip"    
                   item_list.append(link)

               for link in item_list:
                   try:
                           driver.get(link)
                           time.sleep(2)
                           driver.find_element_by_class_name('decIcoArw').click()
                           time.sleep(2)
                           driver.execute_script('return window.print()')
                           driver.back()
                   except :
                           print("None")
               btn = driver.find_element_by_link_text("次の50件").get_attribute("href")
               print(btn)
               print("next url:{}".format(btn))
               driver.get(btn)
               print("Next page") #強制的に終了
     except:
           sys.exit()
 #印刷を無理やりPDF保存する設定

chopt=webdriver.ChromeOptions()
appState = {
   "recentDestinations": [
       {
           "id": "Save as PDF",
           "origin": "local",
           "account":"" #Chrome (78.0.3904.108)は、必要
       }
   ],
   "selectedDestinationId": "Save as PDF",
   "version": 2
}

prefs = {'printing.print_preview_sticky_settings.appState': 
json.dumps(appState)}
chopt.add_experimental_option('prefs', prefs)
chopt.add_argument('--kiosk-printing')
driver = webdriver.Chrome(executable_path='chromedriverのディレクトリ ',options=chopt)
 #処理実行
if __name__ == '__main__':
   main()
 #*注意点

掲示板にて、取引をしている場合のみは、手作業でのPDF保存になります。


먼저 selenium, time, json,sys를 가져옵니다.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time 
import json
import sys

야후옥 로그인 화면에서 자동으로 로그인합니다. 서버에 부하를 가하지 않도록 time.sleep(1)로 1초간만 시간을 두고 있습니다.
def main():
 #ヤフオクのURL
driver.get('https://login.yahoo.co.jp/config/login?.src=auc&.done=https%3A%2F%2Fauctions.yahoo.co.jp%2F' ) 
 #自動ログイン
   driver.find_element_by_id("username").send_keys(username)
   driver.find_element_by_id("btnNext").click()
   time.sleep(1)
   driver.find_element_by_id("passwd").send_keys(password)
   driver.find_element_by_id("btnSubmit").click()
 #driver.find_element_by_id("記入").click() *ポップアップ広告が出た時

   driver.find_element_by_xpath('//*[@id="yjMain"]/div/div[2]/div[2]/div/div[2]/table/tbody/tr[3]/td[1]/a').click()
   time.sleep(1)

다음 페이지가 사라질 때까지 자동으로 페이지 전환을 반복합니다.
 #次へのボタンがなくなるまでループ  

   while True:
     try:
        if len(driver.find_elements_by_xpath("//img[@src='https://s.yimg.jp/images/auct/template/ui/search/arrow_next.gif']")) > -1:
               print("start PDF")
               item_list= []
               for item in driver.find_elements_by_css_selector('p.decTxt01'):
                   try:
                       link = item.find_element_by_tag_name("a").get_attribute("href")
                   except:
                       link = "skip"    
                   item_list.append(link)

               for link in item_list:
                   try:
                           driver.get(link)
                           time.sleep(2)
                           driver.find_element_by_class_name('decIcoArw').click()
                           time.sleep(2)
                           driver.execute_script('return window.print()')
                           driver.back()
                   except :
                           print("None")
               btn = driver.find_element_by_link_text("次の50件").get_attribute("href")
               print(btn)
               print("next url:{}".format(btn))
               driver.get(btn)
               print("Next page") #強制的に終了
     except:
           sys.exit()

ChromeOptions를 사용하면 인쇄를 강제로 중지하여 PDF 저장을 자동으로 할 수 있습니다.
#印刷を無理やりPDF保存する設定

chopt=webdriver.ChromeOptions()
appState = {
   "recentDestinations": [
       {
           "id": "Save as PDF",
           "origin": "local",
           "account":"" #Chrome (78.0.3904.108)は、必要
       }
   ],
   "selectedDestinationId": "Save as PDF",
   "version": 2
}

prefs = {'printing.print_preview_sticky_settings.appState': 
json.dumps(appState)}
chopt.add_experimental_option('prefs', prefs)
chopt.add_argument('--kiosk-printing')
driver = webdriver.Chrome(executable_path='chromedriverのディレクトリ ',options=chopt)
 #処理実行
if __name__ == '__main__':
   main()

결론



야후옥의 데이터는 90일로, 갱신되어 가므로, 3개월마다 이 툴을 사용해 가고 싶습니다. Xpath로 요소를 지정하고 있는 개소는, 다음에 사용할 때에 바뀌고 있을지도 모릅니다만… 🤗(2020/5/25 동작 확인이 끝난 상태)

좋은 웹페이지 즐겨찾기