Criando um Script Python que faz raspagem de dados e o envio por e-mail.
Tags: python
Published: 2022-01-02 01:02:36

### 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.

```python
from requests
from bs4 import BeautifulSoup
import send_email
```


> Criando uma classe chamada **CreateNewlatter**:


```python
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. 


```python 
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:

```python
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**
```python
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!](https://support.google.com/accounts/answer/185833?hl=pt)  .
Criando função de enviar e-mail:
```python
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.			
```python 
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.