Criando um Script Python que faz raspagem de dados e o envio por e-mail.
Eduardo
Posted on January 2, 2022
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
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'})
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()
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
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'
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()
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()
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.
Posted on January 2, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.