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

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

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

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

Python

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

Q&A

解決済

3回答

2451閲覧

pythonで気象庁のページをスクレイピングをしたい

D141

総合スコア4

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

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

Python

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

0グッド

0クリップ

投稿2020/12/21 02:04

前提・実現したいこと

気象庁の北海道の1年間の天気をスクレイピングし、'年月日', '陸の平均気圧(hPa)', '海の平均気圧(hPa)', '平均気温(℃)', '平均湿度(%)', '平均風速(m/s)', '日照時間(h)'を取得したい

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

スクレイピングしたのですが5月の部分までは降水量だった部分が6月から気圧っぽい数字になってしまします予期していない数字が入り込んできます。詳しくは発生している問題の部分に記載してあります。
['2000/5/29', 990.6, 993.6, 0.0, 0.0, 0.0, 27.5, 57.0],
['2000/5/30', 999.8, 1002.7, 0.0, 0.0, 0.0, 24.3, 40.0],
['2000/5/31', 1005.1, 1008.1, 0.0, 0.0, 0.0, 24.7, 57.0]←ここまでは4つ目に降水量が入っている
['2000/6/1', 1004.5, 1007.5, 1006.5, 0.0, 0.0, 21.3, 70.0]←ここから4つ目に気圧っぽい数字が入っている
['2000/6/2', 1008.8, 1011.9, 1009.3, 0.0, 0.0, 13.2, 89.0],
['2000/6/3', 1006.3, 1009.4, 1007.1, 7.0, 0.0, 18.5, 88.0],

該当のソースコード

python

1import requests 2from bs4 import BeautifulSoup 3All_list = []#初期化 4#URLで年と月ごとの設定ができるので%sで指定した英数字を埋め込めるようにします。 5base_url = "http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=14&block_no=47412&year=%s&month=%s&day=1&view=a2" 6#試しに2000年だけ実行しています  7for year in range(2000,2001): 8 #入れ子のforで1月~12月の12回を回します。 9 for month in range(1,13): 10 #for文で2000年1月...2月...3月と回せるので埋め込んで行きます。 11 r = requests.get(base_url%(year,month)) 12 r.encoding = r.apparent_encoding 13 14 #対象である表をスクレイピングしていきます。 15 soup = BeautifulSoup(r.text,'lxml') 16 rows = soup.findAll('tr',class_='mtx') 17 i = 1 18 19 #表の最初の1〜3行目はカラム情報なのでスライスしていまいます。 20 rows = rows[4:] 21 22 for row in rows: 23 # 今度はtrのなかのtdをすべて抜き出します 24 data = row.findAll('td') 25 26 #1行の中には様々なデータがあるので全部取り出す。 27 # ★ポイント 28 rowData = [] #初期化 29 rowData.append(str(year) + "/" + str(month) + "/" + str(data[0].string)) 30 rowData.append(str2float(data[1].string))#陸の平均気圧 31 rowData.append(str2float(data[2].string))#海の平均気圧 32 rowData.append(str2float(data[3].string))#降水量 33 rowData.append(str2float(data[6].string))#平均気温 34 rowData.append(str2float(data[9].string))#平均湿度 35 rowData.append(str2float(data[11].string))#平均風速 36 rowData.append(str2float(data[16].string))#日照時間 37 38 #次の行にデータを追加 39 All_list.append(rowData)

試したこと

data[9]#平均湿度をunique()で確認したところリストにarray([0.0, nan], dtype=object)で0.0かnanしか含まれておらず、ALL_listを確認したところ日にちと気圧の3列くらいしかきちんととれていませんでした。

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

参考:https://qiita.com/neet-AI/items/d434f3a96223c12fbdd3
https://qiita.com/Cyber_Hacnosuke/items/122cec35d299c4d01f10

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

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

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

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

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

guest

回答3

0

ベストアンサー

実際に、2000年5月と6月のページをブラウザーで確認するとわかりますが、(先頭を1つめとして)4つめと5つめのデータは何月でも変わらず「(海面の)最低気圧」「(海面の最低気圧の)時分」です。そして、「平均風速」や「日照時間」はこのa2ビューの表には載っていません

2000年5月(a2ビュー)

ということで、正確にデータが取れていないのではなく、データを取るページのクエリー文字列(ビューの指定)を間違えています。おそらく、あなたが見たいのは、上記のページで「主な要素」をクリックしたときに表示されるp1ビューの表なのでは? そうであれば、URLの末尾を「p1」に変えてください。

2000年5月(p1ビュー)

Diff

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

それから、あなたの質問には、str2floatという関数の定義が抜けていますが、参考情報のページを見ると、これはfloatに変換した値を返せないときは0.0を返す、という内容ですね。0.0ではなく、numpyをimportしてnp.nanを返すように書き換えてください。これで、「数値に変換できるデータがなかったのか」それとも「数値が0だったのか」が区別できます。

Python

1import numpy as np 2 3def str2float(str): 4 try: 5 return float(str) 6 except(ValueError): 7 return np.nan

投稿2020/12/21 02:57

Daregada

総合スコア11990

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

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

D141

2020/12/21 04:01

参考にしたコードのURLの部分が同じだと思い込んでました 助かりました
D141

2020/12/21 04:02

参考にしたページのURLの部分が同じだと思っていました 助かりました
guest

0

そもそも対象とするページURLを間違えていませんか?

投稿2020/12/21 02:46

nto

総合スコア1438

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

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

0

当たり前ですが、レイアウトの異なるページであれば、それに合わせたプログラムにしないといけません。
何年何月以降はレイアウトが変わったと判断するとか、ページ内の何らかの情報で、どっちのレイアウトなのかを判断するとか。

投稿2020/12/21 02:34

otn

総合スコア84423

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

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

otn

2020/12/21 02:37

サイトを見ると、条件を指定してダウンロードできるようなので、スクレイピング不要では?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問