本記事ついて
本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。
参考資料
https://www.udemy.com/course/python-kaizen/learn/lecture/26849736#overview
目標
LINE Notifyを使い、Webスクレイピングを行って、明日の天気予報を自分のLINEに送る。
環境
以前はCloud9を使用していましたが、今回はExcelのため変えることにしました
Windows 10
Jupyter Notebook
そのため構文に少し違いがあります。
気を付けてください
LINE Notify
LINE Notifyとは
LINEと外部のWebサービスやアプリを連携し、ユーザーがカスタマイズされた好みの情報を受け取ることができる機能
アクセストークン発行
自分が書くより説明がしっかりなされていたのでこちらを参照してください
https://qiita.com/iitenkida7/items/576a8226ba6584864d95
コピーしてメモ帳へ
エンドポイントURLを取得
こちらはマイページに行って
トークン発行の下にある
LINE Notify API Documentをクリック
そちらの通信系(認証系もあるので注意)のPOSTから先の部分をコピーしてメモ帳へ
Jupyter上でトークンとエンドポイントURLを記述
発行したトークンと
エンドポイントURL
Jupyter上で
token="ご自身のアクセストークン"
url="https://notify-api.line.me/api/notify"
実行する
requestsをインポート
requestsとは
PythonのHTTP通信ライブラリです。
使い方は
こちらのほうがわかりやすいので
https://hibiki-press.tech/python/requests_module/1882
実際にLINEに送ってみる
auth={"Authorization":"Bearer "+token}
content={"message":"利樹大好き"}
requests.post(url,headers=auth,data=content)
LINE NotifyからLINEが来たと思います。
天気予報をWebスクレイピングする
BeautifulSoup4
BeautifulSoup4とは
HTMLファイルやXMLファイルからデータを抽出するためのPythonライブラリ
BeautifulSoup4インストール
!pip install BeautifulSoup4
BeautifulSoup4インポート
from bs4 import BeautifulSoup
天気の情報を取ってくる
今回はYahoo天気を使います
urlを変数に格納
tenki_url="https://weather.yahoo.co.jp/weather/jp/1b/1400.html"
urlの情報を変数に格納
response=requests.get(tenki_url)
今のままではtext情報がすごい分かりずらくなるので
BeautifulSoupを使いわかりやすくする。
そしてそれを変数に格納
html=BeautifulSoup(response.text,"html.parser")
必要な情報を取ってくる
このままだと情報がありすぎるので必要な情報を精査する
find_allメソッドを使う
attrsで属性を指定
リストの中にあるので必要な個所を取り出す[]を使って配列を指定
変数に格納
forecast=html.find_all("div",attrs={"class":"forecastCity"})[0]
明日の天気が欲しいのでそれも精査する
tomorrow=forecast.find_all("div")[1]
必要な個所に限定し余計な文字、スペースを取る
textで情報を取得
余計な文字は
replaceで除去
変数に格納
weather=tomorrow.find_all("p",attrs={"class":"pict"})[0].text.replace("\n","").replace(" ","")
同じ要領で必要個所の抽出
最高、最低気温
high=tomorrow.find_all("li")[0].text
low=tomorrow.find_all("li")[1].text
書く時間の降水確率
rain_06=tomorrow.find_all("td")[4].text
rain_0612=tomorrow.find_all("td")[5].text
rain_1218=tomorrow.find_all("td")[6].text
rain_1824=tomorrow.find_all("td")[7].text
LINEに天気の情報を送る
messageに天気の情報を格納する
\nで改行する方法もあるのだが水らくなるため
""""""を使って改行する
message="""
明日の天気は{}
最高気温{}
最低気温{}
降水確率は
0-6時{}
6-12時{}
12-18時{}
18-24時{}
です。""".format(weather,high,low,rain_06,rain_0612,rain_1218,rain_1824)
送ってみる
auth={"Authorization":"Bearer "+token}
content={"message":message}
requests.post(url,headers=auth,data=content)
できました~~
分かりにくいのでまとめたコードを作って見ました
import requests
from bs4 import BeautifulSoup
#LINEにつなげるトークン
token="ご自身のアクセストークン"
#エンドポイント
url="https://notify-api.line.me/api/notify"
#Yahoo天気のURL
tenki_url="https://weather.yahoo.co.jp/weather/jp/1b/1400.html"
#天気情報を取ってくる
response=requests.get(tenki_url)
html=BeautifulSoup(response.text,"html.parser")
forecast=html.find_all("div",attrs={"class":"forecastCity"})[0]
tomorrow=forecast.find_all("div")[1]
#各情報を文字化
weather=tomorrow.find_all("p",attrs={"class":"pict"})[0].text.replace("\n","").replace(" ","")
high=tomorrow.find_all("li")[0].text
low=tomorrow.find_all("li")[1].text
rain_06=tomorrow.find_all("td")[4].text
rain_0612=tomorrow.find_all("td")[5].text
rain_1218=tomorrow.find_all("td")[6].text
rain_1824=tomorrow.find_all("td")[7].text
#LINEに送るメッセージを作る
message="""
明日の天気は{}
最高気温{}
最低気温{}
降水確率は
0-6時{}
6-12時{}
12-18時{}
18-24時{}
です。""".format(weather,high,low,rain_06,rain_0612,rain_1218,rain_1824)
#LINEに送る
auth={"Authorization":"Bearer "+token}
content={"message":message}
requests.post(url,headers=auth,data=content)