やりたいこと
PythonでTkinterを使って巡回するURLや読み込むタイミングの日時などを設定し
並列処理で最大2ヶ所のURLをスクレイピングするプログラムを作っています。
以前にも質問をさせてもらってhayataka2049さんに教えてもらった方法で
無事に並列処理はできるようになったのですが、せっかくなのでGUIを使って
アプリケーションみたいに使いたいと思ってTkinterでGUIを作りました。
しかし、1ヶ所の巡回はできるのに、2ヶ所同時に巡回することができません。
自分なりに順を追って調べた結果、URLなどのデータをTkinterのウイジェットから
読み込むタイミングでちゃんと読み込めていないようです。
試したコード
import os import time import sched import concurrent.futures from datetime import datetime from datetime import timedelta from selenium import webdriver import tkinter as tk import tkinter.ttk as ttk # URL def url_select(u): if u == "Google": url = ("https://www.google.com/") elif u == "Yahoo!": url = ("https://www.yahoo.co.jp/") return url def scrap1(url, stop, delay): while (1): dt = datetime.now() et = dt.strftime("%Y/%m/%d %H:%M:%S") if str(dt.second) == delay: driver_path = "C:/Users/takak/Downloads/chromedriver.exe" driver = webdriver.Chrome(driver_path) driver.get(url) time.sleep(1) driver.quit() elif et >= stop: break def scrap2(url, stop, delay): while (1): dt = datetime.now() et = dt.strftime("%Y/%m/%d %H:%M:%S") if str(dt.second) == delay: driver_path = "C:/Users/takak/Downloads/chromedriver.exe" driver = webdriver.Chrome(driver_path) driver.get(url) time.sleep(1) driver.quit() elif et >= stop: break class Application(tk.Frame): def __init__(self, master): super().__init__(master) self.pack() self.master.geometry("300x150") self.master.title("てすと") self.widget() def widget(self): self.frame = ttk.Frame(self) self.frame.pack(anchor="nw", side="top") # self.button1 = tk.Button(self.frame, width=12, text="Start", command=callback) # 実行中押されたままになる self.button1 = Start_button(self.frame, width=12, text="Start") # 押した時に状態が変化しない実行されたどうかわからない self.button1.grid(row=0, column=2, padx=10, pady=10) self.bln1 = tk.BooleanVar() self.bln1.set(True) self.chk_url1 = tk.Checkbutton(self.frame, variable=self.bln1, text="URL 1") self.chk_url1.grid(row=1, column=0, padx=10, pady=10) self.url1_combo = ttk.Combobox(self.frame, width=10, state="readonly") self.url1_combo["values"] = ("Google", "Yahoo!") self.url1_combo.current(0) self.url1_combo.grid(row=1, column=1, padx=10, pady=10) self.bln2 = tk.BooleanVar() self.bln2.set(True) self.chk_url2 = tk.Checkbutton(self.frame, variable=self.bln2, text="URL 2") self.chk_url2.grid(row=2, column=0, padx=10, pady=10) self.url2_combo = ttk.Combobox(self.frame, width=10, state="readonly") self.url2_combo["values"] = ("Google", "Yahoo!") self.url2_combo.current(1) self.url2_combo.grid(row=2, column=1, padx=10, pady=10) # 読み込みスタートボタンクラスを使うとボタンの状態が変化しない????? class Start_button(tk.Button): def __init__(self, master=None, cnf={}, **kw): tk.Button.__init__(self, master, cnf, **kw) self.bind("<Button-1>", callback) # スクレイピング1 # def scraping1(): # テスト1 & テスト2 def scraping1(url1): # URLの設定 # url1 = "https://www.google.com/" # テスト1 # URL_1 = app.url1_combo.get() # テスト2 # url1 = url_select(URL_1) # 開始&終了時間の設定 実際のコードでは、日付と時間の設定もGUIで設定 start_time1 = "2020/06/04 16:14:00" stop_time1 = "2020/06/04 16:15:00" delay_time1 = "0" # スケジューラー scheduler = sched.scheduler(time.time, time.sleep) run = datetime.strptime(start_time1, "%Y/%m/%d %H:%M:%S") run = int(time.mktime(run.utctimetuple())) scheduler.enterabs(run, 1, scrap1, (url1, stop_time1, delay_time1)) scheduler.run() # スクレイピング2 # def scraping2(): # テスト1 & テスト2 def scraping2(url2): # URLの設定 # url2 = "https://www.yahoo.co.jp/" # テスト1 # URL_2 = app.url2_combo.get() # テスト2 # url2 = url_select(URL_2) # 開始&終了時間の設定 実際のコードでは、日付と時間の設定もGUIで設定 start_time2 = "2020/06/04 16:14:00" stop_time2 = "2020/06/04 16:15:00" delay_time2 = "30" # スケジューラー scheduler = sched.scheduler(time.time, time.sleep) run = datetime.strptime(start_time2, "%Y/%m/%d %H:%M:%S") run = int(time.mktime(run.utctimetuple())) scheduler.enterabs(run, 1, scrap2, (url2, stop_time2, delay_time2)) scheduler.run() # 並行処理 # def callback(): def callback(event): patrol1 = app.bln1.get() patrol2 = app.bln2.get() # URL_1 = app.url1_combo.get() # テスト3 # url1 = url_select(URL_1) # URL_2 = app.url2_combo.get() # テスト3 # url2 = url_select(URL_2) if patrol1 == True and patrol2 == False: print("スクレイピング・テスト1") URL_1 = app.url1_combo.get() # テスト4 url1 = url_select(URL_1) # scraping1() scraping1(url1) elif patrol1 == True and patrol2 == True: with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: print("スクレイピング・テスト2") URL_1 = app.url1_combo.get() # テスト4 url1 = url_select(URL_1) # executor.submit(scraping1()) executor.submit(scraping1(url1)) URL_2 = app.url2_combo.get() # テスト4 url2 = url_select(URL_2) # executor.submit(scraping2()) executor.submit(scraping2(url2)) if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()
やってみたこと
はじめに、テスト1としてURLを並列処理を実行する関数 def scraping1(): とdef scraping2():に
直接記入して実行、無事に並列処理を実行できる。
次に、テスト2として1と同じ位置でget()関数を使って読み込み先を選択
def url_select(u): でURLを選択して実行
1ヶ所目は実行できるが2か所目が実行できない。
get()で読み込むタイミングをテスト3、4と変えてみたがすべて同じで2か所目のURLを取得できません。
2か所目の設定を取得するには、どうすればいいのでしょうか
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/05 03:48
2020/06/05 04:19
2020/06/05 15:24