Obtenez des informations météorologiques avec Python et le grattage

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.

référence

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)

environnement

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

procédure

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")

Exemple de création

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

Obtenez des informations météorologiques avec Python et le grattage
Obtenez des informations sur la propriété en grattant avec python
Scraping prévisions météorologiques avec python
Obtenez des informations sur l'alambic avec Python
Obtenez la météo avec les requêtes Python
Obtenez la météo avec les requêtes Python 2
Obtenez les tendances Qiita avec le scraping Python
[Python] Obtenez des informations sur le package Python avec l'API PyPI
Grattage en Python (préparation)
Essayez de gratter avec Python.
Grattage avec Python + PhantomJS
Obtenez date avec python
Grattage avec du sélénium [Python]
Scraping avec Python + PyQuery
Scraping RSS avec Python
Obtenez des informations sur le processeur de Raspberry Pi avec Python
Script Python pour obtenir des informations de note avec REAPER
[Yahoo! Weather Replacement Version] Comment obtenir des informations météo avec LINE Notify + Python
Obtenez le code du pays avec python
J'ai essayé de gratter avec Python
Grattage au sélénium en Python
Obtenez la chronologie Twitter avec Python
Grattage avec chromedriver en python
Grattage festif avec Python, scrapy
Obtenez des données Youtube avec python
Obtenir des informations avec l'API Zabbix
Grattage avec du sélénium en Python
Grattage avec Tor en Python
Obtenir l'ID de thread avec python
Grattage avec Selenium + Python Partie 2
Commencez avec Python! ~ ② Grammaire ~
J'ai essayé de gratter avec du python
Web scraping débutant avec python
Obtenir le répertoire personnel avec python
Obtenir un événement de clavier avec python
Les débutants en Python sont bloqués dans leur premier scraping Web
[Python] Obtenez des informations sur les utilisateurs et des articles sur l'API de Qiita
Essayez de gratter avec Python + Beautiful Soup
Obtenez des informations sur les fichiers vidéo avec ffmpeg-python
Commencez avec Python! ~ ① Construction de l'environnement ~
Obtenez des avis avec l'API googlemap de python
Scraping avec Selenium en Python (Basic)
Grattage avec Python, Selenium et Chromedriver
Web scraping avec Python Première étape
J'ai essayé webScraping avec python.
Grattage avec Python et belle soupe
Obtenez une capture d'écran Web avec python
[Python] Obtenez des données économiques avec DataReader
Comment démarrer avec Python
[Scraping] Scraping Python
[Petite histoire] Obtenez l'horodatage avec Python
Faisons du scraping d'images avec Python
python Obtenez la météo à venir de l'API météo
[Python x Zapier] Obtenez des informations d'alerte et notifiez avec Slack
Mémo d'apprentissage "Scraping & Machine Learning avec Python"
Essayez Juniper JUNOS PyEz (bibliothèque python) Note 2 ~ Obtenez des informations avec PyEz ~
[Python] Informations sur les lentilles de grattage sur price.com
PhytoMine-I a essayé d'obtenir les informations génétiques de la plante avec Python
Obtenez des données supplémentaires vers LDAP avec python