2022年5月24日火曜日

青果物市況情報を自動で取得する(Python)

-----
追記(2022-8-6)

-----

青果物市況情報は農林水産省のページより確認することができます。

データ自体は PDF、HTML のほか、CSV の形式でも提供されているため扱いやすいのですが、そのデータを載せているページが Java で URL の遷移を行っているため、データの自動取得が若干しづらくなっています。

スプレッドシートの IMPORTXML 関数で素直に持ってくるようなことは(たぶん)できません。

ならばと GAS(Google Apps Script)を使ってみたところ、おそらくリージョンが米国のどこかになっているので、"The Amazon CloudFront distribution is configured to block access from your country." というメッセージが出てあっさりはじかれました。国内からのアクセスでないと見れない設定なのですね。

そんなわけで、今回 Python を使って青果物市況情報の自動取得を試みました。

ちなみに、農水省のサイトには Web スクレイピングを禁止するような記述は特にないようです。節度あるアクセスであれば問題ないと判断しました。今回の場合であれば、基本的にアクセスは1日1回になりますから負荷としては手動で1回閲覧するのと変わりません。


***

東京都中央卸売市場大田市場の最新の青果物市況情報を CSV 形式で取得するスクリプトが以下になります。

(BeautifulSoup や requests といったライブラリが未インストール場合はあらかじめインストールしてください)

import requests
from bs4 import BeautifulSoup
import re
import io
import pandas as pd

#市況情報取得
def getMcData():
    #最新データの日付(dd)取得
    url_1 = "https://www.seisen.maff.go.jp/seisen/bs04b040md001/BS04B040UC010SC999-Evt001.do"
    req_1 = requests.get(url_1)
    soup_1 = BeautifulSoup(req_1.text, "html.parser")
    dd = soup_1.find("a", href=re.compile("s0070"))
    dd = str(dd).replace("<a href=\"javascript:document.getElementById(\'s0070\').submit();\" id=\"s007_Evt001_0\">", "").replace("</a>", "").replace("\n", "").replace(" ", "")
    dd = re.findall(r'\d+', dd)
    dd = str(dd[0]) + str(dd[1].zfill(2)) + str(dd[2].zfill(2))

    #帳票ファイル名(cn)取得
    url_2 = "https://www.seisen.maff.go.jp/seisen/bs04b040md001/BS04B040UC010SC001-Evt001.do?s006.dataDate=" + dd
    req_2 = requests.get(url_2)
    soup_2 = BeautifulSoup(req_2.text, "html.parser")
    cn = soup_2.find_all("a", href=re.compile("form003"))
    cn = str(cn[12]).replace("<a href=\"javascript:chohyoSubmit(\'form003\',\'", "").replace("\');\"> CSV</a>", "").replace("\')\"> CSV</a>", "") #東京都中央卸売市場大田市場(野菜)
    
    #CSVファイル(mcd)取得
    url_3 = "https://www.seisen.maff.go.jp/seisen/bs04b040md001/BS04B040UC010SC001-Evt004.do?s004.chohyoKanriNo=" + cn
    req_3 = requests.get(url_3)
    mcd = pd.read_csv(io.BytesIO(req_3.content), encoding="cp932", sep=",")

    return mcd

print(getMcData())
※ コードを一部修正しました。(2022-8-1)

23行目の cn[12] の数字で市場及び野菜 or 果物の指定をしていますので適宜変更してください。例えば、東京都中央卸売市場大田市場の果実であれば cn[13]、東京都中央卸売市場豊島市場の野菜であれば cn[14] となります(投稿日時点ですのでご確認を)。

-----
・追記(2022-9-10)

上記の cn[12] のように配列番号で市場及び野菜 or 果物の指定しますと、一部休市日等に取得対象がズレてしまうようです。

市場名で指定するのが確実です。もしくは Web API をお使い頂ければと思います。
-----

ざっくり動きとしては、BeautifulSoup ライブラリを用いた Web スクレイピングで最新データの日付と帳票ファイル名の取得を行い、そこから Pandas ライブラリで CSV ファイルの取得を行っています。


更新は休市の日以外で、時間はファイル名を見るに14:30頃以降のようです。




***

数年前に農業データプラットフォームとして始まった WAGRI では今回取得した青果物市況情報も API として提供されているのですが、やはりそれなりの利用料がかかります。説明等を読むに個人農家の利用は想定してなさそうですね。

WAGRI のようなプラットフォームはさておき、そもそもとしてデータ提供元(青果物市況情報であれば農水省)が使いやすい形でデータを出してくれれば農業におけるデータ利用の裾野も個人レベルで広がっていくんじゃないかと思うのですよね。気象庁の非公式 API のような形で。

せっかく学校でプログラミングの授業が必修化したことですし、農家が個人利用できるようなデータも整えてもらえるといいですね。

スマート農業というと、高額な最新設備や農業機械を導入して……みたいな印象が少なからずあり、そのせいで小規模な経営体ではスルーされがちになっているんじゃないかと思います。

しかしながら、パソコン1台からできることもたくさんあるので、その基盤をいかに整えるかがこれからの数年は重要なんじゃないかと改めて。


-----
・追記(2022-5-31)

いろいろ探していたら、政府統計の総合窓口(e-Stat)について API の提供がされているのですね。農業関連もセンサスをはじめいろいろありました。消費者物価指数などは営農にも使えそうかもですね。
-----


新しい植物を入手!


Twitter(@nkkmd)日々更新中です。