質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

0回答

709閲覧

pyファイルのexe化ができない。

shozoy

総合スコア2

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2021/04/04 08:44

前提・実現したいこと

Youtubeなどを参考にし、独学でpythonでChromeDriverを使用し、Google Chromeを自動操作するシステムを作っています。
プログラミングは完全に初心者ですので、温かい目で見て下さると嬉しいです!

jupyter labで記述、動作確認をしたのちに、pyファイルに出力し、
「pyinstaller DEMO3.py」
とAnaconda Promptに記述し、exe化する際にエラーメッセージが発生しました。

発生している問題・エラーメッセージ

============================================================= A RecursionError (maximum recursion depth exceeded) occurred. For working around please follow these instructions ============================================================= ~投稿の文字数の関係で割愛~

該当のソースコード

python3

1from selenium import webdriver 2from selenium.webdriver.common.by import By 3from selenium.webdriver.support.ui import WebDriverWait 4from selenium.webdriver.support import expected_conditions as EC 5import time 6import pandas as pd 7import os 8import datetime as dt 9import sys 10import random 11 12#再エントリー回数(回) 13retry_count = 10 14#再エントリー待機時間(秒) 15retry_time = 0.5 16#処理最大待機時間(秒) 17wait_time = 3 18#同一判定でもポジション数上限 19order_count = 3 20#ログイン用ファイルパス 21LoginInfoFile = 'LoginInfo.csv' 22#エントリー制限用ファイルパス 23DATAFILE = 'ReEntryInfo.csv' 24#シグナル読み込み用ファイルパス 25SignalFile = 'SignalInfo.csv' 26#ログイン最短時間 27login_short = 120 28#ログイン最長時間 29login_long = 360 30 31now = dt.datetime.now() 32minute = now.minute 33login_flag = False 34count = [1] 35 36#確定足専用判定時間計算自作関数 37def Judge_time(hantei): 38 if hantei != 5 and hantei != 10 and hantei != 15: 39 print('5,10,15のみ使用可能') 40 sys.exit() 41 42 if hantei == 5: 43 hantei = 5 44 elif hantei == 10: 45 hantei = 10 46 elif hantei == 15: 47 hantei = 15 48 49 if minute%5 == 4: 50 judge = now + dt.timedelta(minutes=hantei+1) 51 judgehour_str = judge.strftime('%H') 52 judgeminutes_str = judge.strftime('%M') 53 return judgehour_str +':'+ judgeminutes_str 54 else: 55 add_minute = minute%5 56 judge = now + dt.timedelta(minutes=hantei-add_minute) 57 judgehour_str = judge.strftime('%H') 58 judgeminutes_str = judge.strftime('%M') 59 return judgehour_str +':'+ judgeminutes_str 60 61 62#通貨ペア別に合わせて判定時間選択する自作関数 63def Choose_Currency(dig1,dig2,dig3): 64 time_dig1 = browser.find_element_by_id(str(dig1)) 65 time_dig2 = browser.find_element_by_id(str(dig2)) 66 time_dig3 = browser.find_element_by_id(str(dig3)) 67 if jd_time == time_dig1.text[-5:]: 68 time_dig1.click() 69 return ('判定時間選択成功') 70 elif jd_time == time_dig2.text[-5:]: 71 time_dig2.click() 72 return print('判定時間選択成功') 73 elif jd_time == time_dig3.text[-5:]: 74 time_dig3.click() 75 return print('判定時間選択成功') 76 else: 77 return print('判定時間選択失敗') 78 79if login_flag == False: 80 # ~ログイン~ GoogleChromeを起動 81 browser = webdriver.Chrome('chromedriver.exe') # Windows 82 browser.implicitly_wait(3) 83 # ログインページするサイトへアクセス 84 url_login = "https://trade.highlow.com/" 85 browser.get(url_login) 86 time.sleep(3) 87 quick_demo = browser.find_element_by_class_name('iWrapper') 88 quick_demo.click() 89 time.sleep(3) 90 start_demo = browser.find_element_by_xpath('/html/body/div[1]/div/div/nav/div/div/div/div/div[2]/div/div[1]/a') 91 start_demo.click() 92 df_log = pd.DataFrame({'CurrentTime':now},index=['i']) 93 df_log.to_csv(LoginInfoFile) 94 print("デモ取引ログイン成功") 95 login_flag = True 96# #前回のログイン日時のcsv読み込み 97if os.path.isfile(LoginInfoFile): 98 csv_log = pd.read_csv(LoginInfoFile, encoding = 'shift-jis') 99 pre_logtime = csv_log.iloc[0,1] 100 prelogtime_dt = dt.datetime.strptime(pre_logtime,'%Y-%m-%d %H:%M:%S.%f') 101 interval = random.randint(login_short, login_long) 102 log_interval = prelogtime_dt + dt.timedelta(minutes=interval) 103 #再ログイン処理 104 if now > log_interval: 105 browser.close() 106 browser = webdriver.Chrome('chromedriver.exe') # Windows 107 browser.implicitly_wait(3) 108 url_login = "https://trade.highlow.com/" 109 browser.get(url_login) 110 time.sleep(3) 111 quick_demo = browser.find_element_by_class_name('iWrapper') 112 quick_demo.click() 113 time.sleep(3) 114 start_demo = browser.find_element_by_xpath('/html/body/div[1]/div/div/nav/div/div/div/div/div[2]/div/div[1]/a') 115 start_demo.click() 116 df_log = pd.DataFrame({'CurrentTime':now},index=['i']) 117 df_log.to_csv(LoginInfoFile) 118 print("デモ取引再ログイン成功") 119 120if os.path.isfile(SignalFile): 121 #シグナル読み込み 122 df_csv = pd.read_csv(SignalFile, encoding = 'shift-jis', names = ['通貨ペア','注文', '取引','判定', '金額','時間']) 123 df_csv.index = ['signal'] 124 #取引方法選択 125 # HighLow 126 if df_csv.loc['signal','取引'] == 'HL': 127 browser_from = WebDriverWait(browser, wait_time).until(EC.element_to_be_clickable((By.ID, "ChangingStrike"))) 128 browser_from.click() 129 print("取引方法「HighLow」選択成功") 130 currency = df_csv.loc['signal','通貨ペア'] 131 #GOLDの場合 132 if currency == 'XAUUSD': 133 currency_str = 'GOLD' 134 else: 135 currency01 = currency[0:3] 136 currency02 = currency[3:6] 137 currency_str = currency01 + '/' + currency02 138 #通貨ペア選択BOXを押す 139 asset = WebDriverWait(browser, wait_time).until(EC.element_to_be_clickable((By.CLASS_NAME, 'asset-filter'))) 140 asset.click() 141 #通貨ペア入力 142 asset_box = WebDriverWait(browser, wait_time).until(EC.element_to_be_clickable((By.ID, 'searchBox'))) 143 asset_box.click() 144 asset_box.clear() 145 asset_box.send_keys(currency_str) 146 asset_element = WebDriverWait(browser, wait_time).until(EC.element_to_be_clickable((By.ID, 'assetsFilteredList'))) 147 asset_element.click() 148 print('通貨ペア'+ currency_str +'選択成功') 149 #判定時間計算(HighLow) 150 hantei_time = df_csv.loc['signal','判定'] 151 if hantei_time == 5 or hantei_time == 10 or hantei_time == 15: 152 jd_time = Judge_time(hantei_time) 153 print(jd_time) 154 #同一判定のエントリー数制御 155 df_jd = pd.DataFrame({'time':jd_time,'count':count}) 156 if os.path.isfile(DATAFILE): 157 csv_jd = pd.read_csv(DATAFILE, encoding = 'shift-jis',usecols=[1,2]) 158 pre_jdtime = csv_jd.iloc[0,0] 159 if pre_jdtime != jd_time: 160 os.remove(DATAFILE) 161 else: 162 ct_jd = csv_jd.count(axis='index') 163 ct_jd = ct_jd[1] 164 if ct_jd >= order_count: 165 print('ポジション数の上限が超過しました。') 166 sys.exit() 167 #DEMO判定時間選択 168 if currency_str == 'AUD/JPY': 169 ~投稿の文字数の関係で割愛~ 170 elif currency_str == 'USD/JPY': 171 Choose_Currency(3272,3273,3274) 172 elif currency_str == 'GOLD': 173 Choose_Currency(3365,3366,3367) 174 #エントリー 175 amount = df_csv.loc['signal','金額'] 176 amount_int = int(amount) 177 order = df_csv.loc['signal','注文'] 178 179 if amount >= 1000 and amount <= 200000: 180 amount_box = browser.find_element_by_id('amount') 181 amount_box.clear() 182 amount_box.send_keys(amount_int) 183 if order == 'BUY': 184 high_btn = WebDriverWait(browser, wait_time).until(EC.element_to_be_clickable((By.ID, 'up_button'))) 185 high_btn.click() 186 for i in range(retry_count): 187 entrynotify = browser.find_element_by_xpath('/html/body/div[2]/div/div/div/div/div/div[2]/section[3]/div/ul/li/section[2]/div/section/section[2]/div/div/div/span') 188 entrynotify_text = entrynotify.text 189 if entrynotify_text == '成功': 190 print(str(i)+'回目'+'Highエントリー成功') 191 if pre_jdtime != jd_time: 192 df_jd.to_csv(DATAFILE) 193 os.remove(SignalFile) 194 break 195 else: 196 df_jd.to_csv(DATAFILE,mode='a',header=False) 197 os.remove(SignalFile) 198 break 199 invest_btn = WebDriverWait(browser, wait_time).until(EC.element_to_be_clickable((By.ID, 'invest_now_button'))) 200 invest_btn.click() 201 time.sleep(retry_time) 202 elif order == 'SELL': 203 low_btn = WebDriverWait(browser, wait_time).until(EC.element_to_be_clickable((By.ID, 'down_button'))) 204 low_btn.click() 205 for i in range(retry_count): 206 entrynotify = browser.find_element_by_xpath('/html/body/div[2]/div/div/div/div/div/div[2]/section[3]/div/ul/li/section[2]/div/section/section[2]/div/div/div/span') 207 entrynotify_text = entrynotify.text 208 if entrynotify_text == '成功': 209 print(str(i)+'回目'+'Lowエントリー成功') 210 if pre_jdtime != jd_time: 211 df_jd.to_csv(DATAFILE) 212 os.remove(SignalFile) 213 break 214 else: 215 df_jd.to_csv(DATAFILE,mode='a',header=False) 216 os.remove(SignalFile) 217 break 218 invest_btn = WebDriverWait(browser, wait_time).until(EC.element_to_be_clickable((By.ID, 'invest_now_button'))) 219 invest_btn.click() 220 time.sleep(retry_time)

試したこと

エラーコードにもあるように、再帰の最大回数を上げてみましたが、ダメでした。

「import pandas as pd」

の記述を消すと一応exe化できましたが

WARNING: The output directory "C:\Users\10sho\dist\DEMO3" and ALL ITS CONTENTS will be REMOVED! Continue? (y/N)

と出るのでダメなのだと判断しました。

見づらいコードで読みにくいと思いますが、何卒よろしくお願い申し上げます。

補足情報(FW/ツールのバージョンなど)

Anaconda3
python3
jupyter lab
windows10 64bit

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stdio

2021/04/05 03:22

まず、exe化したい理由がよくわかりません。 ダブルクリックのみで動作したいとのことでしたら、Windowsバッチを利用されてはいかがですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問