アメグラ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ってこういう風に使うんだ、、、勉強になります。