見出し画像

ヤフオクの購入した商品データを自動でPDFに保存する領収書ツールを作った。

課題

ヤフオクで商品を買った場合、基本的には、領収書は発行されません。そのため、証明するものがない場合、経費として落ちないことがあります。この対処法として、取引画面のキャプチャという方法があります。しかし、一個一個を手作業でやるのは、かなりの苦行です😌

今回は、ChromeDriverを使って、自動化していきたいと思います。

***動作環境***
Mac OS Mojave
Python 3.7.6
VSCode
ChromeDriver

処理の流れ


①【ヤフオクに自動ログイン】

②【商品毎の落札の取引画面を開く】

③【PDFに変換】

④【指定のファイルに保存】


処理後の例

ダウンロード (2)

スクリーンショット 2020-05-25 15.51.17



ソースコードはこちら

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 動作確認済み)

Twitterでできるだけ、有益な情報を呟いているので、フォローおねしゃす!





この記事が気に入ったらサポートをしてみませんか?