Neste post irei mostrar como um HTML bem estruturado, Python e um leal Raspberry Pi podem ajudar na hora de encontrar aquela vaga legal em uma empresa que você gosta.
Ao final, você será capaz de receber em seu e-mail uma mensagem assim:
Overview
- Fazendo um Crawling no portal de vagas “Workable”
- Enviando um e-mail usando Python
- Configurando um RPi para rodar um script periodicamente
Fazendo um Crawling no portal de vagas “Workable”
Para fazer crawl em um site usando Python o sugerido é utilizar a biblioteca BeautifulSoup. Para usá-la, coloque o arquivo BeatifulSoup.py na mesma pasta que estiver o seu script.
O código abaixo está comentado, mas dando uma idéia geral da abordagem:
- Pegue o conteúdo do html da página
- Encontra os elementos com a tag “job”
- Pega o texto desses elementos e compara com as key-words fornecidas
- Repete-se 1 até 3 para todas as url de cada empresa
- Formata-se o texto
- Um e-mail é enviado utilizando o texto gerado, caso haja vagas de interesse
Dê o nome para esse arquivo de job_finder.py
.
#encoding='utf-8'
unicode("utf-8")
import urllib
from BeautifulSoup import *
from datetime import datetime
from send_me_msg import send_me_msg
def make_msg_from_positions(warning_email_positions, url):
"""
Format a text block with the url and all the interesting
positions from it.
"""
msg = "Positions from " + url + ": \n"
for i, position in enumerate(warning_email_positions):
msg += str(i+1) + ") " + position + "\n"
return msg
wanted_positions = ["Data Scientist",
"Machine",
"Data",
"Intelligence",
"Software"]
urls_list = ["https://nubank.workable.com/",
"https://eduk.workable.com/",
"https://brandbastion.workable.com/"]
final_msg = ""
for url in urls_list:
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)
### Retorna todas os elementos li que são da classe job
jobs = soup.findAll("li", { "class" : "job" })
### Extrai o texto dos li - as posições disponíveis
available_positions = []
for job in jobs:
for a_element in job.findAll("a"):
available_positions.append(a_element.text)
warning_email_positions = []
### Compara as posições com as palavras-chave da list wanted_positions
for position in available_positions:
for wanted_position in wanted_positions:
if wanted_position.lower() in position.lower():
warning_email_positions.append(position)
### Só para garantir que não teremos duplicações
warning_email_positions = set(warning_email_positions)
### Se tiver alguma posição de interesse, formata o texto
if len(warning_email_positions) != 0:
msg = make_msg_from_positions(warning_email_positions, url)
### Concatena para gerar uma mensagem final
final_msg += "\n" + msg
### Se tem alguma posição de interesse em alguma empresa listada, envia o e-mail
if len(final_msg) > 0:
send_me_msg(final_msg, "Interesting positions Spotted!")
Enviando um e-mail usando Python
Para que o script acima funcione até o final, precisamos da função para enviar o e-mail:
from email.mime.text import MIMEText
from datetime import datetime
import base64
def send_me_msg(msg, subject):
now = datetime.now()
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login("your.email@gmail.com", "your_email_password")
### Uma lista com e-mails para enviar a mensagem, talvez alguns amigos também queiram receber o aviso:
REPLY_TO_ADDRESSES = ["your.email@gmail.com", "friend.email@gmail.com"]
watch = now.strftime("%H:%M")
### Uma mensagem customizada para começar o e-mail
msg = MIMEText("Hi, Moneda, how things are going? It's " + watch + "\n\n" + msg )
msg["Subject"] = subject + " " + str(now.day) + "/" + str(now.month)
for ADDRESS in REPLY_TO_ADDRESSES:
msg.add_header('reply-to', ADDRESS)
server.sendmail("your.email@gmail.com", ADDRESS, msg.as_string())
server.quit()
if __name__ == "__main__":
pass
Para que isso funcione, é preciso liberar o login por vias menos seguras, você faz isso através do Gmail aqui.
Configurando um RPi para rodar um script periodicamente
Começando do zero:
- Faça o download do sistema operacional em Raspberry Pi Website
- Escreva a imagem do SO em um cartão SD (Eu usei o Etcher para fazer isso no Mac OS)
- Habilite o ssh, digite no terminal do RPi:
sudo raspi-config
->Interfacing Options
->SSH
- Conecte o RPi a internet usando um cabo ethernet ou configurando o wiki com
sudo raspi-config
- Use o
ifconfig
para verificar qual é o endereço do RPi na sua rede local, ele estará no campoinet
Agora você conseguirá se comunicar com o seu RPi usando ssh. Use o endereço que você pegou usando o ifconfig
. O endereço do meu RPi na minha rede é 192.168.1.130
, substitua pelo o seu nos comando ssh pi@182.168.1.130
.
Então é preciso transferir os arquivos. Você deve ter testado eles locamente e com python job_finder.py
e ter verificado o seu funcionamento. Agora no RPi:
- Crie a pasta para o script com
mkdir job_finder
após conectar-se no RPi com o ssh; - Do terminal do seu computador, faça
scp job_finder.py pi@192.168.1.130:/home/pi/job_finder
,scp job_finder.py pi@192.168.1.130:/home/pi/job_finder
.
Você agora pode testar se o script funciona também no RPi usando python job_finder.py
. Ele deverá funcionar sem qualquer instalação adicional.
Ok, agora nós precisamos que o RPi execute o script periodicamente. Para isso, usaremos o crontab, uma ferramenta de SOs com base Linux utilizada para agenda a execução de comandos. No terminal do RPi:
sudo crontab -e
Vá até o final do arquivo e adicione a seguinte linha:
0 0 * * * python /home/pi/job_finder/job_finder.py
Baiscamente, os 5 argumentos antes do comando que você quer agendar são para definir o minut, hora, dia do mês, mês e dia da semana (5 = Sexta-Feira) que você quer que seja executado. Quando é utilizado um asterisco estamos definindo que o comando deve ser executado para cada passagem daquele item (todo minuto, toda hora, todo dia…). Neste exemplo, nós agendamos para rodar todos os dias de todos os meses no minuto 0 e hora 0 do dia.
Se você quiser um guia mais completo para configurar o crontab, eu sugiro a leitura do post.