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

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

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

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

Python

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

Q&A

0回答

375閲覧

月ごとに気象データを自動取得したい

syuuuuuu

総合スコア2

Beautiful Soup

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

Python

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

0グッド

0クリップ

投稿2022/10/17 12:41

前提

広島の気象データを月ごとに自動取得したいのですが、サンプルが日毎しかない
ここに質問の内容を詳しく書いてください。
(例)
広島の気象データを月ごとに自動取得したいのですが、サンプルが日ごとしかなく月ごとのプログラミングに変更したいのですがなぜかうまくいかず原因が分かりません。

実現したいこと

2016から2021年までの'年月日', '平均気圧(hPa)', '降水量合計(mm)', '平均気温(℃)', '平均湿度(%)', '平均風速(m/s)', '日照時間(h)', '全天日射量(MJ/㎡)','降雪量合計(cm)','平均雲量','雪日数','霧日数','雷日数'が取得したい
ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

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

エラーメッセージ

該当のソースコード

place_codeA = [67]
place_codeB = [47765]
place_name = ["広島"]

import requests
from bs4 import BeautifulSoup #ダウンロードしてなかったらpipでできるからやってね。
import csv

URLで年と月ごとの設定ができるので%sで指定した英数字を埋め込めるようにします。

base_url = "http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=%s&block_no=%s&year=%s&month=%s&day=1&view=p1"

#取ったデータをfloat型に変えるやつ。(データが取れなかったとき気象庁は"/"を埋め込んでいるから0に変える)
def str2float(str):
try:
return float(str)
except:
return 0.0

if name == "main":
#都市を網羅します
for place in place_name:
#最終的にデータを集めるリスト (下に書いてある初期値は一行目。つまり、ヘッダー。)
All_list = [['年月日', '陸の平均気圧(hPa)', '海の平均気圧(hPa)', '降水量(mm)', '平均気温(℃)', '平均湿度(%)', '平均風速(m/s)', '日照時間(h)']]
print(place)
index = place_name.index(place)
# for文で2007年2017年までの11回。
for year in range(2007,2018):
print(year)
# その年の1月
12月の12回を網羅する。
for month in range(1,13):
#2つの都市コードと年と月を当てはめる。
r = requests.get(base_url%(place_codeA[index], place_codeB[index], year, month))
r.encoding = r.apparent_encoding

# まずはサイトごとスクレイピング soup = BeautifulSoup(r.text) # findAllで条件に一致するものをすべて抜き出します。 # 今回の条件はtrタグでclassがmtxになってるものです。 rows = soup.findAll('tr',class_='mtx') # 表の最初の1~4行目はカラム情報なのでスライスする。(indexだから初めは0だよ) # 【追記】2020/3/11 申し訳ございません。間違えてました。 rows = rows[4:] # 1日〜最終日までの1行を網羅し、取得します。 for row in rows: # 今度はtrのなかのtdをすべて抜き出します data = row.findAll('td') #1行の中には様々なデータがあるので全部取り出す。 # ★ポイント rowData = [] #初期化 rowData.append(str(year) + "/" + str(month) + "/" + str(data[0].string)) rowData.append(str2float(data[1].string)) rowData.append(str2float(data[2].string)) rowData.append(str2float(data[3].string)) rowData.append(str2float(data[6].string)) rowData.append(str2float(data[9].string)) rowData.append(str2float(data[11].string)) rowData.append(str2float(data[16].string)) #次の行にデータを追加 All_list.append(rowData) #都市ごとにデータをファイルを新しく生成して書き出す。(csvファイル形式。名前は都市名) with open(place + '.csv', 'w') as file: writer = csv.writer(file, lineterminator='\n') writer.writerows(All_list)
ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/10/17 14:24 編集

そのコードは、 https://qiita.com/Cyber_Hacnosuke/items/122cec35d299c4d01f10 の丸コピペですよね? で、「なぜかうまくいかず原因が分かりません」とのことですが、 では、「あなたは月ごとの値を取得するために、上記のコードに対してどのようなことを試して、結果、どううまくいかなかったのでしょうか」? 他人のプログラムコードをそのまま記載して「これを月ごとの値を取得できるコードに直してください」というのは、丸投げ以外での何物でもありません。
meg_

2022/10/17 14:33

コードは「コードの挿入」で記入してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問