Holen Sie sich Wetterinformationen mit Python & Scraping

Das PG, das durch Abkratzen der von der Meteorologischen Agentur veröffentlichten und als CSV-Datei ausgegebenen meteorologischen Daten erhalten wird, wird als Memorandum zusammengefasst.

Referenz

So erhalten Sie Wetterinformationen mithilfe der Wetter-API in Python Liste der Vorsichtsmaßnahmen für das Web-Scraping [Python Web Scraping Technique Collection "Es gibt keinen Wert, der nicht abgerufen werden kann" JavaScript-Unterstützung @ Hinzugefügt 6/12] (https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a)

Umgebung

OS : Windows10 64 bit python : 3.7.4

Hauptpaketnamen Verwenden
BeautifulSoup Webseitenanalyse & Tag-Suche&Datenformung
logging Protokollausgabe und Einstellungen
namedtuple Taple-Betrieb
pandas Für Dataframe-Operationen
requests Webseite abrufen

Verfahren

Es ist einfach zu machen. ① Verwenden Sie ein Paket namens "Anfragen", um die Daten auf der Webseite abzurufen, die Sie abrufen möchten

python


r = requests.get('URL')

② Analysieren Sie den Inhalt mit einem Paket namens Beautiful Soup

python


soup = BeautifulSoup(r.text,'lxml')
                rows = soup.findAll("tr",class_="mtx") #Holen Sie sich Tags, indem Sie die Bedingungen eingrenzen

③ Als Datenrahmen mit Pandas sammeln und als CSV ausgeben

python


       weatherData = pd.DataFrame(dataList[1:])
       #Einstellung des Spaltennamens
       weatherData.columns  = nameList
       #Ausgabe als CSV-Datei
       weatherData.to_csv(f"{place}{startYear}_{endYear}.csv",encoding="SHIFT-JIS")

Erstellungsbeispiel

GetWeather.py


# coding: UTF-8
#*************************************************************************
#Prozess zur Erfassung von Wetterinformationen
#
#Zieldaten:Wetterinformationen in der Präfektur Fukuoka
#Verarbeitungsinhalt: Erhalten Sie Wetterinformationen von der Meteorologischen Agentur und geben Sie eine CSV-Datei aus
#* Bestätigt, dass es gemäß den Nutzungsbedingungen der Meteorologischen Agentur für kommerzielle Zwecke verwendet werden kann.
#           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 der Variablen
#*************************************************************************
now = dt.datetime.now() #Aktuelles Datum und Uhrzeit
now =now.strftime("%Y%m%d")

#Dateispeicherort, an dem sich exe befindet
#Stellen Sie den Arbeitsordner zwei vor dem absoluten Pfad ein, in dem CODE vorhanden ist
#Ändern Sie es, um bei Bedarf anzugeben, wo es Ihre Arbeitsdatei sein soll
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 = ["Punkt","Datum", "Land durchschnittlicher Druck(hPa)", "Durchschnittlicher Druck des Meeres(hPa)","'Niederschlag(mm)", "Durchschnittstemperatur(℃)", "Durchschnittliche Luftfeuchtigkeit(%)", "Durchschnittliche Windgeschwindigkeit(m/s)", "Sonnenlichtzeit(h)","Mittag(06:00-18:00)","Nacht(18:00-Nächster Tag 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"

#***********************************************
#Benannte Tupellistenliste
#*************************************************************************
#*************************************************************************
#[ ONL : OutputNameList]Ausgabe/Tupple mit Spaltennamen für die Aggregationsverarbeitung
#*************************************************************************
#Spaltenname 0-9,10-19,20-29
partsO =["PT","TIME", "EHPA","SHPA", "RAIN", "TEMPER", "HUMID","WIND","SUM","AM","PM"]

OLNM = namedtuple("ONL", partsO)

OCNL = OLNM("Punkt","Datum", "Land durchschnittlicher Druck(hPa)", "Durchschnittlicher Druck des Meeres(hPa)","'Niederschlag(mm)", "Durchschnittstemperatur(℃)", "Durchschnittliche Luftfeuchtigkeit(%)", "Durchschnittliche Windgeschwindigkeit(m/s)", "Sonnenlichtzeit(h)","Mittag(06:00-18:00)","Nacht(18:00-Nächster Tag 06:00)")

#*************************************************************************
#Funktionsliste
#*************************************************************************
#*************************************************************************
# ParseFloat:Konvertieren Sie eine Zeichenfolge in einen Float-Typ
#Streit:
#*************************************************************************
def ParseFloat(str):
  try:
    return float(str)
  except:
    return 0.0
#*************************************************************************
#Hauptverarbeitung
#Streit:
#*************************************************************************
def main():
   returnValue = 0
   
   #Protokolleinstellungen
   logging.config.fileConfig(f"{exePath}/python/logging.conf", defaults={'logfilename': f"log/UI_{now}.log" })
   logger = logging.getLogger()
   logger.info("Verarbeitung meteorologischer Informationen Erfassen Sie die Aufzeichnung")
   
   startYear = 2018
   endYear = 2018
   try:
       #Schleife an Ort und Stelle
       for place in place_name:
          index = place_name.index(place)
          
          #2018 in für Erklärung~Bis 2019
          for year in range(startYear,endYear + 1):
          
             #Januar des Jahres~Deckt 12 Mal im Dezember ab.
             for month in range(1,13):
                #Wenden Sie zwei Stadtcodes an, Jahr und Monat.
                r = requests.get(base_url%(place_codeA[index], place_codeB[index], year, month))
                r.encoding = r.apparent_encoding
                print(dt.datetime.now())
                #Scraping der Zieltabelle.
                soup = BeautifulSoup(r.text,'lxml')
                rows = soup.findAll("tr",class_="mtx") #Geben Sie das Tag und den Klassennamen an
                
                rows = rows[4:]
                #Erwirbt eine Zeile vom 1. bis zum letzten Tag
                for row in rows:
                   data = row.findAll("td")
                   #Extrahieren Sie nur die gewünschten Informationen
                   rowData = [] #Initialisieren
                   rowData.append(place) #Punkt
                   rowData.append(str(year) + "/" + str(month) + "/" + str(data[0].string)) #Datum
                   rowData.append(ParseFloat(data[1].string)) #Land durchschnittlicher Druck(hPa)
                   rowData.append(ParseFloat(data[2].string)) #Durchschnittlicher Druck des Meeres(hPa)
                   rowData.append(ParseFloat(data[3].string)) # 'Niederschlag(mm)
                   rowData.append(ParseFloat(data[6].string)) #Durchschnittstemperatur(℃)
                   rowData.append(ParseFloat(data[9].string)) #Durchschnittliche Luftfeuchtigkeit(%)
                   rowData.append(ParseFloat(data[11].string)) #Durchschnittliche Windgeschwindigkeit(m/s)
                   rowData.append(ParseFloat(data[16].string)) #Sonnenlichtzeit(h)
                   rowData.append(data[19].string) #Mittag(06:00-18:00)
                   rowData.append(data[20].string) #Nacht(18:00-Nächster Tag 06:00)
                   #Fügen Sie der nächsten Zeile Daten hinzu
                   dataList.append(rowData)
       
       #In Datenrahmen konvertieren
       weatherData = pd.DataFrame(dataList[1:])
       #Einstellung des Spaltennamens
       weatherData.columns  = nameList
       print(weatherData)
       #Ausgabe als CSV-Datei
       weatherData.to_csv(f"{place}{startYear}_{endYear}.csv",encoding="SHIFT-JIS")
   #Wenn eine Ausnahme auftritt
   except:
       logger.info("Meteorologischer Informationserfassungsprozess Anormales Ende")
       logger.exception("[Anormal beendet]")
   #Wenn es normal endet
   else:
       logger.info("Der meteorologische Informationserfassungsprozess wurde normal abgeschlossen")
   finally:
       print("{0}".format(returnValue), end="")
                
#Wenn Sie es nicht als Paket importiert haben, gehen Sie wie folgt vor
if __name__ == "__main__":
   main()

Recommended Posts

Holen Sie sich Wetterinformationen mit Python & Scraping
Abrufen von Eigenschaftsinformationen durch Scraping mit Python
Kratzwettervorhersage mit Python
Holen Sie sich Alembic-Informationen mit Python
Holen Sie sich das Wetter mit Python-Anfragen
Holen Sie sich das Wetter mit Python-Anfragen 2
Holen Sie sich Qiita-Trends mit Python-Scraping
[Python] Python-Paketinformationen mit der PyPI-API abrufen
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Scraping mit Python + PhantomJS
Holen Sie sich ein Date mit Python
Schaben mit Selen [Python]
Scraping mit Python + PyQuery
Scraping von RSS mit Python
Holen Sie sich CPU-Informationen von Raspberry Pi mit Python
Python-Skript zum Abrufen von Notizinformationen mit REAPER
[Yahoo! Weather Replacement Version] So erhalten Sie Wetterinformationen mit LINE Notify + Python
Holen Sie sich den Ländercode mit Python
Ich habe versucht, mit Python zu kratzen
Schaben mit Selen in Python
Holen Sie sich Twitter-Timeline mit Python
Schaben mit Chromedriver in Python
Festliches Scraping mit Python, Scrapy
Holen Sie sich Youtube-Daten mit Python
Informationen erhalten Sie mit zabbix api
Scraping mit Selen in Python
Scraping mit Tor in Python
Holen Sie sich die Thread-ID mit Python
Schaben mit Selen + Python Teil 2
Beginnen Sie mit Python! ~ ② Grammatik ~
Ich habe versucht, mit Python zu kratzen
Web Scraping Anfänger mit Python
Holen Sie sich das Home-Verzeichnis mit Python
Holen Sie sich Tastaturereignis mit Python
Python-Anfänger bleiben beim ersten Web-Scraping stecken
[Python] Mit der API von Qiita erhalten Sie Benutzer- und Artikelinformationen
Versuchen Sie es mit Python + Beautiful Soup
Holen Sie sich Informationen zu Videodateien mit ffmpeg-python
Beginnen Sie mit Python! ~ ① Umweltbau ~
Holen Sie sich Bewertungen mit Python Googlemap API
Scraping mit Selen in Python (Basic)
Scraping mit Python, Selen und Chromedriver
Web Scraping mit Python Erster Schritt
Ich habe versucht, WebScraping mit Python.
Kratzen mit Python und schöner Suppe
Holen Sie sich Web-Screen-Capture mit Python
[Python] Mit DataReader Wirtschaftsdaten abrufen
Erste Schritte mit Python
[Scraping] Python-Scraping
[Kleine Geschichte] Holen Sie sich mit Python einen Zeitstempel
Lassen Sie uns mit Python Image Scraping durchführen
Python Holen Sie sich das kommende Wetter von der Wetter-API
[Python x Zapier] Erhalten Sie Warninformationen und benachrichtigen Sie mit Slack
"Scraping & maschinelles Lernen mit Python" Lernnotiz
Probieren Sie Juniper JUNOS PyEz (Python-Bibliothek) aus. Hinweis 2 ~ Informationen mit PyEz ~ abrufen ~
[Python] Informationen zu Scraping-Objektiven von price.com
PhytoMine-I hat versucht, mit Python die genetischen Informationen der Pflanze zu erhalten
Holen Sie sich mit Python zusätzliche Daten zu LDAP