アメグラ2号のブログ

1980年代後半の古き良きビデオゲームのほか、オッサンの個人的備忘録

python(requests, bs4) WEBスクレイピング~テキストファイル出力

f:id:game-allergy:20210331143049p:plain

そうだ、基本的なこととしてテキストファイルの出力を忘れていた。データ取得したら何かしらのファイルへ出力するんだから、これくらいはやっておかないと。

#===============================
# WEBスクレイピング
# tenki.jpの天気予報情報を取得
# テキストファイルへ書き出す
#===============================
import requests
import bs4

#===============================
# 特定WEBサイトから情報を取得
#===============================
# 情報取得したいURL
URL = 'https://tenki.jp/forecast/3/17/4610/14100/1hour.html'
# URLへアクセス
r = requests.get(URL)
# 解析しやすいデータに
s = bs4.BeautifulSoup(r.text, 'html.parser')
#------------------------------
# データ収集
# 当日含む3日分(24*3=72)
# 要素数・・・72こ
#------------------------------
# 気温情報の取得
list_date= []
for j in s.find_all('tr' , class_ ='head'):
    for i in j.find_all('p'):
        list_date.append(i.text)

# 気温情報の取得
list_temp= []
for j in s.find_all('tr' , class_ ='temperature'):
    for i in j.find_all('span' ):
        list_temp.append(i.string)

# 天気情報(晴れとか)の取得
list_weather = []
for j in s.find_all('tr' , class_ ='weather'):
    for i in j.find_all('p'):
        list_weather.append(i.string)

# 時刻の取得
list_hour = []
for j in s.find_all('tr' , class_ ='hour'):
    for i in j.find_all('span'):
        list_hour.append(i.string)

# 風向きの取得
list_windblow = []
for j in s.find_all('tr' , class_ ='wind-blow'):
    for i in j.find_all('p'):
        list_windblow.append(i.string)

# 風速の取得
list_windspeed = []
for j in s.find_all('tr' , class_ ='wind-speed'):
    for i in j.find_all('span'):
        list_windspeed.append(i.string)

# 湿度の取得
list_humid = []
for j in s.find_all('tr' , class_ ='humidity'):
    for i in j.find_all('td'):
        list_humid.append(i.string)

#------------------------------
# 各情報を2次元配列へ格納する
#------------------------------
List_all =[list_hour, list_weather, list_temp, list_windspeed,list_windblow, list_humid]

#------------------------------
# テキストファイルへ書き込み
#------------------------------
# ファイル名指定
fileName = "httpText.txt"

# ファイル作成、書き込み
with open(fileName, "wt", encoding="utf-8") as f:
    # 2次元配列を文字列に直してから書き込み
    f.write(str(List_all))
f.close()

#------------------------------
# ファイル読込、ディスプレイ表示
#------------------------------
f = open(fileName, "r", encoding="utf-8")
text = f.read()
print(text)
f.close()

print('-------------------------------')
print('end of line')
input()

"""
備考;
テキストファイルの書き込み:open(filename, "w")は、「w」「a」にして、f.write()命令を。
テキストファイルの読み込み:open(filename, "r")は、「r」にして、f.read()命令を。
※readするときに「w」とするとエラー。
※writeするときに「r」とするとエラー。
"""

◆ディスプレイへの出力結果

f:id:game-allergy:20210415180733j:plain

◆テキストファイルへの出力結果

f:id:game-allergy:20210415180813j:plain

テキストファイルへ出力できたからなんやねんって話だけど、2次元配列(リスト)をそのままwriteできなかったというハマりもあった。リストはディスプレイにはそのままprint()でいけるけど、テキストファイルにはいったんstr()で文字列にしてからじゃないとアカン。
わかっている人には当たり前じゃん!ってことなんだろうけど、いちおうハマったのでここに書いておこう。

◆もっとシンプルに出しておきたい

f:id:game-allergy:20210415182756j:plain

何かしらで抽出したデータをテキストファイルにし、その後DBに読み込ます場合は単純な文字列のほうが良さそう。その場合は、こちらのほうがシンプルかな。

# ファイル作成、書き込み
str_temp=','.join(list_temp)
with open(fileName, "wt", encoding="utf-8") as f:
    f.write(str_temp)
f.close()

joinってこういう風に使うんだ、、、勉強になります。

python(pandas, matplot) DBからグラフに書き出す その3

f:id:game-allergy:20210331143049p:plain

matplotによってグラフ書き出しはできた。が、このグラフを毎回ディスプレイに表示なんてしないよな…画像ファイルにして日ごとに並べて比較していったほうがわかりやすくなる。となると、グラフを画像ファイルにして保存する必要がある。

ってことで、グラフを画像ファイルとして保存する。

#===============================
# DB内テーブル中身の確認(pandas)
# matplotでグラフ書き出し
# 複数グラフ作成
#===============================
import sqlite3
import pandas as pd
import matplotlib.pyplot as plt

#-----------------------------
# 日付情報取得(ファイル名用)
#-----------------------------
import datetime
td1 = datetime.date.today()
td2 = td1.strftime('%Y%m%d')

#-----------------------------
# DB接続、カーソル起動
#-----------------------------
dbname = 'TEST.db'
connection = sqlite3.connect(dbname)
cur = connection.cursor()
#-----------------------------
# データを2種類、DBから引き出す
#-----------------------------
# 0-24時までのデータ(data1)
sql1 = 'SELECT temp, hour FROM WeatherTable LIMIT 24'
c1 =cur.execute(sql1)
result1 = c1.fetchall()
#print(result1)

# 次の日の0-24時までのデータ(data2)
sql2 = 'SELECT temp, hour FROM WeatherTable LIMIT 24,24'
c2 = cur.execute(sql2)
result2 = c2.fetchall()
#print(result2)

#-----------------------------
# 0-24時までのデータ(data3)
sql3 = 'SELECT humid, hour FROM WeatherTable LIMIT 24'
c3 =cur.execute(sql3)
result3 = c3.fetchall()
print(result3)

# 次の日の0-24時までのデータ(data4)
sql4 = 'SELECT humid, hour FROM WeatherTable LIMIT 24,24'
c4 = cur.execute(sql4)
result4 = c4.fetchall()
print(result4)

#-----------------------------
# DataFrameにする
#-----------------------------
#データフレーム(表に書き出すイメージ)
df1 = pd.DataFrame(result1,columns=["temp", "hour"])
df2 = pd.DataFrame(result2,columns=["temp", "hour"])
df3 = pd.DataFrame(result3,columns=["humid", "hour"])
df4 = pd.DataFrame(result4,columns=["humid", "hour"])

#-----------------------------
# グラフの準備(2つのグラフ)
#-----------------------------
# グラフのX軸、Y軸の指定
x1 = df1.hour
y1 = df1.temp
x2 = df2.hour
y2 = df2.temp
x3 = df3.hour
y3 = df3.humid
x4 = df4.hour
y4 = df4.humid

# グラフ上限値を決めておく(5℃~25℃)
tempMin = 5
tempMax = 25
humidMin = 0
humidMax = 100

# 表示エリアの設定
# fig内にchart1,chart2が横並びする形式にする
# まずは、figのオブジェクト生成(名前もつける)
fig = plt.figure(td2 + "_01")
# (data1)----------------------------
# add_subplot(行、列、場所)
chart1 = fig.add_subplot(1,2,1)
# データプロット
chart1.plot(x1, y1)
# Y軸の最小、最大値を取得
#ymin, ymax = plt.ylim()
plt.ylim(tempMin, tempMax)
# グラフ内のラベル表記
chart1.set_title("Today")
chart1.set_xlabel("Time")
chart1.set_ylabel("Temperature(℃)")
# (data2)----------------------------
# add_subplot(行、列、場所)
chart2 = fig.add_subplot(1,2,2)
# データプロット
chart2.plot(x2, y2)
# data1で取得したY軸情報をdata2に設定(同じにする)
#plt.ylim(ymin, ymax)
plt.ylim(tempMin, tempMax)
# グラフ内のラベル表記
chart2.set_title("Tomorrow")
chart2.set_xlabel("Time")
chart2.set_ylabel("Temperature(℃)")


# まずは、figのオブジェクト生成(名前もつける)
fig2 = plt.figure(td2+"_02")
# (data3)----------------------------
# add_subplot(行、列、場所)
chart3 = fig2.add_subplot(1,2,1)
# データプロット
chart3.plot(x3, y3)
# data1で取得したY軸情報をdata2に設定(同じにする)
plt.ylim(humidMin, humidMax)
# グラフ内のラベル表記
chart3.set_title("Today")
chart3.set_xlabel("Time")
chart3.set_ylabel("Humidity(%)")

# (data4)----------------------------
# add_subplot(行、列、場所)
chart4 = fig2.add_subplot(1,2,2)
# データプロット
chart4.plot(x4, y4)
# data1で取得したY軸情報をdata2に設定(同じにする)
plt.ylim(humidMin, humidMax)
# グラフ内のラベル表記
chart4.set_title("Tomorrow")
chart4.set_xlabel("Time")
chart4.set_ylabel("Humidity(%)")

#-----------------------------
# グラフの設定
#-----------------------------
fig.tight_layout() 
fig2.tight_layout() 
#-----------------------------
# グラフの表示
#-----------------------------
#plt.show()
#-----------------------------
# グラフの保存
#-----------------------------
fig.savefig(td2 + "_fig_temp.jpg")
fig2.savefig(td2 + "_fig_humid.jpg")

"""
#==================
# ディスプレイにデータ表示
#==================
# ディスプレイ表示省略しない
pd.set_option("display.max_colwidth", None)
pd.set_option("display.max_rows", None)

# ディスプレイに表示
print(df1)
print(df2)
print(df3)
print(df4)
"""

#==================
#DB終了処理
#==================
cur.close()
connection.close()

print('--------------------')
print('Pandas and Matplot; end of line')

前回とほとんど同じで、ファイル保存のための命令にfig.savefig(td2 + "_fig_temp.jpg")が入っただけね。ファイル名は日付情報を取得してその文字列を引用している。ま、よくやる方法ね。あ、ファイルが上書きできてしまうなぁ…これではグラフのファイルを貯めることができないなぁ。。。後で考えよう。

それにしても…何も考えずにつけ足していくとスクリプトが縦長になって読みづらい・・・まぁ動作検証が目的だから仕方ないところ。

◆今回作成したグラフ(見た目はとくに変化ないけど)

f:id:game-allergy:20210415162102j:plain

今日と明日の気温はほとんど変わらず。明日の夕方以降はそれほど気温が下がらないみたい。

f:id:game-allergy:20210415162111j:plain

明日の湿度は50%以上なので程よい湿気という感じ。洗い物のし過ぎで指の皮がボロボロになるってのもないね。冬の乾燥する時期って人差し指とかボロボロになって剥けると痛いんだよなぁ…ユースキンを手放せなかったけど、これからの季節はもう要らなくなるかな?

あれ?明日の夜から湿度が高くなってるって、また雨降るのかぁ?

ミートソース やっぱり美味しい

f:id:game-allergy:20210414173336j:image

ミートソース、うちの定番レシピになりつつある。作り置きして冷凍しておけば、今日は何食べよっか?なんて時に助かる。

スパゲティ以外に、ご飯に乗せても、パンに乗せても美味しい万能なおかずだ。

ただ、塩分気になるかもね〜。

 

◆準備 

・玉ねぎ1個→みじん切り

・ニンジン半分→みじん切り

 

◆フライパン

(1)たまねぎを色が変わるまで炒めて甘さを出す

油、大さじ1を敷く

玉ねぎ、弱火、15分くらい

 

(2)肉、ニンジン投入

・ひき肉200gくらい

・ニンジン

 

(3)少し炒めた後、料理酒を投入

肉の臭みを取りたいのと、蒸し焼きにして具に火を通す。

 

(4)トマト缶、ローリエ1枚を投入

トマト缶を入れて弱火で15分~20分くらい?

煮ることで酸味をとばす。

ローリエは臭みとり。

 

(5)味付け

・ハチミツをぐーるぐる

コンソメをぱらぱら~

・ニンニクチューブをにゅるにゅる~

 

この時点でかなり薄味

冷凍するなかここでいいかな。

 

(6)味付け その2

・スライスチーズを1枚

・塩ひとつまみ

 

 

game-allergy.hatenablog.com

game-allergy.hatenablog.com


 

python(pandas, matplot) DBからグラフに書き出す その2

f:id:game-allergy:20210331143049p:plain

前回matplotでグラフに書き出しをしたが、1つのグラフを出すより、2つのグラフを並べて比較する…ってのが現実的な使い方だと思う。
ということで、当日の天気と、翌日の天気情報を比較できるグラフを作成してみる。

◆グラフを2つ表示する

#===============================
# DB内テーブル中身の確認(pandas)
# matplotでグラフ書き出し
# 複数グラフ作成
#===============================
"""
DBのテーブルには72時間分(72個)のデータが並んでいる。
当日、翌日、翌々日のうち、
「当日、翌日」を比較するグラフを作成する
"""

import sqlite3
import pandas as pd
import matplotlib.pyplot as plt

#-----------------------------
# DB接続、カーソル起動
#-----------------------------
dbname = 'TEST.db'
connection = sqlite3.connect(dbname)
cur = connection.cursor()
#-----------------------------
# データを2種類、DBから引き出す
#-----------------------------
# 0-24時までのデータ(data1)
sql1 = 'SELECT temp, hour FROM WeatherTable LIMIT 24'
c1 =cur.execute(sql1)
result1 = c1.fetchall()
#print(result1)

# 次の日の0-24時までのデータ(data2)
sql2 = 'SELECT temp, hour FROM WeatherTable LIMIT 24,24'
c2 = cur.execute(sql2)
result2 = c2.fetchall()
#print(result2)

#-----------------------------
# DataFrameにする
#-----------------------------
#データフレーム(表に書き出すイメージ)
df1 = pd.DataFrame(result1,columns=["temp", "hour"])
df2 = pd.DataFrame(result2,columns=["temp", "hour"])

#-----------------------------
# グラフの準備(2つのグラフ)
#-----------------------------
# グラフのX軸、Y軸の指定
x1 = df1.hour
y1 = df1.temp
x2 = df2.hour
y2 = df2.temp

# 表示エリアの設定
# fig内にchart1,chart2が横並びする形式にする
# まずは、figのオブジェクト生成
fig = plt.figure()

# グラフ上限値を決めておく(5℃~25℃)
tempMin = 5
tempMax = 25

# (data1)----------------------------
# add_subplot(行、列、場所)
chart1 = fig.add_subplot(1,2,1)
# データプロット
chart1.plot(x1, y1)
# Y軸の最小、最大値を取得
#ymin, ymax = plt.ylim()
plt.ylim(tempMin, tempMax)
# グラフ内のラベル表記
chart1.set_title("Today")
chart1.set_xlabel("Time")
chart1.set_ylabel("Temperature(℃)")
# (data2)----------------------------
# add_subplot(行、列、場所)
chart2 = fig.add_subplot(1,2,2)
# データプロット
chart2.plot(x2, y2)
# data1で取得したY軸情報をdata2に設定(同じにする)
#plt.ylim(ymin, ymax)
plt.ylim(tempMin, tempMax)
# グラフ内のラベル表記
chart2.set_title("Tomorrow")
chart2.set_xlabel("Time")
chart2.set_ylabel("Temperature(℃)")

#-----------------------------
# グラフの表示
#-----------------------------
fig.tight_layout() 
plt.show()

#==================
# ディスプレイにデータ表示
#==================
# ディスプレイ表示省略しない
pd.set_option("display.max_colwidth", None)
pd.set_option("display.max_rows", None)

# ディスプレイに表示
print(df1)
print(df2)
#==================
#DB終了処理
#==================
cur.close()
connection.close()

print('--------------------')
print('end of line')
input()

スクリプト概要

取得した情報が72時間分=72個のデータで、これをどうやって当日、翌日にわけようかと…そうしないと2つのグラフにならないし。とりあえずSQLで出す時点で条件分けて2つのデータを抽出することにしてみた。その後、各データfetchall()で全読みしたものをリストに。そのリストをデータフレームにしてグラフ化しやすい状態に。データフレームのオブジェクトにした後はx軸にhour、y軸にtempと割り当てればグラフ化できる、こりゃ簡単だ。

ちょっとハマったのはグラフを2つにする箇所。グラフ2つを1つの表示エリアに出す…には、plt.figure()でオブジェクトを作成しておくところ、ここがキモだ。これが出来上がれば後はこの中にグラフ2つ、chart1,chart2を設定していけばいい。

2つのグラフの最大値がバラバラになってしまう問題は、plt.ylim(**,**)で直打ちした。。。最初作成したグラフから最小値、最大値を取得して次のグラフに値をセットする方法もあったけど、見たい領域が決まっているなら自分で指定したほうが早い。今の季節なら5℃~25℃くらいでいいでしょってことで。

◆実行結果

f:id:game-allergy:20210414164131j:plain

当日の気温の変化、翌日の気温の変化、を視覚的に確認できる。

ええ?今日の最高気温は22.5℃くらいなのに、明日は17.5℃??しかも今日の夜中から10℃切るって???4月の半ばだというのにまだまだ寒い。

f:id:game-allergy:20210414164200j:plain

◆気になったので湿度も取得してみた

f:id:game-allergy:20210414221421j:plain f:id:game-allergy:20210414221321j:plain

TVの天気予報を見ていたら明日は乾燥してカラッカラだって。え?そーなの?そうか、温度の変化と一緒に湿度の変化があったほうが環境の変化を掴みやすい。温度が低くて湿度が低い→人体には良くない…とか直感的に把握しやすくなる。

というか、明日ってこんなに湿度が低下しちゃうの???今日はさんざん雨降ってジメジメだったのに明日は20%くらい?
こりゃ明日は洗濯日和だね。

python(pandas, matplot) DBからグラフに書き出す

f:id:game-allergy:20210331143049p:plain

DBへの格納ができたので、今度はそのデータをグラフ化する。数字の羅列は表形式にすれば分かりやすくなるけど、一般的にはグラフのほうがイメージが伝わりやすいし、一目で状態を把握できる。じゃ、やってみよう。

#===============================
# DB内テーブル中身の確認(pandas)
# matplotでグラフ書き出し
#===============================
import sqlite3
import pandas as pd
import matplotlib.pyplot as plt

dbname = 'TEST.db'
connection = sqlite3.connect(dbname)
cur = connection.cursor()

sql1 = 'SELECT temp, hour FROM WeatherTable LIMIT 24'
cur.execute(sql1)

"""
備考;
データが3日分連続であり、それをグラフ表示すると見づらいので、
SQLで抽出時に、LIMITを使用。
(例)LIMIT 24・・・上限24
(例)LIMIT 2,10・・・3から上限10まで
"""
# データがあるところまで全て読み込む(リスト構造)
result = cur.fetchall()

#データフレーム(表に書き出すイメージ)
df = pd.DataFrame(result,columns=["temp", "hour"])
"""
備考;
書式:DataFrame(data,index,columns)
今回はindex省略のため、(Data, Columns)を引数とる。
X軸=時間、Y軸=気温のグラフを作成するので、
temp, hourのデータを変数dfに書き出す。
"""

# グラフのX軸、Y軸の指定
x = df.hour
y = df.temp

# データの指定
plt.plot(x, y)

# グラフ内のラベル設定
plt.xlabel("Time")
plt.ylabel("Temperature(℃)")
plt.grid(True)
plt.tick_params(axis='both',which='major',labelsize=14)

# グラフの表示
plt.show()


#==================
# ディスプレイにデータ表示
#==================
# ディスプレイ表示省略しない
pd.set_option("display.max_colwidth", None)
pd.set_option("display.max_rows", None)

# ディスプレイに表示
print(df)


#==================
#DB終了処理
#==================
cur.close()
connection.close()

print('--------------------')
print('end of line')
input()

◆実行結果(グラフ)

matplotlib
matplotlib

グラフにしてみると分かりやすい。明け方はずいぶん冷え込んだねぇ。4月なのに11℃って…。一方日中の昼過ぎになると18℃くらいまであがっている。

◆実行結果(DataFrameをディスプレイに表示)

◆データ取り出した時のリスト構造はこんな感じ(見づらいな~)

↑ このデータはresult = cur.fetchall()の後に、print(result)やってみると出る。なんかどっかで見たような形式だなぁ…あ、PlanetOSで取得した気象情報のjsonだ。まったく同じではないけど。。。なるほどねぇ、どの言語も似たような表現なんだなぁ。。。

python(sqlite3) WEBスクレイピング~DB記録 

f:id:game-allergy:20210331143049p:plain

前回はWEBスクレイピングができたので、取得した情報をデータベースに格納してみる。なんだかんだで、データベースへの出し入れは必須だと思うのでいまのうちに整理しておきたい。

流れは、

    DB作成
    テーブル作成
    WEBスクレイピング
    DBへ格納

最後にDB内のデータ確認、、、こんなところか。

◆DB作成

#===============================
# DBの作成
#===============================
import sqlite3

dbname = 'TEST.db'
connection = sqlite3.connect(dbname)
connection.close()

print('--------------------')
print('end of line')
input()

◆テーブル作成

#===============================
# DB内のテーブル作成
#===============================
import sqlite3

dbname = 'TEST.db'
connection = sqlite3.connect(dbname)

cur = connection.cursor()
sql = 'CREATE TABLE WeatherTable(id INTEGER PRIMARY KEY AUTOINCREMENT, hour STRING, weather STRING, temp DOUBLE, windspeed INTEGER, windblow STRING)'
cur.execute(sql)

connection.commit()
connection.close()

print('--------------------')
print('end of line')
input()

"""
id INTEGER PRIMARY KEY AUTOINCREMENT,
hour STRING,
weather STRING,
temp DOUBLE,
windspeed INTEGER,
windblow STRING
"""

データベースに登録するテーブルは、6個のカラムに。Id, hour, weather, temp, windblow, windspeedで、それぞれTenki.jpから取得する情報をもとに型を設定。例えばhourは時刻だけど、「01」「02」「03」…と毎時刻のことだけを表現していたのでこれは単なる文字列だろってことでstringに。
id はプライマリキーにしてオートインクリメントにしているのは、意識せずに数字が自動的に繰り上がってくれて番号をふってくれるので楽ちんだから。記録するたびに自分で連番をふるのは面倒でしょってことで。

◆WEBスクレイピング~DB記録

#===============================
# WEBスクレイピング
# tenki.jpの天気予報情報を取得
# 取得した情報をDBへ格納する
#===============================
import requests
import bs4
import sqlite3

#===============================
# 特定WEBサイトから情報を取得
#===============================
# 情報取得したいURL
URL = 'https://tenki.jp/forecast/3/17/4610/14100/1hour.html'
# URLへアクセス
r = requests.get(URL)
# 解析しやすいデータに
s = bs4.BeautifulSoup(r.text, 'html.parser')
#------------------------------
# データ収集
# 当日含む3日分(24*3=72)
# 要素数・・・72こ
#------------------------------
# 気温情報の取得
list_temp= []
for j in s.find_all('tr' , class_ ='temperature'):
    for i in j.find_all('span' ):
        list_temp.append(i.string)

# 天気情報(晴れとか)の取得
list_weather = []
for j in s.find_all('tr' , class_ ='weather'):
    for i in j.find_all('p'):
        list_weather.append(i.string)

# 時刻の取得
list_hour = []
for j in s.find_all('tr' , class_ ='hour'):
    for i in j.find_all('span'):
        list_hour.append(i.string)

# 風向きの取得
list_windblow = []
for j in s.find_all('tr' , class_ ='wind-blow'):
    for i in j.find_all('p'):
        list_windblow.append(i.string)

# 風速の取得
list_windspeed = []
for j in s.find_all('tr' , class_ ='wind-speed'):
    for i in j.find_all('span'):
        list_windspeed.append(i.string)

#------------------------------
# 各情報を2次元配列へ格納する
#------------------------------
List_all =[list_hour, list_weather, list_temp, list_windspeed,list_windblow]

"""
備考;
List_all =[list_hour, list_weather, list_temp, list_windblow, list_windspeed]
上記は、「5 × 72」の配列
[0]list_hour[0-71]             --> List_all [0][0], [0][1], [0][2], [0][3]…
[1]list_weather[0-71]        --> List_all [1][0], [1][1], [1][2], [1][3]…
[2]list_temp[0-71]             --> List_all [2][0], [2][1], [2][2], [2][3]…
[3]list_windspeed[0-71]       --> List_all [3][0], [3][1], [3][2], [3][3]…
[4]list_windblow[0-71]     --> List_all [4][0], [4][1], [4][2], [4][3]…
"""


#------------------------------
# 確認用
#------------------------------
for i in range(0,72,1):
        print(List_all[0][i], List_all[1][i], List_all[2][i], List_all[3][i], List_all[4][i])


#===============================
# DB接続~DBへデータ格納
#===============================

dbname = 'TEST.db'
connection = sqlite3.connect(dbname)

cur = connection.cursor()
sql1 = 'INSERT INTO WeatherTable(hour, weather, temp, windspeed, windblow) VALUES(?,?,?,?,?)'


for i in range(0,72,1):
    cur.execute(sql1,(List_all[0][i], List_all[1][i], List_all[2][i], List_all[3][i], List_all[4][i]))

connection.commit()
cur.close()
connection.close()


input()

"""
DB備考;
DB name:TEST.db
table name:WeatherTable

テーブル作成時のフィールド名;
id INTEGER PRIMARY KEY AUTOINCREMENT,
hour STRING,
weather STRING,
temp DOUBLE,
windblow STRING,
windspeed INTEGER

"""

最初は書籍の通りにスクリプトを書いてみたが、内容は1つずつ要素を取得してSQLで書き込んで…のfor文だった。え~、これだと要素を見つけた時点でSQL書き込んでしまうので、複数の要素を配列としてデータベースに保管するにはなんだかな~ってなった。
ってことだと、、、どうしたらいいか???
とりあえず要素を取得してリストに保管するか。
気づいてみればスクレイピングの情報取得の仕方がかなりアレな感じになってしまった…わざわざ気温、時刻、風速…とか別個で取得してしまったよ。。。3日分つまり72時間で、1時間ごとのデータなので各データは72個ある。気温が72個、時刻が72個、風速が72個…あ〜うざったい、なんでバラバラやねん!ってことで、各データはリストという1次元配列なので、それらを束ねて2次元配列にし、それをfor文でぶん回してsqlで叩き込んでいく感じにしてみた。Excelの表を1行ずつ書き込んでいるイメージだね。
本来ならHTMLを1回読み込んで、find_allで要素をなめていくときに、取得したい情報をSelect?Switch?で各リストに保管してけばキレイになるんだろね…オレのみたいに何回もfind_allやるのはなんだかな~なんだろうなぁ…。でも見つけたい要素数が72コと少ないからこんなんでいいんでしょ。(シロウト発想)

◆テーブル中身の確認(単純に)

#===============================
# DB内テーブル中身の確認
#===============================
import sqlite3

dbname = 'TEST.db'
connection = sqlite3.connect(dbname)

cur = connection.cursor()
sql1 = 'SELECT * FROM WeatherTable'
cur.execute(sql1)

print(cur.fetchall())

cur.close()
connection.close()

print('--------------------')
print('end of line')
input()

◆テーブル中身の確認(pandas利用)

#===============================
# DB内テーブル中身の確認(pandas)
#===============================
import sqlite3
import pandas as pd

dbname = 'TEST.db'
connection = sqlite3.connect(dbname)
cur = connection.cursor()

sql1 = 'SELECT * FROM WeatherTable'
df = pd.read_sql(sql1, connection)


# ディスプレイ表示省略しない
pd.set_option("display.max_colwidth", None)
pd.set_option("display.max_rows", None)

# ディスプレイに表示
print(df)

cur.close()
connection.close()

print('--------------------')
print('end of line')
input()

◆実行結果

f:id:game-allergy:20210412221026j:plain

SQLで単純にSELECT * FROM・・・とかで引っ張っても、ディスプレイで読みづらい状態だとさすがに萎える…そのためpandsを利用したほうが断然分かりやすい。人間の目って横にも動くけど、上から下に見るほうが比較しやすいというか、把握しやすいのだと思う。(なんだろ、人間工学的な話になりそう・・・。

いや~表形式のデータって見やすいよね、縦に流して見ていくとほんとに見やすいな・・・あれ??風速10m/Sって????そんな嵐なの?明日って??!


そうだ、DBのテーブル削除を載せておこう。何回もテストしているとデータ量がどんどこ増えていくので…。

◆DBテーブル削除

import sqlite3

dbname = 'TEST.db'
connection = sqlite3.connect(dbname)

cur = connection.cursor()
sql = 'DROP TABLE WeatherTable'
cur.execute(sql)

connection.commit()
connection.close()

print('--------------------')
print('end of line')
input()