Realizando um WEB SCRAPING com Python


 Fala pessoal tudo bem? Espero que sim!

Bom, nessa publicação irei mostrar um processo de webscraping de uma página do site do Porto Digital, onde temos uma lista de empresas com seus respectivos sites e número de telefone. 

    Motivação do Problema: 

Ao entrar no site do Porto Digital a procura de possíveis empresas associadas para enviar currículos me deparei com essa lista e tentei colocá-la no excel (LibreOffice Calc). Até que configurando a importação fez um trabalho descente, mas eu senti que faltavam alguns detalhes como: 

  • Os links das empresas ficarem visíveis e clicáveis;
  • Retirar da lista aquelas empresas que não possuíssem site anexado;
  • Verificar se o telefone estava de acordo com a empresa e se possuía ou não no cadastro.
    
Então resolvi utilizar uma biblioteca em Python chamada BeautifulSoup que resolveria quase todo o problema, apenas faltando a parte de organização dos dados através da biblioteca Pandas.


Visualizando o problema:

Através da imagem podemos ver a lista no site:









Utilizando um Jupyter Notebook, nesse caso eu utilizo através do ANACONDA, vamos começar importando as bibliotecas necessárias:

import urllib.request
from bs4 import BeautifulSoup
import pandas as pd
import ssl 
import re
import pandas as pd

# Esse caminho foi necessário para ter acesso ao site pelo BeatifulSouṕ
ssl._create_default_https_context = ssl._create_unverified_context


Após a importação como consta na # precisei adicionar esse código pois dava um erro ao tentar acessar o site, consegui através de uma resposta no Stack.

O próximo passo é criar uma variável para o link do site:

porto = 'https://www.portodigital.org/empresas/empresas-embarcadas/empresas-de-tic' 
page = urllib.request.urlopen(porto) 
soup = BeautifulSoup(page, 'html5lib')


Imprimindo a variável "soup" temos o seguinte resultado:




Agora vamos criar uma variável "empresa", e ela irá ser o filtro de pesquisa que precisamos para acessar todas as informações da lista, reparem que o texto está escrito no html como um parágrafo <p> e a classe é 'MsoNormal', dessa forma:

empresa = soup.find_all('p', class_='MsoNormal')
empresa




O próximo passo é criar uma lista, vou dar o nome de "nometel" e nela contém o nome+telefone da empresa, quero que tenham esses dois dados para comparar se o número corresponde a empresa:

nometel = []

for item in empresa:
    nometel.append(item.get_text())


Com isso, identificamos que alguns dados adicionados a lista que criamos precisam ser limpos pois não fazem parte das empresas:

# Retirando o primeiro e o último item da lista que não são empresas:
nometel.pop(0)
nometel.pop()
# A condicional não inseriu o telefone da empresa, então adicionei manualmente:
nometel.insert(108,'Inteligência XXI - (81) 3093-3241')

nometel




Após uma boa análise na lista, eu identifiquei  quais empresas não estão com links disponíveis, essa etapa se deu após a visualização com Pandas, então já adiantarei aqui para que o trabalho fique melhor de ser visualizado, estão o nome da empresa, e seu respectivo número na lista:

# Retirando da lista empresas que não estão com links disponíveis, apenas com telefone:

del nometel[24] # Bioma TI 
del nometel[88] # GlobalSafeMed 
del nometel[128] # Mega Consultores
del nometel[203] # Space
del nometel[241] # Virtu-E 



Vamos agora criar duas listas: 'All_links' (Com todos os links disponíveis) e 'links_verificados' (Apenas os links que estamos querendo). Usamos um laço for para inserir todos os links que ele encontrar no loop:

#Obtendo todos os links que estão inseridos nas tags <a></a> para criar a lista principal:

all_links = []
links_verificados = []

all_links = soup.find_all('a')
for link in all_links:
    # print(link.get('href'))
    links_verificados.append(link)

E agora que temos a lista podemos retirar o que não precisamos:

# Retirando o último item da lista pois mesmo com a condicional ele permaneceu na lista:

links_verificados.pop()

# Retirando todos os itens da lista que não são empresas:

del links_verificados[:86]


links_verificados




Nessa etapa, vemos que nossa lista contém os links porém ainda trazem muita informação contida do html, queremos apenas o que está dentro da tag href, então:

# Criando uma lista apenas com os links:

urls = [link.attrs['href'] for link in links_verificados]
urls





Utilizando os 'links_verificados' tirei apenas os nomes das empresas e criei uma lista:

# Retirando das listas apenas os nomes:

nomes = []

for link in links_verificados:
    nomes.append(link.get_text())
nomes




Agora vou unificar em apenas uma única lista todos os dados que coletei:

# Unificando em uma lista só, os dados: 

empresas = list(zip(nomes, urls, nometel))
empresas




Para visualizar melhor e organizar todo o trabalho, vamos usar o Pandas criando um DataFrame:

# Criando um DataFrame no Pandas para visualizar os dados organizados:

df = pd.DataFrame(data=empresas, columns=['Empresa', 'Site', 'Telefone'])
df.head()




Mesmo visualizando os links, eles ainda não estão clicáveis, então através dessa função, vamos destacar os links dos sites:

#  Criando função para deixar a Coluna Site com um hiperlink e direcionar ao site da empresa:

def hiperlink(x):
    return f'<a target="_blank" href="{x}">{x}</a>'

df.style.format({'Site': hiperlink})




Reparem que agora os temos os links como queremos, os nomes e os telefones. Agora é só gerar um arquivo em CSV, e com isso podermos utilizar essa lista, enviar para alguém, etc..

# Gerando um arquivo CSV: 

df.to_csv('listaporto.csv', index=False)


Para visualizar se ocorreu tudo bem basta olhar as 10 primeiras linhas do CSV gerado com o comando:

# Olhando as primeiras 10 linhas do arquivo gerado:

!head -n10 listaporto.csv


Espero que esse tutorial possa lhe dar ideias, e mostrar bastante do potencial das bibliotecas disponíveis de análise de dados do Python! Dúvidas e sugestões são bem vindas!

O link do repositório está aqui. Com ele você pode baixar, clonar com o git e realizar seus testes, fazer observações!

E se você gostou, siga as redes sociais logo abaixo!
















Comentários

Postagens mais visitadas