who3411のブログ

情報系の勉強やイベントの参加に関するブログ(をしたい)です。

釣果情報を分析しようとしたらその手前で詰まった話

この記事は、「Unagi-Network Advent Calendar 2023」18日目の記事になる予定でしたが、1週間遅刻した上にやりたいことすらできませんでした…

Unagi-Network Advent Calendar 2023 - Adventar

今回は反省も込めて、何をしたかったか、現状どうなのかを書こうと思います。

はじめに

皆さん、釣りは行かれますか?最近色々あって行けていないのですが、私は数年前まで月1ペースくらいで雨の降っていない日に釣りに行ってました。最近はほとんど行けていないのですが、2023年9月に行った釣り場では、毎日気温・水温・天気・風速等の情報や、釣果情報をWebページに掲載していることに気づきました*1

今回のように様々な釣りに関わる情報を毎日上げているのを見ると「Webページからデータを集めて分析すれば、その釣り場で釣りたい魚種に合わせて最適な日が分かるのでは…?」みたいなことを考えました。それで、Webページから情報をすべて持ってきて、それを基に分析しようとしたのが今回の話です。

注意点

スクレイピング初心者の記事です。プロからしたらあるあるみたいな話の山だと思います。また、詰まった点でWebページに対してネガティブと受け取られる内容を書いているかもしれませんが、釣果情報を上げてくれている時点で神なので、それをうまくデータとしてまとめられていない自分が100%悪いです。

要約

Webページからデータを抽出しようとスクレイピングを試したら、色々と詰まったので、その時の知見をまとめました。

詰まった点

思わぬところにある環境依存文字

釣果情報を眺めていると、時々「20㎝の○○が釣れていました」という記載があるのですが、よくよく見ると「㎝」が環境依存文字になっていて、その関係でファイル保存時にエラーが発生しました。SJISEUC等、色々試したのですが、結局JIS X 0213にしないと保存できないことが判明しました*2

import requests

response = requests.post(URL)
response.encoding = 'euc_jisx0213' #JIS X 0213でエンコーディングする場合はこっち
#response.text.encode().replace(b'\xad\xd1', b'cm') #環境依存文字"㎝"をcmに修正する場合はこっち

普段何気なく使うかもしれない環境依存文字は、想像以上に厄介な存在ということが分かりました…

データがフリーコメントに近い

気温・水温・天気・風速等の情報や、釣果情報を集めようとする際、特に気温・水温・天気・風速等の情報がフリーコメントに近い形式で記載されていました。 特に悩ましいのが下記のようなデータの書き方で、こういったケースもすべて対応するようにプログラムを書いていたら日が昇っていました。

■通常
キー1:データ1
キー2:データ2

■とある日
キー1:データ2データ1

また、魚種によって単位が異なっていて、ある魚はcm表記であるのに対して、ある魚はkg表記であるケースもあるので、単位に応じてデータの抽出を工夫する必要がある等の問題もありました。

釣果情報の釣った魚の数が場所によって変わっている

とある日の釣果情報を確認すると、表形式で書いてある釣った魚の数と、フリーコメント欄に書いてある釣った魚の数が異なっていました。これを確認していって分かったこととして、表の方には4桁までの釣果情報しか記載されておらず、5桁以上魚が釣れた日はフリーコメント欄に記載されていることが分かりました。

そのため、表とフリーコメント欄の両方を確認することで、より正確な情報を取得する必要がありました。

まとめ

今回データをまとめて分析できるようにするための前段階をやりましたが、データセットが存在しない状況下でのデータ収集が想像の数十倍も面倒であることがよくわかりました。スクレイピングを行うにしても、かなり記載方法が整理された場所からデータを引っ張ってくるイメージが強かったですが、実際には上記のような様々な罠が潜んでいて、これを分析可能なデータとして整理するのはかなり大変です。こういったことを身に染みて理解できたのは一つの知見だったのかな、と思います。

それはそれとして、もともとやりたかった分析は全くできていないので、来月以降に実施して、次こそはそれに関する記事を上げます…

余談

スクレイピングを行う際、1リクエストにつき2秒スリープする仕様にしていた影響でかなり待ち時間ができたので、寿司打で遊んでいました。 久々にやりましたが、一発勝負が全然できなくなっていたので、普通でのんびり遊びました。こちらは完全に力が衰えていたので、勘を取り戻します…

*1:http://honmoku.yokohama-fishingpiers.jp/choka.php

*2:ちなみに、エンコーディングで解決できると知るまでは16進数で「㎝」を「cm」に置き換えていました