Ich möchte Druckinformationen (erhalten mit Beautiful Soup) mit einem Diagramm an Slack with Python senden (+ Ich möchte sie mit Google Spread Sheet verwalten).

Vorerst Github

Quellcode (Github)

Hintergrund

Es scheint, dass viele Menschen die folgenden Symptome haben, wenn der Druck abfällt oder stark abfällt.

Wenn ich auf meine Zeitleiste schaue, alarmieren mich einige Leute, wenn der Druck abfällt. Es gibt einige Artikel.

** Ich weiß nicht, ob es eine wissenschaftliche Grundlage gibt **

Vorläufig wollte ich herausfinden, ob meine körperliche Verfassung mit Druck zusammenhängt.

Zweck

--Um Ihre körperliche Verfassung subjektiv zu verstehen, sehen Sie sich Diagramme und Benachrichtigungen über Druckänderungen an. ――Ist es mathematisch, mit der Aufzeichnung der Stimmungsänderung zu vergleichen? Bestätigen

Lösungsmethode ・ Was ist diesmal zu tun?

  1. Holen Sie sich den neuesten Druck <= Dieser Artikel
  2. Nachlassen der Druckmeldung <= Nächster Artikel
  3. In Google Spread Sheet speichern <= Weiter

(Der Befehl tree kann auch mit win verwendet werden.)

root/
│  .env
│  .env.sample
│  .gitignore
│  app.py
│  ---.json
│  README.md
│  requirements.txt
│
├─api_packages/
│  │  googleItem.py
│  │  slackItem.py
│  │  __init__.py
│
├─data_packages/
│  │  fetchHtml.py
│  │  generateGraph.py
│  │  __init__.py
│
├─imgs/
python=3.8
pip install beautifulsoup4
pip install requests
pip install numpy
pip install matplotlib
pip install python-dotenv
pip install gspread
pip install oauth2client

Druck bekommen

Ich dachte darüber nach, es mit API zu bekommen, aber ich entschied mich, die von der Meteorological Agency veröffentlichten Daten von Tokio zu verwenden. https://www.jma.go.jp/jp/amedas_h/today-44132.html

Ich wollte nur BeautifulSoup studieren, also mache ich das auch.

fetchHtml.py


import requests
from bs4 import BeautifulSoup
import datetime

import re

class HtmlFetcher:
  url = None

  def __init__(self, url):
    self.url = url #Ich habe versucht, es variabel zu machen, aber aufgehört ...

  def fetch_pressure_from_jma(self, search_time = datetime.datetime.now()): #Ich nehme das Standardargument, kann dies aber nicht
    url = "URL, nach der Sie suchen möchten"
    try:
      res = requests.get(url)
      soup = BeautifulSoup(res.text, 'html.parser')
      trs = soup.select("div#div_table > table > tr")
      list_time_pressure = []
      for tr in trs:
        tds = tr.select("td")
        if tds[0].get_text().isdigit() and tds[8].get_text().replace('\xa0', ''):
          list_time_pressure.append(
            {
              'time': int(tds[0].get_text()),
              'pressure': tds[8].get_text()
            }
          )
      if len(list_time_pressure) == 0:
        return None
      else:
        date_place_title = soup.select("table#tbl_title td.td_title")[0].get_text()
        year = re.search(r'\d{4}Jahr', date_place_title).group()[0:4]
        month = re.search(r'\d{2}Mond', date_place_title).group()[0:2]
        day = re.search(r'\d{2}Tag', date_place_title).group()[0:2]
        place = re.search(r'\s+\D+\Z', date_place_title).group()[1:]
        result = {}

        # if search_time:
          #Ich wollte die Daten erhalten, die der angegebenen Zeit am nächsten kommen ...
          # sorted_time_pressures = sorted(list_time_pressure, key=lambda x: abs(int(search_time.hour - x['time'])))
        #Holen Sie sich die neueste
        sorted_time_pressures = sorted(list_time_pressure, key=lambda x:-x['time'])
        result = {
          'data': sorted_time_pressures,
          'info': {'day': day, 'month': month, 'year': year, 'place': place}
        }
        return result
    except Exception as e:
      print(e)
      return False

Ich denke, man kann es irgendwie in einer Atmosphäre lesen


trs = soup.select("div#div_table > table > tr")

Wenn Sie mit "jQuery" und "SCSS" vertraut sind, ist dies eine ziemlich intuitive Notation. Die obige Seite hatte eine einfache Struktur, aber im Gegenteil, es gab nicht viele "Klassen", so dass ich eine tiefe Erfassungsmethode durchführen musste.

image.png Zitiert von der entsprechenden Seite am 01. März 2020


if tds[0].get_text().isdigit() and tds[8].get_text().replace('\xa0', ''):

Hier wird festgestellt, ob die Leitung den Druck anzeigt.

Tageszeiten Temperatur Niederschlag ...
Zeit mm ...
1 8.5 0.5 ...

Es gibt keine Druckdaten in der Zeile "Zeit" und der Zeile "Stunde". Wenn die Daten also in eine Ganzzahl konvertiert werden können, scheint der Druck in der 9. Spalte zu liegen.

Wenn der Druck nicht eingegeben wird, ist es außerdem unvermeidlich, ihn zu erhalten, sodass die Bedingung hinzugefügt wird. Ich habe es ersetzt, weil es einen mysteriösen Charakter enthält.

Ich war besorgt, als ich einen Artikel schrieb, um zu sehen, ob er hier richtig funktioniert.

list_time_pressure = []

Wenn Sie es beispielsweise um 1 Uhr morgens erhalten, sieht diese Liste wie 1 aus.


date_place_title = soup.select("table#tbl_title td.td_title")[0].get_text()

Ich erhalte die Informationen, wenn der Vorname und das Datum angegeben sind.

Es scheint, dass td_title die Benennung der Klasse ist.

Wir werden dies mit regulären Ausdrücken teilen.

#Die ersten 4 Ziffern sind das Jahr
#Ich kann die Daten für 645 nicht erhalten, als es eine große Erneuerung gab, und für 20000 in der Zukunft, aber ...
year = re.search(r'\d{4}Jahr', date_place_title).group()[0:4]
month = re.search(r'\d{2}Mond', date_place_title).group()[0:2]
day = re.search(r'\d{2}Tag', date_place_title).group()[0:2]
#Der letzte ist wie ein Landname
place = re.search(r'\s+\D+\Z', date_place_title).group()[1:]

sorted(list_time_pressure, key=lambda x:-x['time'])

Sortiert nach der nächstgelegenen Zeit. Ich fragte mich, ob ich damit umgehen könnte, wenn sich das Datum ändern würde, aber es schien, dass die Daten am Vortag nicht zurückgesetzt wurden, als sich das Datum änderte, also sage ich das.

Beiseite

Ich war hier müde und beschloss, den Artikel zu teilen.

Recommended Posts

Ich möchte Druckinformationen (erhalten mit Beautiful Soup) mit einem Diagramm an Slack with Python senden (+ Ich möchte sie mit Google Spread Sheet verwalten).
[Visualisierung] Ich möchte mit Plotly ein schönes Diagramm zeichnen
Ich möchte ein Spiel mit Python machen
Ich möchte mit Python in eine Datei schreiben
Ich möchte mit einem Roboter in Python arbeiten.
[Python] Löschen Sie, indem Sie ein Tag mit Beautiful Soup angeben
Ich möchte einen Quantencomputer mit Python betreiben
Ich wollte die Google-Tabelle mit AWS Lambda betreiben, also habe ich es versucht [Teil 2]
Ich möchte eine Nachricht von Python an LINE Bot senden
Ich möchte die Effizienz mit Python auch im experimentellen System verbessern. (5) Ich möchte am Ende des Experiments eine Benachrichtigung mit der Slack-API senden
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Ich möchte den vollständigen Text mit elasticsearch + python durchsuchen
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Ich möchte mit Python debuggen
Ich möchte es mit Python Lambda Django machen, aber ich werde aufhören
(Matplotlib) Ich möchte ein Diagramm mit einer in Pixel angegebenen Größe zeichnen
Ich habe ein System erstellt, das automatisch entscheidet, ob es morgen mit Python ausgeführt wird, und es zu Google Kalender hinzufügt.
Ich möchte eine Python-Umgebung erstellen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich möchte Google Mail mit Python senden, kann dies jedoch aufgrund eines Fehlers nicht
Als ich versuchte, mit Python eine virtuelle Umgebung zu erstellen, funktionierte dies nicht
Ich möchte ein Element mit numpy in eine Datei schreiben und es überprüfen.
Senden Sie eine Nachricht von Slack an einen Python-Server
Senden Sie eine Nachricht mit Python an LINE (LINE Notify)
Ich möchte MATLAB feval mit Python verwenden
Ich möchte mit Python ein Fenster erstellen
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Beispiel für eine Slack-Benachrichtigung mit Python Lambda
Ich möchte systemd nach Zeitzone verwalten! !!
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
#Unresolved Ich möchte Gobject-Introspection mit Python3 kompilieren
Ich möchte APG4b mit Python lösen (Kapitel 2)
Ich möchte die Produkte verkaufen, die ich durch Python Scraping Mercari aufgelistet habe
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
[Python] Ich möchte mit Flask ein statisches Verzeichnis hinzufügen. [Ich möchte etwas anderes als statisch verwenden.]
[Python] Ich möchte nur den Index verwenden, wenn ich eine Liste mit einer for-Anweisung schleife
Ich möchte Leuten sagen, die mit Python direnv aus einem höheren Verzeichnis importieren möchten
[Mac] Ich möchte einen einfachen HTTP-Server erstellen, auf dem CGI mit Python ausgeführt wird
[Einführung in den Systemhandel] Ich habe einen Stochastic Oscillator mit Python gezeichnet und damit gespielt ♬
Ich habe versucht, einen Pandas-Datenrahmen zu erstellen, indem ich mit Python Informationen zum Lebensmittelrückruf abgekratzt habe
Ich möchte mit Python nur das Gesicht aus einem Personenbild ausschneiden und speichern ~ Gesichtserkennung und Zuschneiden mit face_recognition ~