[[20211015154655]] 『毎月アドレスが変わるwebページからデータを取得ax(豆腐とキムチ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『毎月アドレスが変わるwebページからデータを取得したい』(豆腐とキムチ)

よろしくお願いします。

気象庁のWEBサイトから平均気温をWebクエリで取得しようと思っているのですが
気象庁のアドレスが毎月変わってしまって月や年が変わると最新のデータが取得できなくなってしまいます。

(例えば2021年9月の日毎の平均気温があるアドレス↓↓↓
https://www.data.jma.go.jp/obd/stats/etrn/view/daily_a1.php?prec_no=44&block_no=0371&year=2021&month=9&day=&view=

2021年10月の日毎の平均気温があるアドレス↓↓↓
http://www.data.jma.go.jp/obd/stats/etrn/view/daily_a1.php?prec_no=44&block_no=0371&year=2021&month=10&day=&view=)

何かいい方法をご存知の方、いらっしゃいませんでしょうか。
よろしくお願いします。

< 使用 Excel:unknown、使用 OS:Windows10 >


 URLの年と月が回変わるので、PowerQueryを使って、URLをパラメータにしたらどうでしょう
 
 Excelのバージョン書いてください。
(´・ω・`) 2021/10/15(金) 16:16

(´・ω・`)さん、コメントをどうもありがとうございます!
エクセルのバージョンは2019でした。
パワークエリを使ってるのですがURLをパラメータにする方法がよくわかりません。
申し訳ないのですがパラメータにする方法を教えていただけないでしょうか。
よろしくお願いします!
(豆腐とキムチ) 2021/10/15(金) 17:21

 こんなテーブルを作ります。
  | A  | B  |
 1| 年 | 月 |
 2|2021|  9 |

 このテーブルを選択して、テーブルまたは範囲からで、こんなクエリを作ります。

 let
    ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    変更された型 = Table.TransformColumnTypes(ソース,{{"年", type text}, {"月", type text}}),   
    年 = 変更された型{0}[年],
    月 = 変更された型{0}[月],
    url="http://www.data.jma.go.jp/obd/stats/etrn/view/daily_a1.php?prec_no=44&block_no=0371&year=" & 年 & "&month=" & 月
 in
    url

 このクエリの名前を URL としておくと、気象庁のデータを読み込むクエリは
 let
    ソース = Web.Page(Web.Contents(URL)),
    Data0 = ソース{0}[Data],
    変更された型 = Table.TransformColumnTypes(Data0,{{"日", type text}, {"降水量(mm) 合計", type text}, {"降水量(mm) 最大 1時間", type text}, {"降水量(mm) 最大 10分間", type text}, {"気温(℃) 平均", type text}, {"気温(℃) 最高", type text}, {"気温(℃) 最低", type text}, {"風向・風速(m/s) 平均 風速", type text}, {"風向・風速(m/s) 最大風速 風速", type text}, {"風向・風速(m/s) 最大風速 風向", type text}, {"風向・風速(m/s) 最大瞬間風速 風速", type text}, {"風向・風速(m/s) 最大瞬間風速 風向", type text}, {"風向・風速(m/s) 最多 風向", type text}, {"日照 時間 (h)", type text}, {"雪(cm) 降雪 合計", type text}, {"雪(cm) 最深積雪 値", type text}})
 in
    変更された型

 みたいになります。
 
 ちなみに、これをやると、
 「他のクエリまたはステップを参照しているため、データソースに直接アクセスできません」
 というエラーがでるので、PowerQueryエディターの【ファイル】メニューの【オプションと設定】の
 【プライバシー】で、常にプライパシーを無視するにしておかないといけません

 この設定変更がいやなら、 
 let
    年 = Text.From(Date.Year(DateTime.LocalNow())),
    月 = Text.From(Date.Month(DateTime.LocalNow())),
    url="http://www.data.jma.go.jp/obd/stats/etrn/view/daily_a1.php?prec_no=44&block_no=0371&year=" & 年 & "&month=" & 月
 in
    url
 みたいに、全部中で計算してもいいかもしれません
(´・ω・`) 2021/10/15(金) 18:03

(´・ω・`)さん、詳細に教えていただき本当にどうもありがとうございます!
レベルが高すぎて何がどうなっているのか良く分からないですが
一行一行、文を追ってやってみようと思います!
またどこかで分からなくなってしまったら質問してしまうかも知れませんがよろしくお願いします!
(豆腐とキムチ) 2021/10/16(土) 18:21

たびたび申し訳ありません。
参考書を見つつ試行錯誤してみたのですが私が初心者すぎて上手く行きません。

大変恐縮なのですが、具体的な操作方法を教えて貰ってもよろしいでしょうか。
私がやった操作ですが…

新規のエクセルで

   | A  | B  |
 1| 年 | 月 |
 2|2021|  9 |

と言う表を作って、それを挿入メニューのテーブルをクリックしてテーブルを作成しました。

そのテーブルを右クリックして「テーブルまたは範囲からデータを取得」を選択しパワークエリエディターを立ち上げました。

適用したステップのところには

ソースは
= Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],

変更された型は
=Table.TrasformColumnTypes(ソース,{{“年”,Int64.Type},{“月”,Int64.Types}})

と書かれてありました。

ここからどうやったら

年 = 変更された型{0}[年], 月 = 変更された型{0}[月], url="http://www.data.jma.go.jp/obd/stats/etrn/view/daily_a1.php?prec_no=44&block_no=0371&year=" & 年 & "&month=" & 月 in url

この行を追加できるのでしょうか?
初心者すぎて申し訳ありませんが教えてください。
よろしくお願いします。

(豆腐とキムチ) 2021/10/25(月) 17:30


 詳細エディタ を開きます。
(´・ω・`) 2021/10/25(月) 17:45

(´・ω・`)さん、たびたび教えて頂きどうもありがとうございます!

詳細エディタを開くんですね!教わった通りの行を追加はできたのですが
思った通りの結果が得られませんでした(泣)
URLと言う名前のクエリを作って『閉じて読み込む』をクリックすると
テーブル1というシートが出来て以下のようなテーブルが作成されました。

            A
1|   Column1
2|   http://www.data.jma.go.jp/obd/stats/etrn/view/daily_a1.php?prec_no=44&block_no=0371&year=2021&month=10i

気象庁のホームページの内容が読み込まれると思ったのですがどこで間違えたのでしょうか。
何度も聞いてしまい大変恐縮ですがよろしくお願いします!スミマセン

(豆腐とキムチ) 2021/10/26(火) 10:06


 2021/10/15(金) 18:03 の書き込みを再度読んでください。
 そこまででまだ半分です。
(´・ω・`) 2021/10/26(火) 10:44

(´・ω・`)さん、本当に何度も教えていただき大感謝です!ありがとうございます!

10/15の書き込みをもう一度読んでみて以下のように操作してみました。

URLと言う名前のクエリを作り
テーブル1と言うシート上で『データ』メニューの『Webから』を選択
URLを入力するボックスに、取り敢えず気象庁のホームページのアドレスを入れOKをクリック
読み込みたい表を選択して『読み込み』をクリック
新しいクエリが作成されたので、それをPower Queryエディターで開く
詳細エディターをクリックし以下の内容に変更

 let
    ソース = Web.Page(Web.Contents(URL)),
    Data0 = ソース{0}[Data],
    変更された型 = Table.TransformColumnTypes(Data0,{{"日", type text}, {"降水量(mm) 合計", type text}, {"降水量(mm) 最大 1時間", type text}, {"降水量(mm) 最大 10分間", type text}, {"気温(℃) 平均", type text}, {"気温(℃) 最高", type text}, {"気温(℃) 最低", type text}, {"風向・風速(m/s) 平均 風速", type text}, {"風向・風速(m/s) 最大風速 風速", type text}, {"風向・風速(m/s) 最大風速 風向", type text}, {"風向・風速(m/s) 最大瞬間風速 風速", type text}, {"風向・風速(m/s) 最大瞬間風速 風向", type text}, {"風向・風速(m/s) 最多 風向", type text}, {"日照 時間 (h)", type text}, {"雪(cm) 降雪 合計", type text}, {"雪(cm) 最深積雪 値", type text}})
 in
    変更された型

すると画面に『[Expression Error]型 Tableの値を型Textに変換できません。』と出てきてしまい前に進めません。

本当に何度も教えていただきすごく恐縮なのですがご教授いただきたいです。
どうぞよろしくお願いします!
(豆腐とキムチ) 2021/10/26(火) 11:45


 URLというクエリですが、詳細エディタで再度開いて見てください。

 シート上に読み込んだことで、「テーブルに変換済み」というステップが増えちゃってると思います。
 もとに戻してください。 

 URLというクエリは、シート上に読み込まなくていいので、
 [閉じて読み込む]ではなく、[閉じて次に読み込む]で[接続のみ]を選択してください。
(´・ω・`) 2021/10/26(火) 13:05

2つのクエリを使用するということを
理解できていますか。

 1)テーブル1のデータから指定の年月のURL文字列を作成するクエリ
 2)そのURLを使って、WEBからデータを取得するクエリ

 1)は、2)で利用するだけで「接続の作成のみ」
 データをシートに読み込むのは、2)です

(マナ) 2021/10/26(火) 14:19


テーブルの値(セル値)を利用する方法の理解のために、
新規ブックで、以下を試してみてください。

 ・2021年9月のデータを「WEBから」でシートに読み込む
   ※年月固定なら、できている前提
 ・Power Queryエディターを開いて
 ・適用したステップ/ソース の数式バーを編集
   = Web.Page(Web.Contents(URL))
 ・Power Queryエディターを閉じてシートに戻る
 ・空いている場所にテーブルを作成(テーブル名:URL)

  URL
  https://www.data.jma.go.jp/…(略)

 ・テーブル内のセルを選択し
 ・データの取得と変換/テーブルまたは範囲から
 ・プレビュー画面のURL文字列を選んで、右クリック/ドリルダウン
 ・閉じて次に読み込む
 ・接続の作成のみ

 これで、テーブルの値を使って、データを読み込むことが可能です。
テーブルの値(URL)の年月部分を修正しやすいように
 数式にして、年月は別のセルを参照することも可能です。

(マナ) 2021/10/26(火) 14:47


 ↑できるだけ、手作業での方法にしてみましたが
 慣れてくると、(´・ω・`)さんのように
 詳細エディターで、直接編集するほうが早いです。
 できることも格段に増えます。
 ただし、文法を勉強する必要があります。

(マナ) 2021/10/26(火) 15:00


(´・ω・`)さん、出来ました!!!本当に何とお礼を言ったら良いか…。
何度も何度も初心者の質問に答えていただきどうもありがとうございました。
言われるがままに操作をしたのでまだ理解が追い付いていませんが
マナさんにもアドバイスを頂き、自分がどういったことをやっているのかボンヤリですが理解できそうです。
本当にどうもありがとうございました!!!

マナさん、今回もアドバイスをどうもありがとうございました!!!
おかげで何もわからない状態から少しだけ理解できたように思えます!
これから、マナさんが教えてくれた方法でパワーピボットの理解を深めようと思います!
質問してばかりで本当に恐縮ですが、やりたいことが実現できとても嬉しいです!
またわからないことがあったらお世話になってしまうと思いますがよろしくお願いいたします!

(豆腐とキムチ) 2021/10/26(火) 15:58


マナさんの教えてくれた方法を試してみました。
なるほど!こちらの方法でもデータを取得することができるんですね!
ドリルダウンのイメージが私の中では、より下層のものに移動するという認識なのですが
urlアドレスをドリルダウンして欲しいデータに移動できるって感じなのですかね。勉強になりました!
有難うございます!!!

(豆腐とキムチ) 2021/10/27(水) 11:31


すみません。気象庁の平均気温をWebクエリで取得する件で追加の質問です。

(´・ω・`)さんとマナさんのご教授のおかげで2021年9月といった固定の年月のデータは取得できるようになったのですが
可能であれば、いつでもデータメニューの『すべて更新』ボタンで連続した最新のデータを取得するようには出来ないでしょうか。

例えば、前回取得したデータが2021年9月20日までのデータであった場合、2021年10月27日に『すべて更新』ボタンをクリックしたら
前回の9月20日までのデータに追加するかたちで10月27日までの連続したデータを取得するといったことは可能なのでしょうか?

可能であれば、その方法を教えていただきたいです。
いつも教えていただいてばかりで申し訳ないのですが、よろしくお願いします。

(豆腐とキムチ) 2021/10/27(水) 11:36


 できなくはないと思いますけど、私もポポィッとすぐに出来るような技術もってないです

 で、
 ・取得したテーブルには、年月の列がないので、なんとかしないといけないですよね   
 ・前回まで取得したデータはどこにどのように蓄積されているんですか?
 ・前回更新した日付はどこを見れば分かるでしょうか?
 
 など、結構考えないといけないことがあります
 考えてください。
(´・ω・`) 2021/10/27(水) 13:00

(´・ω・`)さん、アドバイスをどうもありがとうございます!

アドバイスをくれた3つのポイントをじっくり考えて試行錯誤してみようと思います!
(豆腐とキムチ) 2021/10/27(水) 13:06


勉強のために考えてみました。
こんな感じでどうでしょうか。
ただし、どんな問題があるかわかりません(自信ないです)。

 ^^^^^^^^^
1)クエリ名:気象庁
 ※最初に1回だけ実施

 let
    ソース = Web.Page(Web.Contents("https://www.data.jma.go.jp/obd/stats/etrn/view/daily_a1.php?prec_no=44&block_no=0371&year=2021&month=9&day=&view=")),
    Data0 = ソース{0}[Data],
    変更された型 = Table.TransformColumnTypes(Data0,{{"日", type text}, {"降水量(mm) 合計", type text}, {"降水量(mm) 最大 1時間", type text}, {"降水量(mm) 最大 10分間", type text}, {"気温(℃) 平均", type text}, {"気温(℃) 最高", type text}, {"気温(℃) 最低", type text}, {"風向・風速(m/s) 平均 風速", type text}, {"風向・風速(m/s) 最大風速 風速", type text}, {"風向・風速(m/s) 最大風速 風向", type text}, {"風向・風速(m/s) 最大瞬間風速 風速", type text}, {"風向・風速(m/s) 最大瞬間風速 風向", type text}, {"風向・風速(m/s) 最多 風向", type text}, {"日照 時間 (h)", type text}, {"雪(cm) 降雪 合計", type text}, {"雪(cm) 最深積雪 値", type text}}),
    削除された最初の行 = Table.Skip(変更された型,3),
    保存された先頭行 = Table.FirstN(削除された最初の行,1),
    追加されたプレフィックス = Table.TransformColumns(保存された先頭行, {{"日", each "2021/9/" & _, type text}}),
    変更された型1 = Table.TransformColumnTypes(追加されたプレフィックス,{{"日", type date}}),
    #"名前が変更された列 " = Table.RenameColumns(変更された型1,{{"日", "年月日"}})
 in
    #"名前が変更された列 "

 ^^^^^^^^^
 2)クエリを編集:詳細エディターの中身を、下記と置き換え
 ※これも最初に1回だけ実施

 let
    ソース = Excel.CurrentWorkbook(){[Name="気象庁"]}[Content],
    開始tbl = Table.Buffer(ソース), 
    見出し = Table.ColumnNames(開始tbl),
    開始年月日 = Date.From(Table.Column(開始tbl, 見出し{0}){0}),
    取得日 = Date.AddMonths(Date.StartOfMonth(開始年月日), -1), 
    開始年 = Date.Year(取得日),
    開始月 = Date.Month(取得日),
    今月末 = Date.EndOfMonth(DateTime.Date(DateTime.LocalNow())),
    WEBから = List.Generate(
        ()=> [年 = 開始年, 月 = 開始月, 取得月 = 取得日, tbl = #table({},{})],
        each  [取得月] <= 今月末,
        each [
            取得月 = Date.AddMonths([取得月], 1),
            年 = Date.Year(取得月),
            月 = Date.Month(取得月),
            tbl = fnテーブル取得(年, 月)
        ],
        each [[取得月],[tbl]]
    ),
    テーブルに変換済み = Table.FromList(WEBから, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    削除された最初の行 = Table.Skip(テーブルに変換済み,1),
    #"展開された Column1" = Table.ExpandRecordColumn(削除された最初の行, "Column1", {"取得月", "tbl"}, {"取得月", "tbl"}),
    #"展開された tbl" = Table.ExpandTableColumn(#"展開された Column1", "tbl", {"Data"}, {"Data"}),
    #"展開された Data" = Table.ExpandTableColumn(#"展開された tbl", "Data", Table.ColumnNames(#"展開された tbl" [Data]{0})),
    フィルターされた行 = Table.SelectRows(#"展開された Data", each [日] <> "日"),
    追加されたカスタム = Table.AddColumn(フィルターされた行, "年月日", each Date.AddDays([取得月], Number.From([日]) -1)),
    削除された列 = Table.RemoveColumns(追加されたカスタム,{"取得月", "日"}),
    並べ替えられた列 = Table.ReorderColumns(削除された列, 見出し),
    フィルターされた行1 = Table.SelectRows(並べ替えられた列, each [年月日] >= 開始年月日)
 in
    フィルターされた行1

 ^^^^^^^^^
4)もう一つクエリを追加
 ※これも最初に1回だけ実施
 空のクエリを追加し、下記を詳細エディターにコピペ
  クエリ名:fnテーブル取得

 (年 as number, 月 as number) as table =>
 let
    url="http://www.data.jma.go.jp/obd/stats/etrn/view/daily_a1.php?prec_no=44&block_no=0371&year=" & Text.From(年) & "&month=" & Text.From(月),
    ソース = Web.Page(Web.Contents(url)),
    フィルターされた行 = Table.SelectRows(ソース, each ([Source] = "Table")),
    削除された他の列 = Table.SelectColumns(フィルターされた行,{"Data"})
 in
    削除された他の列

 ^^^^^^^^^
4)[年月日]列の1行目の日付を、抽出したい期間の開始日に変更
  ※変更したいときだけ実施

 ^^^^^^^^^
 5)テーブルの右クリックから「更新」を選択
  ※追加したときは、これだけ実施

 ^^^^^^^^^

(マナ) 2021/10/27(水) 23:32


 私ギブアップです。
 既存のテーブルを読み込んで、そのテーブルに書き戻すのがうまくできませんでした。

 マナさんのようにクエリを作成してから編集すればできるんですね

 PowerQueryだけじゃなく、マクロとの組み合わせにしようかなとおもいましたが、
 マナさんからのよい回答があったので、手を出さないでおきます
(´・ω・`) 2021/10/28(木) 07:13

まなさん、(´・ω・`)さん、本当にどうも有難うございます!!!(涙)
もしかしたらマクロを使えばうまくいくんじゃないかなと思いましたがいくら考えても全くわからなかったので
掲示板に戻ってきましたが答えがすでに書いてありました(泣)
まだまなさんの答えを試していませんが、取り急ぎお二人にお礼をと思いました。
本当にどうもありがとうございます!!!これから試してみます!!!
(豆腐とキムチ) 2021/10/28(木) 11:40

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.