実現したいこと
Pythonでジモティーのキーワードを、文字列ではなくkeywords.txtから読み取るようにしました。
でも実行すると、途中までは問題なく処理されていますが、しばらくすると下記のエラーが表示されます。
対処法をご存知の方がいらっしゃいましたらご連絡お願いします。
発生している問題・エラーメッセージ
エラーメッセージ Traceback (most recent call last): File "C:\Users\user\scraping_batch\requirements\zimoti_scraping.py", line 120, in <module> export_csv(sys.argv) File "C:\Users\user\scraping_batch\requirements\zimoti_scraping.py", line 117, in export_csv subprocess.run(['open', csv_path]) File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.1008.0_x64__qbz5n2kfra8p0\Lib\subprocess.py", line 548, in run with Popen(*popenargs, **kwargs) as process: ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.1008.0_x64__qbz5n2kfra8p0\Lib\subprocess.py", line 1024, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.1008.0_x64__qbz5n2kfra8p0\Lib\subprocess.py", line 1509, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。
該当のソースコード
zimoti_scraping.py
python
1import os.path 2 3from bs4 import BeautifulSoup 4import datetime 5import requests 6import csv 7import subprocess 8import sys 9import urllib 10import time 11from datetime import datetime 12from datetime import timedelta 13import subprocess 14 15mather_list = [] 16exclude_player = "石川 太郎" 17pages = 2 18 19 20def mkdir_if_not_exists(path: str) -> None: 21 if not os.path.exists(path): 22 os.mkdir(path) 23 24def get_date(date, subdate=None): 25 if subdate is not None: 26 date = date - subdate 27 return (str(date.month) + "月" + str(date.day) + "日") 28 29def add_csv_rows(writer, category, keyword, date_from, date_to): 30 #keyword = urllib.parse.quote(keyword) 31 num = 1 32 while num <= pages: 33 r = requests.get("https://jmty.jp/all/" + category + "/p-" + str(num) + "?keyword=" + keyword) 34 # HTMLソースを取得 35 soup = BeautifulSoup(r.text, "html.parser") 36 # ソース内の"li"をすべて取得 37 lis = soup.find_all(class_="p-articles-list-item") 38 # もし、更新日がdate_fromからdate_toの間であれば、その投稿のタイトル、URL、更新日を取得 39 try: 40 for li in lis: 41 div = li.find("div", class_="p-item-additional-info").find("div", class_="u-margin-xs-b") 42 post_date = div.text.replace("\n","") 43 post_date_pro = datetime.strptime(post_date.replace("更新",""), '%m月%d日').date() 44 if datetime.strptime(date_from,"%m月%d日").date() <= post_date_pro <= datetime.strptime(date_to,"%m月%d日").date(): 45 list1 = [] 46 title_item = li.find("div", class_="p-item-content-info")\ 47 .find("div", class_="p-item-title") 48 if title_item is None: 49 continue 50 title = title_item.find("a") 51 if title is None: 52 continue 53 url = title.get("href") 54 player_text = requests.get(url) 55 players_conversation = requests.get(url + "/inquiry") 56 sorce = BeautifulSoup(player_text.text, "html.parser") 57 user = sorce.find(class_ = "u-margin-xl-b") 58 user_name = user.find("a") 59 old_list = sorce.find_all(class_="p-article-column-value") 60 count = 0 61 if user_name.text not in exclude_player: 62 for old in old_list: 63 if "〜" and "歳" in old.text: 64 if old.text[6] == "\n" or int(old.text[6] + old.text[7]) >= 31: 65 count = 1 66 print(title.text) 67 print(url) 68 print(post_date) 69 list1.extend([str(title.text),str(url),str(post_date)]) 70 if list1 not in mather_list: 71 mather_list.append(list1) 72 else: 73 count = 2 74 if count == 0: 75 print(title.text) 76 print(url) 77 print(post_date) 78 list1.extend([str(title.text),str(url),str(post_date)]) 79 if list1 not in mather_list: 80 mather_list.append(list1) 81 except Exception: 82 pass 83 num += 1 84 85def export_csv(args): 86 # 取得開始日を取得。コマンド例: python zimoti_scraping.py 2(n日前から) 87 import datetime 88 from_days = 1 if len(args) < 2 else int(args[1]) 89 date_from = get_date(datetime.date.today(), datetime.timedelta(days=from_days)) 90 # 取得終了日を取得 91 date_to = get_date(datetime.date.today()) if len(args) < 3 else get_date(datetime.date.today(),datetime.timedelta(days=int(args[2]))) 92 del datetime 93 # csvをセット 94 csv_path = 'csv/' + date_to + ".csv" 95 categories = ["com", "coop"] 96 # keywords = "プログラミング,Laravel,php,python,パソコン" 97 keywords = "" 98 program_keywords = "" 99 with open('keywords.txt','r', encoding='utf-8') as f: 100 lines = f.readlines() 101 program_keywords = lines[0] 102 # marketing_keywords = " youtube,脱サラ,起業,副業,動画,動画編集,運営,イベント運営,集客" 103 keywords += program_keywords 104 # if True: 105 # keywords += marketing_keywords 106 # keywords="脱サラ,起業,コミュニティ,運営,イベント運営,集客" 107 # keywords = "html,css,javascript,vue.js,laravel,php,python,プログラミング,フリーランス,エンジニア,プログラマー" 108 mkdir_if_not_exists("csv") 109 with open(csv_path, "w", encoding='utf-8', errors='replace') as f: 110 writer = csv.writer(f) 111 writer.writerow(["タイトル", "url", "更新日"]) 112 for category in categories: 113 for keyword in keywords.split(","): 114 add_csv_rows(writer, category, keyword, date_from, date_to) 115 time.sleep(1) 116 writer.writerows(mather_list) 117 subprocess.run(['open', csv_path]) 118 119if __name__ == "__main__": 120 export_csv(sys.argv)
keywords.txt
html,css,javascript,vue.js,laravel,php,プログラミング,フリーランス,エンジニア,プログラマー,sass,node.js,js
試したこと
https://teratail.com/questions/354502
ファイルのパスが違う?のかと思い、確認しましたが問題なさそうです。
「発生している問題・エラーメッセージ」でエラーが発生しているのは下記コードですが、
> subprocess.run(['open', csv_path], shell=False)
「該当のソースコード」では下記コードに変わっているようです。
> subprocess.run(['open', csv_path])
「該当のソースコード」で「発生している問題・エラーメッセージ」が起きたのでしょうか?もしかして古いコードを掲載していたりしませんか?
すみません、間違っていました。該当のソースコードを「subprocess.run(['open', csv_path])」に修正しました。
お使いの OS は Windows の様ですが、open コマンドは macos のコマンドかと思います。Windows の場合は start コマンドで代用できるかもしれません。
openコマンド?「該当のソースコード」で記載したコードの「open」であれば、startに変更してみましたが実行前エラーになるようです。
("start" is not definedPylancereportUndefinedVariable
(function) start: Any)
> 「該当のソースコード」で記載したコードの「open」であれば
「subprocess.run(['open', csv_path])」
の「open」です
「with open(...」の「open」ではありません
(それは変えちゃダメ)
> ("start" is not definedPylancereportUndefinedVariable (function) start: Any)
コードのどこをどのように変えたのでしょうか?
