🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

2199閲覧

Python Webスクレイピングにおけるscheduleモジュール実行時のエラー

SMRKW

総合スコア2

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2021/02/24 05:12

編集2021/02/24 06:53

前提・実現したいこと

Pythonを活用したWebスクレイピング処理に関して、
scheduleモジュールを活用した定時処理を行いたいと考えています。

Webスクレイピング用の関数単体では問題なく動作するのですが、
scheduleモジュールで処理した際にエラーが出てしまいます。
関数の中にtry、exceptを組み込んでいる影響でしょうか。
※if elseに書き換えても同様のメッセージが発生しましたので更新したコードを記載いたします。

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


AttributeError Traceback (most recent call last)
<ipython-input-89-fafa280c5140> in <module>()
2
3 while True:
----> 4 schedule.run_pending()
5 time.sleep(10)

4 frames
/usr/local/lib/python3.7/dist-packages/schedule/init.py in run_pending()
590 :data:default scheduler instance <default_scheduler>.
591 """
--> 592 default_scheduler.run_pending()
593
594

/usr/local/lib/python3.7/dist-packages/schedule/init.py in run_pending(self)
92 runnable_jobs = (job for job in self.jobs if job.should_run)
93 for job in sorted(runnable_jobs):
---> 94 self._run_job(job)
95
96 def run_all(self, delay_seconds=0):

/usr/local/lib/python3.7/dist-packages/schedule/init.py in _run_job(self, job)
145
146 def _run_job(self, job):
--> 147 ret = job.run()
148 if isinstance(ret, CancelJob) or ret is CancelJob:
149 self.cancel_job(job)

/usr/local/lib/python3.7/dist-packages/schedule/init.py in run(self)
489 """
490 logger.debug('Running job %s', self)
--> 491 ret = self.job_func()
492 self.last_run = datetime.datetime.now()
493 self._schedule_next_run()

<ipython-input-5-27f2e83c975b> in scrayping()
13
14 page_1_b = soup1.find("div", {"class":"main-inner-b"})
---> 15 title_1_b = page_1_b.find("h3").text.replace("\u3000","").replace("\n","")
16 overview_1_b = page_1_b.find("p").text.replace("\u3000","").replace("\n","")
17 link_1_b = page_1_b.find("a").get("href")

AttributeError: 'NoneType' object has no attribute 'find'

該当のソースコード

全文記載させていただきます。
・関数の定義
・キーワードのインプット受け付け
・スケジュールモジュールで定時処理
といった構成です。

長文失礼いたします。

python

1def scrayping(): 2 3#page_1 4 5 result1 = requests.get(url1) 6 c1 = result1.content 7 soup1 = BeautifulSoup(c1) 8 9 if soup1.find("div", {"class":"main-inner-a"}) is None: 10 title_1_a = [] 11 overview_1_a = [] 12 link_1_a = [] 13 else: 14 page_1_a = soup1.find("div", {"class":"main-inner-a"}) 15 title_1_a = page_1_a.find("h3").text.replace("\u3000","").replace("\n","") 16 overview_1_a = page_1_a.find("p").text.replace("\u3000","").replace("\n","") 17 link_1_a = page_1_a.find("a").get("href") 18 19 if soup1.find("div", {"class":"main-inner-b"}) is None: 20 title_1_b = [] 21 overview_1_b = [] 22 link_1_b = [] 23 else: 24 page_1_b = soup1.find("div", {"class":"main-inner-b"}) 25 title_1_b = page_1_b.find("h3").text.replace("\u3000","").replace("\n","") 26 overview_1_b = page_1_b.find("p").text.replace("\u3000","").replace("\n","") 27 link_1_b = page_1_b.find("a").get("href") 28 29 title_1_c = [] 30 overview_1_c = [] 31 link_1_c = [] 32 33 try: #cが8個ない場合に対応 34 for i in range(8): 35 page_1_c = soup1.find_all("div", {"class":"main-inner-c"})[i] 36 37 tmp_title = page_1_c.find("h3").text.replace("\u3000","").replace("\n","") 38 title_1_c.append(tmp_title) 39 40 tmp_overview = page_1_c.find_all("p")[2].text.replace("\u3000","").replace("\n","") 41 overview_1_c.append(tmp_overview) 42 43 tmp_link = page_1_c.find("a").get("href") 44 link_1_c.append(tmp_link) 45 46 i += 1 47 except: 48 pass 49 50 title_1_all = pd.DataFrame([title_1_a, title_1_b] + title_1_c) 51 overview_1_all = pd.DataFrame([overview_1_a, overview_1_b] + overview_1_c) 52 link_1_all = pd.DataFrame([link_1_a, link_1_b] + link_1_c) 53 54 page1_df = pd.concat([title_1_all, overview_1_all, link_1_all], axis=1) 55 56#page_2 57 58 result2 = requests.get(url2) 59 c2 = result2.content 60 soup2 = BeautifulSoup(c2) 61 62 title_2_c = [] 63 overview_2_c = [] 64 link_2_c = [] 65 66 try: #cが8個ない場合に対応 67 for i in range(10): 68 page_2_c = soup2.find_all("div", {"class":"main-inner-c"})[i] 69 70 tmp_title = page_2_c.find("h3").text.replace("\u3000","").replace("\n","") 71 title_2_c.append(tmp_title) 72 73 tmp_overview = page_2_c.find_all("p")[2].text.replace("\u3000","").replace("\n","") 74 overview_2_c.append(tmp_overview) 75 76 tmp_link = page_2_c.find("a").get("href") 77 link_2_c.append(tmp_link) 78 79 i += 1 80 except: 81 pass 82 83 title_2_all = pd.DataFrame(title_2_c) 84 overview_2_all = pd.DataFrame(overview_2_c) 85 link_2_all = pd.DataFrame(link_2_c) 86 87 page2_df = pd.concat([title_2_all, overview_2_all, link_2_all], axis=1) 88 89#page_3 90 91 result3 = requests.get(url3) 92 c3 = result3.content 93 soup3 = BeautifulSoup(c3) 94 95 title_3_c = [] 96 overview_3_c = [] 97 link_3_c = [] 98 99 try: #cが8個ない場合に対応 100 for i in range(10): 101 page_3_c = soup3.find_all("div", {"class":"main-inner-c"})[i] 102 103 tmp_title = page_3_c.find("h3").text.replace("\u3000","").replace("\n","") 104 title_3_c.append(tmp_title) 105 106 tmp_overview = page_3_c.find_all("p")[2].text.replace("\u3000","").replace("\n","") 107 overview_3_c.append(tmp_overview) 108 109 tmp_link = page_3_c.find("a").get("href") 110 link_3_c.append(tmp_link) 111 112 i += 1 113 except: 114 pass 115 116 title_3_all = pd.DataFrame(title_3_c) 117 overview_3_all = pd.DataFrame(overview_3_c) 118 link_3_all = pd.DataFrame(link_3_c) 119 120 page3_df = pd.concat([title_3_all, overview_3_all, link_3_all], axis=1) 121 122#total 123 124 page_df = pd.concat([page1_df, page2_df, page3_df], axis=0,ignore_index=True) 125 page_df.columns=["Title","Overview","Link"] 126 page_df.index = np.arange(1, len(page_df)+1) 127 128 page_df.to_excel("result.xlsx") 129 130 today = datetime.datetime.now() 131 today = str(today.year) + "_" + str(today.month) + "_" + str(today.day) + "_" + str(today.hour) 132 133 path1 = 'result.xlsx' 134 path2 = today + "_" + keyword + "_" + period + "_" +'result.xlsx' 135 136 os.rename(path1, path2) 137 138#キーワード受け付け 139 140keyword = input("検索ワードを入力してください。") #Free 141period = input("monthかweekかdayを入力してください。") #[month, week, day] 142 143url1 = "https://runda.jp/search/?q=" + keyword + "&page=1&search_type=" + period 144url2 = "https://runda.jp/search/?q=" + keyword + "&page=2&search_type=" + period 145url3 = "https://runda.jp/search/?q=" + keyword + "&page=3&search_type=" + period 146 147#繰り返し自動処理 148 149schedule.every(1).day.at("10:30").do(scrayping) 150 151while True: 152 schedule.run_pending() 153 time.sleep(10) 154

試したこと

関数の定義、関数単体での実行は問題なく作動したのですが
scheduleで処理した際に上手くいかない状態です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージを見る限り、
page_1_bがNoneであるのに、page_1_b.findメソッドを実行しようとしてエラーが起きた。
となっていますので、tryが拾っていないようです。

この部分をtryではなく、if page_1_b != None:に変更して再現するかどうかを調べてみてはいかがでしょうか。

python

1 page_1_b = soup1.find("div", {"class":"main-inner-b"}) 2 if page_1_b != None: #bがある場合 3 title_1_b = page_1_b.find("h3").text.replace("\u3000","").replace("\n","") 4 overview_1_b = page_1_b.find("p").text.replace("\u3000","").replace("\n","") 5 link_1_b = page_1_b.find("a").get("href") 6 else: 7 title_1_b = [] 8 overview_1_b = [] 9 link_1_b = []

投稿2021/02/24 06:55

ppaul

総合スコア24670

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

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

SMRKW

2021/02/24 06:58

ご回答ありがとうございます! ご指摘の通り、tryがうまく拾えていないのかな、と思い、ifで書き直してみましたのですが同様にエラーが出てしまう状況です。。
ppaul

2021/02/24 07:37

エラーメッセージはどう変わりましたか? 最新のソースに対応したエラーメッセージを載せてください。
SMRKW

2021/02/24 08:05

ご返信ありがとうございます。以下の通りです。 書き直したコードについては本文を編集して再掲しております。 (if文についても「 !=」とした場合でも「is」で記述した場合でもエラーとなってしまいました) --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-126-fafa280c5140> in <module>() 2 3 while True: ----> 4 schedule.run_pending() 5 time.sleep(10) 4 frames /usr/local/lib/python3.7/dist-packages/schedule/__init__.py in run_pending() 590 :data:`default scheduler instance <default_scheduler>`. 591 """ --> 592 default_scheduler.run_pending() 593 594 /usr/local/lib/python3.7/dist-packages/schedule/__init__.py in run_pending(self) 92 runnable_jobs = (job for job in self.jobs if job.should_run) 93 for job in sorted(runnable_jobs): ---> 94 self._run_job(job) 95 96 def run_all(self, delay_seconds=0): /usr/local/lib/python3.7/dist-packages/schedule/__init__.py in _run_job(self, job) 145 146 def _run_job(self, job): --> 147 ret = job.run() 148 if isinstance(ret, CancelJob) or ret is CancelJob: 149 self.cancel_job(job) /usr/local/lib/python3.7/dist-packages/schedule/__init__.py in run(self) 489 """ 490 logger.debug('Running job %s', self) --> 491 ret = self.job_func() 492 self.last_run = datetime.datetime.now() 493 self._schedule_next_run() <ipython-input-5-27f2e83c975b> in scrayping() 13 14 page_1_b = soup1.find("div", {"class":"main-inner-b"}) ---> 15 title_1_b = page_1_b.find("h3").text.replace("\u3000","").replace("\n","") 16 overview_1_b = page_1_b.find("p").text.replace("\u3000","").replace("\n","") 17 link_1_b = page_1_b.find("a").get("href") AttributeError: 'NoneType' object has no attribute 'find'
ppaul

2021/02/24 08:24

ソースと行数があっていないのが気になります。 今のソースだと、 title_1_b = page_1_b.find("h3").text.replace("\u3000","").replace("\n","") は25行目ではないでしょうか?
SMRKW

2021/02/24 08:50

おっしゃる通りです。ソース上では25行目になっています。 いただいたご指摘によって、Google Colaboratory上での実行が影響しているのかなと思い、 Anacondaのjupyter notebook上で同様のコードで実装してみたところ、問題なく動作しました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問