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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

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

pandas

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

Q&A

解決済

1回答

431閲覧

無限ループしているプログラムで取得したデータを別のプログラムで使用したい。

TaChiYu

総合スコア22

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2022/03/31 08:06

初歩的な質問かもしれませんが、ご教授ください。

あるサイトの更新を15秒ごとに確認し、更新があった場合に詳細情報を取得、dfに格納するプログラム(下記 test.py)をpythonで記述しました。このプログラムを無限ループして使用したいと考えています。
このプログラムを実行して、別のプログラムでdfに格納した詳細情報を参照したいのですが、どのように行えばよいでしょうか?

別のプログラムでtest.pyをimportしてみましたが、importするとtest.pyが実行されています。

下記のコードは投稿用に書き換えております、参考までに。

pythonコード

1test.py 2 3from bs4 import BeautifulSoup 4import requests 5import pandas as pd 6import time 7import os 8 9#初期設定 10data = [] 11df = pd.DataFrame(data) 12now_update = 0 13default_date = 0 14i = 0 15 16#∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞無限ループ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ 17while True: 18 i = i + 1 19 20 url = 'https://hoge' 21 res = requests.get(url) 22 time.sleep(15) 23 24 soup = BeautifulSoup(res.text, 'html.parser') 25 now_update = soup.find_all('a') 26 27 print(f'{i}回目のループ。',default_date == now_update) 28 29 if now_update != default_date: 30 default_date = now_update 31 32 #now_updateからURLとタイトルを取得 33 new_data1 = str(default_date[1]) 34 new_data1_split = new_data1.partition("'") 35 new_data1_split2 = new_data1_split[2].partition("'") 36 new_data1_split3 = new_data1_split2[2].partition('>') 37 new_data1_split4 = new_data1_split3[2].partition('&') 38 new_data1_url = new_data_split2[0] 39 data_1_title = new_data1_split4[0].strip(' ') 40 data_1_url = 'https://hoge' + new_data_url 41 42 #↑で取得したURLから詳細情報ページにアクセスして、data1、data2、data3、data4を抽出 43 44 data_1_res = requests.get(data_1_url) 45 data_1_soup = BeautifulSoup(data_1_res.text, 'html.parser') 46 time.sleep(1) 47 48 #詳細データを取得 49 need_data_1 = data_1_soup.find('table', attrs={'align': 'left'}) 50 need_data_1_split1 = need_data_1.find_all('td') 51 #data1を取得 52 data1 = need_data_1_split1[4].text.replace('\n', '').strip(' ') 53 #data2を取得 54 data2_lowdata = need_data_1_split1[5] 55 data2 = data2_lowdata.text.replace('\n', '').strip(' ') 56 #data3取得 57 data3_lowdata = need_data_1_split1[6].text.partition('「') 58 data3 = data3_lowdata[2].replace('\n', '').replace('」', '').strip(' ') 59 #data4取得 60 data4_lowdata = need_data_1_split1[7].text.replace('\n', '').replace('\u3000', '').replace('\r', '').strip(' ').partition('以') 61 data4 = data4_lowdata[0] 62 #testのためprint 63 print(data1, data2, data3, data4) 64 print('DFに書き込み') 65 #dataumに格納 66 dataum = {} 67 dataum['data1'] = data1 68 dataum['data2'] = data2 69 dataum['data3'] = data3 70 dataum['data4'] = data4 71 #dataにdataumをappend 72 data.append(dataum) 73 df = pd.DataFrame(data)

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

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

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

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

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

hoshi-takanori

2022/03/31 08:49

> あるサイトの更新を15秒ごとに確認 そのサイトの許可を得てますか? 得てなければ迷惑行為では…。
TaChiYu

2022/03/31 08:52

利用規約にスクレイピングを禁止する文言がなく、サイトの更新頻度は15秒に1回なのですが、迷惑行為に当たりますか?
guest

回答1

0

ベストアンサー

  1. サーバーにしてTCP/IP経由でアクセスする
  2. mmapなどのメモリ共有を利用する
  3. ファイルに書き込んでそのファイルを参照する
  4. そもそも別ファイルに分けず、threadingなどの並列処理を利用する
  5. 変更があったときになにかするわけでないならそもそもwhileで定期監視する必要もないので参照するタイミングで15秒以上経ってればdfを更新すればよいのでは

投稿2022/03/31 08:53

kairi003

総合スコア1330

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

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

TaChiYu

2022/04/04 07:29

回答ありがとうございます。 ファイルに書き込みそのファイルを参照する方法で動作確認できました! 定期監視し、更新があったタイミングでLINEで通知するプログラムを作りたかったのです。
kairi003

2022/04/04 07:35

複数のプロセスから同じファイルを同時に参照するとエラーが起きる場合があるのでエラーハンドリングには気を付けましょうね。(try-exceptで例外を検知してファイル参照系のエラーはスルーするなど)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問