Le PG obtenu en grattant les données météorologiques publiées par l'Agence météorologique et produites sous forme de fichier csv est résumé sous forme de mémorandum.
Comment obtenir des informations météorologiques à l'aide de l'API météo en Python Liste des précautions pour le scraping Web [Python Web Scraping Technique Collection "Aucune valeur ne peut être obtenue" Prise en charge de JavaScript @ Ajouté le 6/12] (https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a)
OS : Windows10 64 bit python : 3.7.4
Principaux noms des packages | Utilisation |
---|---|
BeautifulSoup | Analyse de page Web et recherche de balises&Mise en forme des données |
logging | Sortie du journal et paramètres |
namedtuple | Opération Taple |
pandas | Pour les opérations Dataframe |
requests | Obtenir la page Web |
C'est facile à faire. ① Utilisez un package appelé requests pour obtenir les données de la page Web que vous souhaitez obtenir
python
r = requests.get('URL')
② Analysez le contenu avec un package appelé Beautiful Soup
python
soup = BeautifulSoup(r.text,'lxml')
rows = soup.findAll("tr",class_="mtx") #Obtenez des balises en réduisant les conditions
③ Collecter en tant que Dataframe avec des pandas et sortie en csv
python
weatherData = pd.DataFrame(dataList[1:])
#Paramètre de nom de colonne
weatherData.columns = nameList
#Sortie sous forme de fichier csv
weatherData.to_csv(f"{place}{startYear}_{endYear}.csv",encoding="SHIFT-JIS")
GetWeather.py
# coding: UTF-8
#*************************************************************************
#Processus d'acquisition d'informations météorologiques
#
#Données cibles:Informations météorologiques dans la préfecture de Fukuoka
#Traitement du contenu: Acquérir des informations météorologiques auprès de l'Agence météorologique et générer un fichier csv
#* Confirmez qu'il peut être utilisé à des fins commerciales selon les conditions d'utilisation de l'Agence météorologique.
# https://www.jma.go.jp/jma/kishou/info/coment.html
# python ver = 3.7.4
#*************************************************************************
import os
import sys
import requests
import logging.config
from time import time
import datetime as dt
import sqlite3
import pprint
import pandas as pd
from bs4 import BeautifulSoup
from collections import namedtuple
import csv
#*************************************************************************
#Liste des variables
#*************************************************************************
now = dt.datetime.now() #Date et heure actuelles
now =now.strftime("%Y%m%d")
#Emplacement du fichier où réside exe
#Définissez le dossier de travail deux avant le chemin absolu où CODE existe
#Modifiez-le pour spécifier où vous voulez qu'il soit votre fichier de travail, si nécessaire
os.chdir(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../"))
exePath = os.getcwd()
place_codeA = [82]
place_codeB = [47807]
place_name = ["Fukuoka"]
nameList = ["point","Date", "Pression moyenne des terres(hPa)", "Pression moyenne de la mer(hPa)","'Précipitation(mm)", "Température moyenne(℃)", "Humidité moyenne(%)", "Vitesse moyenne du vent(m/s)", "Heure du soleil(h)","Le midi(06:00-18:00)","Nuit(18:00-Jour suivant 06:00)"]
dataList = [nameList]
collist = ["Point"]
base_url = "http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=%s&block_no=%s&year=%s&month=%s&day=1&view=p1"
#***********************************************
#Liste de listes de tuples nommés
#*************************************************************************
#*************************************************************************
#[ ONL : OutputNameList]production/Nom de colonne pour le traitement d'agrégation
#*************************************************************************
#Nom de colonne 0-9,10-19,20-29
partsO =["PT","TIME", "EHPA","SHPA", "RAIN", "TEMPER", "HUMID","WIND","SUM","AM","PM"]
OLNM = namedtuple("ONL", partsO)
OCNL = OLNM("point","Date", "Pression moyenne des terres(hPa)", "Pression moyenne de la mer(hPa)","'Précipitation(mm)", "Température moyenne(℃)", "Humidité moyenne(%)", "Vitesse moyenne du vent(m/s)", "Heure du soleil(h)","Le midi(06:00-18:00)","Nuit(18:00-Jour suivant 06:00)")
#*************************************************************************
#Liste des fonctions
#*************************************************************************
#*************************************************************************
# ParseFloat:Convertir une chaîne en un type float
#argument:
#*************************************************************************
def ParseFloat(str):
try:
return float(str)
except:
return 0.0
#*************************************************************************
#Traitement principal
#argument:
#*************************************************************************
def main():
returnValue = 0
#Paramètres du journal
logging.config.fileConfig(f"{exePath}/python/logging.conf", defaults={'logfilename': f"log/UI_{now}.log" })
logger = logging.getLogger()
logger.info("Traitement de l'acquisition d'informations météorologiques Démarrer l'enregistrement")
startYear = 2018
endYear = 2018
try:
#Boucle sur place
for place in place_name:
index = place_name.index(place)
#2018 dans la déclaration~Jusqu'en 2019
for year in range(startYear,endYear + 1):
#Janvier de l'année~Couvre 12 fois en décembre.
for month in range(1,13):
#Appliquez deux codes de ville, année et mois.
r = requests.get(base_url%(place_codeA[index], place_codeB[index], year, month))
r.encoding = r.apparent_encoding
print(dt.datetime.now())
#Grattage de la table cible.
soup = BeautifulSoup(r.text,'lxml')
rows = soup.findAll("tr",class_="mtx") #Spécifiez la balise et spécifiez le nom de la classe
rows = rows[4:]
#Acquiert une ligne du 1er au dernier jour
for row in rows:
data = row.findAll("td")
#Extrayez uniquement les informations souhaitées
rowData = [] #Initialisation
rowData.append(place) #point
rowData.append(str(year) + "/" + str(month) + "/" + str(data[0].string)) #Date
rowData.append(ParseFloat(data[1].string)) #Pression moyenne des terres(hPa)
rowData.append(ParseFloat(data[2].string)) #Pression moyenne de la mer(hPa)
rowData.append(ParseFloat(data[3].string)) # 'Précipitation(mm)
rowData.append(ParseFloat(data[6].string)) #Température moyenne(℃)
rowData.append(ParseFloat(data[9].string)) #Humidité moyenne(%)
rowData.append(ParseFloat(data[11].string)) #Vitesse moyenne du vent(m/s)
rowData.append(ParseFloat(data[16].string)) #Heure du soleil(h)
rowData.append(data[19].string) #Le midi(06:00-18:00)
rowData.append(data[20].string) #Nuit(18:00-Jour suivant 06:00)
#Ajouter des données à la ligne suivante
dataList.append(rowData)
#Convertir en Dataframe
weatherData = pd.DataFrame(dataList[1:])
#Paramètre de nom de colonne
weatherData.columns = nameList
print(weatherData)
#Sortie sous forme de fichier csv
weatherData.to_csv(f"{place}{startYear}_{endYear}.csv",encoding="SHIFT-JIS")
#Lorsqu'une exception se produit
except:
logger.info("Processus d'acquisition des informations météorologiques Fin anormale")
logger.exception("[Terminé anormalement]")
#Quand ça se termine normalement
else:
logger.info("Processus d'acquisition des informations météorologiques terminé normalement")
finally:
print("{0}".format(returnValue), end="")
#Si vous ne l'avez pas importé en tant que package, procédez comme suit
if __name__ == "__main__":
main()
Recommended Posts