DEV Community

Cover image for Criando um Script Python que faz raspagem de dados e o envio por e-mail.
Eduardo
Eduardo

Posted on

Criando um Script Python que faz raspagem de dados e o envio por e-mail.

Quais bibliotecas iremos precisar ?

request

Necessária para fazer o download do site
Já vem por padrão no Python310

BeautifulSoup -> pip install bs4

Necessária para o tratamento e manipulação dos arquivos html.

smtplib

Para criarmos o acesso ao e-mail.
Já vem por padrão no Python310

email-to -> pip install email-to

Biblioteca necessária para o envio dos e-mails.

Primeira etapa foi criar o arquivo main.py que será nosso arquivo principal do nosso projeto.
Começamos importando as nossas bibliotecas.

from requests
from bs4 import BeautifulSoup
import send_email
Enter fullscreen mode Exit fullscreen mode

Criando uma classe chamada CreateNewlatter:

from requests
from bs4 import BeautifulSoup
import send_email

class CreateNewlatter:
    def __init__(self) ->None:

        # Fazendo download do html do site.
        self.response = requeste.get(
        'https://infonet.com.br/categoria/noticias/').content 

        # Convertendo para um objeto BeautfulSoup.
        self.site = BeautifulSoup(self.respomse, 'html.parser')

        # Obtendo "todos" Titulo das noticias principais
        self.title = self.site.findAll(
        'a', attrs={'class':'post-url'})
Enter fullscreen mode Exit fullscreen mode

Com a função findAll capturamos todos os títulos da pagina renderizado, e a transformamos em uma lista, se utilizarmos find, vamos obter somete a primeira ocorrência do titulo.
Próximo passo é criarmos nossa função que irar gera um html simples para enviarmos por e-mail.

from requests
from bs4 import BeautifulSoup
import send_email

class CreateNewlatter:
    def __init__(self) ->None:

        # Fazendo download do html do site.
        self.response = requeste.get(
        'https://infonet.com.br/categoria/noticias/').content

        # Convertendo para um objeto BeautfulSoup.
        self.site = BeautifulSoup(self.respomse, 'html.parser')

        # Obtendo "todos" Titulo das noticias principais
        self.title = self.site.findAll(
        'a', attrs={'class':'post-url'})
    def generatorHtml(self):
        # Criando o arquivo html
        with open('new_infonet.html', 'w', encoding='utf-8') as new:    
            # Escrevendo arquivo html.      
            new.write("""
            <!DOCTYPE html>
            <html lang='pt-br'>
            <meta charset='utf-8'>
            <head>
            <style>
                div{
                font-family:Arial, Helvetica, sans-serif;
                font-size: 20px;
                margin: auto;
                width: 100%;
                padding: 10px ;
                    }
                h1{
                font-size: 28px;
                font-family:Arial, Helvetica, sans-serif;
                margin: auto;
                width: 100%;
                padding: 10px;
                    }

            </style>
            <title>Principais noticias em Arcaju-SE</title>
            </head>
            <body>
                <h1><b> Noticias que chamaram a
                 atenção em ARACAJU-SE</b></h1>
            """)
                # Criando um 'for' para escrevemos 
                # um div com cada titulo
                for  t  in  range(0, 10):
                    new.write(f"""
                    <div>   
                    <b>{self.titulos[t].text}:</b>
                    {self.titulos[t]['href']}
                    </div> 
                    """)
                # Fechando a tag e o arquivo
                new.write('</body></html>')
                new.close() 
Enter fullscreen mode Exit fullscreen mode

Próximo passos será a criação do script de envio do e-mail. Vamos criar um arquivo chamado send_email.py e vamos iniciar o código:

from email.mime.multipart import  MIMEMultipart
from email.mime.text import  MIMEText
import smtplib
Enter fullscreen mode Exit fullscreen mode

Com a biblioteca email-to e a smtplit , depois vamos criar um classe chamada Send_email

from email.mime.multipart import  MIMEMultipart
from email.mime.text import  MIMEText
import smtplib
class Send_email:
    def __init__(self)->None:
        # Atritutos de criação do server 
        self.port = 587
        # Neste caso vamos utilizar o host do Gmail
        self.host = 'smtp.gmail.com'
        # E-mail que servirá como host do envio
        self.user = 'seuemail@gmail.com'
        # Senha de App
        self.password = 'SuaSenhaDeApp'

Enter fullscreen mode Exit fullscreen mode

Para poder termos acesso ao e-mail devemos criar uma senha do App, caso tenha duvida é só seguir os seguintes passos para gerar a senha Click Aqui! .
Criando função de enviar e-mail:

from email.mime.multipart import  MIMEMultipart
from email.mime.text import  MIMEText
import smtplib
class Send_email:
    def __init__(self)->None:
        # Atributos de criação do server 
        self.port = 587
        # Neste caso vamos utilizar o host do Gmail
        self.host = 'smtp.gmail.com'
        # E-mail que servirá como host do envio
        self.user = 'seuemail@gmail.com'
        # Senha de App
        self.password = 'SuaSenhaDeApp'

    # Função de envio
    def createServer(self):
        # Criando conexão 
        server = smtplit.SMTP(self.host, self.port)
        server.ehlo()
        server.starttls()
        server.login(self.user, self.password)

        # Abrindo html
        with open(
        'news_infornet.html', 'r', encoding='utf-8') as html
        email_msg = MIMEMultipart()
        # Configurando envio
        email_msg['From'] = self.user
        emails = ''' 01email@gmail.com,
                          02email@gmail.com,
                          03email@gmail.com,
                          04email@gmail.com'''
        email_msg['To'] = list_emails
        email_msg['subject'] = 'Assunto do email'
        # Convertendo para o e-mail entender
                # que é um arquivo html
        email_msg.attach(MIMEText(message_html, 'html'))

        # Enviando e-mail
        print('Enviando messagem...)
        server.sendmail(email_msg['From'], emails.split(','),
        email_msg.as_string())
        print('Mensagem enviada!')
        server.quit()       
Enter fullscreen mode Exit fullscreen mode

Emails.split(' , ') o que estou fazendo, para podermos enviar para vários e-mails devemos criar uma string que depois vamos criar uma lista com a função split que faz o corte de separação através da " , ".

Script final

Vamos criar uma função dentro do arquivo main.py dentro da classe CreateNew chamada App que irar chamar todas as funções principais e assim finalizar o nosso script.

from requests
from bs4 import BeautifulSoup
# Importando o outo Script
import send_email

class CreateNewlatter:
    def __init__(self) ->None:

        # Fazendo download do html do site.
        self.response = requeste.get(
        'https://infonet.com.br/categoria/noticias/').content

        # Convertendo para um objeto BeautfulSoup.
        self.site = BeautifulSoup(self.respomse, 'html.parser')

        # Obtendo "todos" Titulo das noticias principais
        self.title = self.site.findAll(
        'a', attrs={'class':'post-url'})
    # Função principal de inicialização
    def app(self):
        # Gerando o html
        self.generatorHtml()
        #Enviando o Html
        send = send_email.Send_email()
        send.createServer()


    def generatorHtml(self):
        # Criando o arquivo html
        with open('new_infonet.html', 'w', encoding='utf-8') as new:    
            # Escrevendo arquivo html       
            new.write("""
            <!DOCTYPE html>
            <html lang='pt-br'>
            <meta charset='utf-8'>
            <head>
            <style>
                div{
                font-family:Arial, Helvetica, sans-serif;
                font-size: 20px;
                margin: auto;
                width: 100%;
                padding: 10px ;
                    }
                h1{
                font-size: 28px;
                font-family:Arial, Helvetica, sans-serif;
                margin: auto;
                width: 100%;
                padding: 10px;
                    }

            </style>
            <title>Principais noticias em Aracaju-SE</title>
            </head>
            <body>
                <h1><b> Noticias quê chamaram a
                 atenção em ARACAJU-SE</b></h1>
            """)
                # Criando um 'for' para escrevemos 
                # um div com cada titulo
                for  t  in  range(0, 10):
                    new.write(f"""
                    <div>   
                    <b>{self.titulos[t].text}:</b>
                    {self.titulos[t]['href']}
                    </div> 
                    """)
                # Fechando a tag e o arquivo
                new.write('</body></html>')
                new.close() 
# Iniciando App
new_infonet  =  CreateNew()
new_infonet.App()
Enter fullscreen mode Exit fullscreen mode

Parabéns por ter chegado até aqui, e espero que você tenha aprendido algo novo para aplicar em seus projetos pessoais. Deixando claro que sou um programador iniciante, e agradeço as sugestões para melhorar o código.

Top comments (0)