前提・実現したいこと
pythonで、tkinterでキーワードを入力するインターフェイスを作成して( getut_data.py)、別ファイル(scrape_u_t.py)で入力されたキーワードを元に、Google検索結果からURLとタイトルを抜き出してデスクトップにCSVを保存するプログラムを作成しました。
virtualenvでpython環境を構築した後、必要な外部ライブラリとpy2appをインストールして、setup.pyをつくってpy2appでMac用アプリを作りました
Pycharmやターミナルから実行すると、問題なくCSVを書き出すことができたので、py2appでMac用アプリを作ったところ、作成されるappが拡張子のアプリをダブルクリックで起動したときには、titileとURLの項目だけ記述されたCSVが作成されました。
アプリのパッケージを開き、MacOSの中にあるプログラムをターミナルで起動してみると、問題なくデータが抽出されて、保存されたCSVには、きちんとデータが保存されています。
ネットでも調べてみたのですが、GUIは環境変数のPATHが通っていないという記事をみつけたものの、関係があるのかどうかもわからず、そのやり方もわからなかったので、藁をも掴む思いで質問しました。
解決の糸口になるようなアドバイスをお願いします。
該当のソースコード
getut_data.py
python
1import tkinter as tk 2import scrape_t_u 3 4class Application(tk.Frame): 5 def __init__(self, master=None): 6 super().__init__(master) 7 self.master.geometry() 8 self.master.title('Get URL and TITLE') 9 10 self.entry = tk.Entry(self.master, width=40) 11 12 self.menu_bar = tk.Menu(self.master) 13 self.master.config(menu=self.menu_bar) 14 15 self.create_widgets() 16 17 def clear_all(self): 18 self.entry.delete(0, tk.END) 19 20 def search(self): 21 keywords = self.entry.get() 22 scrape_t_u.main(keywords) 23 24 def create_widgets(self): 25 file_menu = tk.Menu(self.menu_bar) 26 file_menu.add_command(label='Exit', command=self.master.quit) 27 self.menu_bar.add_cascade(label='File', menu=file_menu) 28 self.entry.grid(row=1, column=1, columnspan=6, pady=10, padx=10) 29 self.entry.focus_set() 30 31 tk.Button(self.master, text='Clear', width=4, 32 command=self.clear_all).grid(row=2, column=5) 33 34 tk.Button(self.master, text='抽出', width=4, 35 command=self.search).grid(row=2, column=6, pady=10) 36 37root = tk.Tk() 38app = Application(master=root) 39app.mainloop()
scrape_u_t.py
import csv import os import re import urllib.parse from bs4 import BeautifulSoup import requests DESKTOP_PATH = os.getenv('HOME') + '/Desktop/url_title.csv' def main(keywords): r = requests.get('https://www.google.co.jp/search?hl=jp&gl=JP&num=10&q=' + keywords) html_soup = BeautifulSoup(r.content, 'html.parser') url_results = [] for t in html_soup.select('.kCrYT > a'): u_result = re.sub(r'/url?q=|&sa.*', '', t.get('href')) url_results.append(urllib.parse.unquote(u_result)) title_results = [] for i in url_results: try: search = requests.get(i) search_soup = BeautifulSoup(search.content, 'html.parser') titles = search_soup.find('title') title_results.append(titles.text) except: print('取得できませんでした。') with open(DESKTOP_PATH, 'w') as csv_file: fieldnames = ['TITLE', 'URL'] writer = csv.DictWriter(csv_file, fieldnames=fieldnames) writer.writeheader() for t, u in zip(title_results, url_results): writer.writerow({'TITLE': t, 'URL': u}) if __name__ == '= '__main__': main()
setup.py
from setuptools import setup APP = ['getut_data.py'] DATA_FILES = ['scrape_t_u.py'] OPTIONS = {} setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], )
試したこと
virtualenvで環境構築し、外部ライブラリのpy2appとrequesteとbeautifulsoup4をpipインストールして、py2appでsetup.pyを実行して作成しました。
補足情報
Macos 11.1
MacBook pro 2018 13inch
Pycharm
python3.7
あなたの回答
tips
プレビュー