Raspado de datos meteorológicos usando Python para recibir un recordatorio de paraguas en el correo electrónico

En este artículo, veremos cómo recopilar datos meteorológicos usando Python y recibir recordatorios por correo electrónico. Si el clima es lluvioso o nublado, este programa le enviará un «recordatorio de paraguas» a su correo electrónico para recordarle que empaque un paraguas antes de salir de casa. Extraeremos la información meteorológica de Google usando bs4 y solicitaremos bibliotecas en python. 

Luego, según las condiciones climáticas, enviaremos el correo electrónico utilizando la biblioteca smtplib. Para ejecutar este programa todos los días a una hora específica, usaremos la biblioteca de programación en python.

Módulos necesarios

  • bs4 : Beautiful Soup (bs4) es una biblioteca de Python para extraer datos de archivos HTML y XML. Para instalar esta biblioteca, escriba el siguiente comando en IDE/terminal.
pip install bs4
  • requests: esta biblioteca le permite enviar requests HTTP/1.1 muy fácilmente. Para instalar esta biblioteca, escriba el siguiente comando en IDE/terminal.
pip install requests
  • smtplib: smtplib es un módulo de Python que define un objeto de sesión de cliente SMTP, que se puede usar para enviar correo a cualquier máquina en Internet. Para instalar esta biblioteca, escriba el siguiente comando en el IDE/terminal.
pip install smtplib
  • horario: un horario es una biblioteca de Python que se utiliza para programar tareas en momentos específicos del día o días específicos de la semana. Para instalar esta biblioteca, escriba el siguiente comando en el IDE/terminal.
pip install schedule

Implementación paso a paso

Paso 1: Importe las bibliotecas de programación, smtplib, requests y bs4.

Python3

import schedule
import smtplib   
import requests
from bs4 import BeautifulSoup

Paso 2: Cree una URL con el nombre de la ciudad especificada y cree una instancia de requests sin pasar por esta URL.

Python3

city = "Hyderabad"
url = "https://www.google.com/search?q=" + "weather" + city
html = requests.get(url).content

Paso 3: Pase el documento HTML recuperado a Beautiful Soup, que devolverá una string sin etiquetas HTML ni metadatos. Usando la función de búsqueda recuperaremos todos los datos necesarios.

Python3

soup = BeautifulSoup(html,
                     'html.parser')
temperature = soup.find(
  'div', attrs={'class': 'BNeawe iBp4i AP7Wnd'}).text
time_sky = soup.find(
  'div', attrs={'class': 'BNeawe tAd8D AP7Wnd'}).text
  
# formatting data
sky = time_sky.split('\n')[1]

Paso 4: Si las condiciones climáticas resultan ser lluviosas o nubladas, este programa enviará un correo electrónico con un mensaje de «recordatorio general» al destinatario. Para encapsular una conexión SMTP, he creado un objeto SMTP con los parámetros `smtp.gmail.com` y 587. Después de crear el objeto SMTP, puede iniciar sesión con su dirección de correo electrónico y contraseña.

Nota: Diferentes sitios web usan diferentes números de puerto. En este artículo, estamos usando una cuenta de Gmail para enviar correos electrónicos. El número de puerto utilizado aquí es «587». Si desea enviar correo a través de un sitio web que no sea Gmail, debe obtener la información correspondiente.

Python3

if sky == "Rainy" or sky == "Rain And Snow" or sky == "Showers" or sky == "Haze" or sky == "Cloudy":
    smtp_object = smtplib.SMTP('smtp.gmail.com', 587)

Paso 5: Por motivos de seguridad, la conexión SMTP ahora se encuentra en modo TLS. Transport Layer Security cifra todos los comandos SMTP. Después de eso, para fines de autenticación, debe pasar las credenciales de su cuenta de Gmail en la instancia de inicio de sesión. Si ingresa una identificación de correo electrónico o contraseña no válida, el compilador mostrará un error de autenticación.  

Guarde el mensaje que necesita enviar en una variable, como msg. Utilice la instancia de sendmail() para enviar su mensaje. sendmail() utiliza tres parámetros: sender_email_id, receiver_email_id y message_to_be_sent. El orden de estos tres parámetros debe ser el mismo. Esto enviará un correo electrónico desde su cuenta. Después de completar la tarea, use quit() para finalizar la sesión SMTP.

Python3

# start TLS for security
smtp_object.starttls()
# Authentication
smtp_object.login("YOUR EMAIL", "PASSWORD")
subject = "Umbrella Reminder"
body = f"Take an umbrella before leaving the house.\
Weather condition for today is ", {
    sky}, " and temperature is {temperature} in {city}."
msg = f"Subject:{subject}\n\n{body}\n\nRegards,\
\nGeeksforGeeks".encode('utf-8')
  
# sending the mail
smtp_object.sendmail("FROM EMAIL ADDRESS",
                     "TO EMAIL ADDRESS", msg)
# terminating the session
smtp_object.quit()
print("Email Sent!")

Paso 6:  usando la biblioteca de programación, programe la tarea todos los días a una hora específica. schedule.run_pending() Comprueba si una tarea programada está pendiente de ejecución o no.

Python3

# Every day at 06:00AM time umbrellaReminder() is called.
schedule.every().day.at("06:00").do(umbrellaReminder)
  
while True:
    schedule.run_pending()

Nota: cuando ejecuta este programa, le arrojará un smtplib.SMTPAuthenticationError y también le enviará una alerta de seguridad crítica a su correo electrónico porque, en pocas palabras, Google no le permite iniciar sesión a través de smtplib porque ha marcado este tipo de inicio de sesión. como “menos seguro”, por lo que lo que tienes que hacer es ir a este enlace mientras estás logueado en tu cuenta de google, y permitir el acceso:

A continuación se muestra la implementación completa:

Python3

import schedule
import smtplib
import requests
from bs4 import BeautifulSoup
  
  
def umbrellaReminder():
    city = "Hyderabad"
      
    # creating url and requests instance
    url = "https://www.google.com/search?q=" + "weather" + city
    html = requests.get(url).content
      
    # getting raw data
    soup = BeautifulSoup(html, 'html.parser')
    temperature = soup.find('div',
                            attrs={'class': 'BNeawe iBp4i AP7Wnd'}).text
    time_sky = soup.find('div', 
                         attrs={'class': 'BNeawe tAd8D AP7Wnd'}).text
      
    # formatting data
    sky = time_sky.split('\n')[1]
  
    if sky == "Rainy" or sky == "Rain And Snow" or sky == "Showers" or sky == "Haze" or sky == "Cloudy":
        smtp_object = smtplib.SMTP('smtp.gmail.com', 587)
          
        # start TLS for security
        smtp_object.starttls()
          
        # Authentication
        smtp_object.login("YOUR EMAIL", "PASSWORD")
        subject = "GeeksforGeeks Umbrella Reminder"
        body = f"Take an umbrella before leaving the house.\
        Weather condition for today is {sky} and temperature is\
        {temperature} in {city}."
        msg = f"Subject:{subject}\n\n{body}\n\nRegards,\nGeeksforGeeks".encode(
            'utf-8')
          
        # sending the mail
        smtp_object.sendmail("FROM EMAIL",
                             "TO EMAIL", msg)
          
        # terminating the session
        smtp_object.quit()
        print("Email Sent!")
  
  
# Every day at 06:00AM time umbrellaReminder() is called.
schedule.every().day.at("06:00").do(umbrellaReminder)
  
while True:
    schedule.run_pending()

Producción:

Ejemplo de correo electrónico de recordatorio de paraguas

Publicación traducida automáticamente

Artículo escrito por vinayedula y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *