PythonでYahooの天気情報を取得+Slackに通知する

# 概要
[Yahoo!天気・災害](https://weather.yahoo.co.jp/weather/)の天気情報をスクレイピングしてSlackに通知出来るようにしました。
（天気情報を取得するAPIは既にありますが、重ね着情報が便利そうだったので今回はYahooさんを利用させてもらいました。）
雨の場合は緑の線が黄色になります。
![スクリーンショット 2021-04-12 1.44.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1301545/7c3b7472-6998-6cfc-d7b0-d345c5d6abfd.png)
# ソースコード
コードは以下の通り。
変更必須箇所は以下の2つ。

- SLACK_WEBHOOK_URL
    - 通知用のSlack Webhook URL。取得方法は[こちら](https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)を参照。
- WEATHER_INFO_URL
    - Yahooの天気予報URL。
    - [ここ](https://weather.yahoo.co.jp/weather/)から天気情報を取得したい地域を選択して、https://weather.yahoo.co.jp/weather/jp/**/****.html の形式で指定すること。

```python
# coding: UTF-8
import requests
import json
from bs4 import BeautifulSoup

# webhook url
SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/**/**'
# weather url
WEATHER_INFO_URL = 'https://weather.yahoo.co.jp/weather/jp/**/****.html'

# Slack通知メッセージ用
fields = []

# スクレイピング
html = requests.get(WEATHER_INFO_URL)
soup = BeautifulSoup(html.content, "html.parser")

# 場所
title = soup.find('title').text;idx = title.find(' -')
place = title[:idx]

main = soup.find('div', id='wrapper').find('div', id='contents').find('div', id='contents-body').find('div', id='main')
# 発表時間
updated_date = main.find('div', class_='yjw_title_h2').find('p').text
# 現時点の天気情報取得
todays_weather = main.find('div', class_='forecastCity').find('table').find('tr').find('td').find('div')
# 日付
date = todays_weather.find('p', class_='date').text
# 天気情報
weather_text = todays_weather.find('img')['alt']
# 天気画像
weather_image_url = todays_weather.find('img')['src']
# 最高気温
highest_temperature = todays_weather.find('ul', class_='temp').find('li', class_='high').text
message = {"title":'最高気温', "value":highest_temperature,"short":False};fields.append(message)
# 最低気温
lowest_temperature = todays_weather.find('ul', class_='temp').find('li', class_='low').text
message = {"title":'最低気温', "value":lowest_temperature,"short":False};fields.append(message)
# 降水情報取得
table = todays_weather.find('table')
# 時間帯
time_rows = table.find('tr', class_='time').find_all('td')
time = [i.text for i in time_rows] # ['0-6', '6-12', '12-18', '18-24']
time_text = '|'.join(time)
# 降水確率
precip_rows = table.find('tr', class_='precip').find_all('td')
precip = [i.text for i in precip_rows]
precip_text = '|'.join(precip)
message = {"title":'降水情報', "value":time_text + '\n' + precip_text,"short":False};fields.append(message)
# 風
wind = todays_weather.find_all('dd')[0].text
message = {"title":'風', "value":wind,"short":False};fields.append(message)
# 波
wave = todays_weather.find_all('dd')[1].text
message = {"title":'波', "value":wave,"short":False};fields.append(message)

# 花粉情報
#pollen_info = main.find('div', class_='pollenInduction').find('div', class_='pollenInduction_contents') \
#                    .find('div', class_='forecast').find('ul').find('li').find('p', class_='flying').find('span').text
#message = {"title":'花粉情報', "value":pollen_info,"short":False};fields.append(message)

# 指数情報取得
index_info = main.find('div', class_='indexList').find('div', class_='tabView_content')
# 洗濯
washing = index_info.find('dl', class_='indexList_item-laundry').find('dd').find('p', class_='index_text').text
message = {"title":'洗濯', "value":washing,"short":False};fields.append(message)
# 傘
umbrella = index_info.find('dl', class_='indexList_item-umbrella').find('dd').find('p', class_='index_text').text
message = {"title":'傘', "value":umbrella,"short":False};fields.append(message)
# 重ね着
clothing = index_info.find('dl', class_='indexList_item-clothing').find('dd').find('p', class_='index_text').text
message = {"title":'重ね着', "value":clothing,"short":False};fields.append(message)
# 乾燥
skindried = index_info.find('dl', class_='indexList_item-skindried').find('dd').find('p', class_='index_text').text
message = {"title":'乾燥情報', "value":skindried,"short":False};fields.append(message)

# 色指定
# 雨の場合はwarningにする
color = 'good'
if '雨' in weather_text:
    color = 'warning'

message = {
    "username":'Weather_Infomation',
    "icon_emoji":':simple_smile:',
    "attachments":[
        {
            "pretext": date + 'の' + place + 'は、' + weather_text +'です。(' + updated_date + ')',
            "image_url":weather_image_url,
            "color":color,
            "fields":fields
        }
    ]
}
requests.post(SLACK_WEBHOOK_URL, data=json.dumps(message))
```
Slackのユーザ名やアイコンを変更したい場合は`username`や`icon_emoji`を書き換えればOK。
不要な情報はコメントアウトして消してください。

※Yahoo側でフォーマットの変更があればいつか使えなくなる可能性あり。