Je veux envoyer des informations de pression (obtenues avec Beautiful Soup) à Slack avec Python avec un graphique (+ Je veux les gérer avec Google Spread Sheet)

Pour le moment, Github

Code source (Github)

Contexte

Il semble que de nombreuses personnes présentent les symptômes suivants lorsque la pression baisse ou diminue fortement.

En regardant ma chronologie, certaines personnes me alertent lorsque la pression baisse. Il y a pas mal d'articles.

** Je ne sais pas s'il existe une base scientifique **

Pour le moment, je voulais savoir si ma condition physique était liée à la pression.

Objectif

Méthode de solution ・ Que faire cette fois

  1. Obtenez la dernière pression <= Cet article
  2. Notification Slack de pression <= Article suivant
  3. Enregistrer dans la feuille de calcul Google <= Suivant

(La commande tree peut également être utilisée avec win)

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

Obtenez de la pression

J'ai pensé à l'obtenir avec l'API, mais j'ai décidé d'utiliser les données de Tokyo publiées par l'Agence météorologique. https://www.jma.go.jp/jp/amedas_h/today-44132.html

Je voulais juste étudier «BeautifulSoup», donc je le fais aussi.

fetchHtml.py


import requests
from bs4 import BeautifulSoup
import datetime

import re

class HtmlFetcher:
  url = None

  def __init__(self, url):
    self.url = url #J'ai essayé de le rendre variable, mais je me suis arrêté ...

  def fetch_pressure_from_jma(self, search_time = datetime.datetime.now()): #Je prends l'argument par défaut, mais je ne peux pas faire ça
    url = "URL que vous souhaitez rechercher"
    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}Année', date_place_title).group()[0:4]
        month = re.search(r'\d{2}Mois', date_place_title).group()[0:2]
        day = re.search(r'\d{2}journée', date_place_title).group()[0:2]
        place = re.search(r'\s+\D+\Z', date_place_title).group()[1:]
        result = {}

        # if search_time:
          #Je voulais obtenir les données les plus proches de l'heure spécifiée ...
          # sorted_time_pressures = sorted(list_time_pressure, key=lambda x: abs(int(search_time.hour - x['time'])))
        #Obtenez le plus récent
        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

Je pense que vous pouvez le lire dans une atmosphère en quelque sorte


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

Si vous êtes familier avec jQuery et SCSS, c'est une notation plutôt intuitive. La page ci-dessus avait une structure simple, mais au contraire, il n'y avait pas beaucoup de Classs, donc j'ai dû faire une méthode d'acquisition approfondie.

image.png Cité à partir de la page correspondante le 01 mars 2020


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

Ici, il est déterminé si la ligne affiche la pression.

Heures du jour Température Précipitation ...
Temps mm ...
1 8.5 0.5 ...

Il n'y a pas de données de pression dans la ligne «temps» et la ligne «heure». Donc, si les données peuvent être converties en un entier, il semble que la pression soit dans la 9e colonne.

De plus, si la pression n'est pas saisie, il est inévitable de l'obtenir, donc la condition est ajoutée. Je l'ai remplacé car il contient un personnage mystérieux.

J'étais inquiet lorsque j'écrivais un article pour voir s'il fonctionnait correctement ici.

list_time_pressure = []

Par exemple, si vous l'obtenez à 1h du matin, cette liste ressemblera à 1 de longueur.


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

J'obtiens l'information lorsque le premier nom de lieu et la date sont inclus.

Il semble que td_title est la façon de nommer la classe.

Nous allons diviser cela en utilisant des expressions régulières.

#Les 4 premiers chiffres correspondent à l'année
#Je ne peux pas obtenir les données pour 645, quand il y a eu un grand renouvellement, et 20000 dans le futur, mais ...
year = re.search(r'\d{4}Année', date_place_title).group()[0:4]
month = re.search(r'\d{2}Mois', date_place_title).group()[0:2]
day = re.search(r'\d{2}journée', date_place_title).group()[0:2]
#Le dernier est comme un nom de pays
place = re.search(r'\s+\D+\Z', date_place_title).group()[1:]

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

Trié par ordre de temps le plus proche. Je me suis demandé si je pouvais gérer si la date avait changé, mais il semblait que les données de la veille n'étaient pas réinitialisées lorsque la date avait changé, alors je dis ceci.

De côté

J'étais fatigué ici, alors j'ai décidé de diviser l'article.

Recommended Posts

Je veux envoyer des informations de pression (obtenues avec Beautiful Soup) à Slack avec Python avec un graphique (+ Je veux les gérer avec Google Spread Sheet)
[Visualisation] Je veux dessiner un beau graphique avec Plotly
Je veux faire un jeu avec Python
Je veux écrire dans un fichier avec Python
Je veux travailler avec un robot en python.
[Python] Supprimer en spécifiant une balise avec Beautiful Soup
Je veux faire fonctionner un ordinateur quantique avec Python
Je voulais utiliser la feuille de calcul Google avec AWS lambda, alors je l'ai essayé [Partie 2]
Je souhaite envoyer un message de Python à LINE Bot
Je souhaite améliorer l'efficacité avec Python même dans le système expérimental (5) Je souhaite envoyer une notification à la fin de l'expérience avec l'API slack
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Je souhaite rechercher le texte intégral avec elasticsearch + python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
Je veux déboguer avec Python
Je veux le faire avec Python lambda Django, mais je vais m'arrêter
(Matplotlib) Je veux dessiner un graphique avec une taille spécifiée en pixels
J'ai créé un système qui décide automatiquement de s'exécuter demain avec Python et l'ajoute à Google Agenda.
Je veux créer un environnement Python
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
Je souhaite envoyer Gmail avec Python, mais je ne peux pas en raison d'une erreur
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
Je veux écrire un élément dans un fichier avec numpy et le vérifier.
Envoyer un message de Slack à un serveur Python
Envoyer un message à LINE avec Python (LINE Notify)
Je veux utiliser MATLAB feval avec python
Je veux créer une fenêtre avec Python
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
Exemple de notification Slack avec python lambda
Je veux gérer systemd par fuseau horaire! !!
Je souhaite utiliser le répertoire temporaire avec Python2
#Unresolved Je veux compiler gobject-introspection avec Python3
Je veux résoudre APG4b avec Python (chapitre 2)
Je souhaite vendre les produits que j'ai listés par python scraping Mercari
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
[Python] Je veux ajouter un répertoire statique avec Flask [Je veux utiliser autre chose que statique]
[Python] Je souhaite utiliser uniquement l'index lors de la mise en boucle d'une liste avec une instruction for
Je veux dire aux gens qui souhaitent importer depuis un répertoire supérieur avec Python direnv
[Mac] Je souhaite créer un serveur HTTP simple qui exécute CGI avec Python
[Introduction au trading système] J'ai dessiné un oscillateur stochastique avec python et joué avec ♬
J'ai essayé de créer un cadre de données pandas en grattant les informations de rappel d'aliments avec Python
Je veux découper uniquement le visage d'une image de personne avec Python et l'enregistrer ~ Détection de visage et rognage avec face_recognition ~