Um guia para iniciantes para aprender Web Scraping e visualização de dados com Python

Guias, Python, Raspagem, Dez-00-20215 minutos de leitura

Como pode extrair informações importantes de sítios Web de forma rápida e eficiente? Demora muito tempo a extrair os dados manualmente. Pode utilizar o web scraping, um método automatizado de aquisição de dados não tabulares ou mal estruturados de sítios Web. Mais tarde, pode converter esses dados num formato estruturado e utilizável, como uma folha de cálculo

Índice

Como pode extrair informações importantes de sítios Web de forma rápida e eficiente? Demora muito tempo a extrair os dados manualmente. Pode utilizar o web scraping, um método automatizado de aquisição de dados não tabulares ou mal estruturados de sítios Web. Mais tarde, pode converter esses dados num formato estruturado e utilizável, como uma folha de cálculo ou um ficheiro .csv.

A recolha de dados da Web permite-lhe arquivar dados e acompanhar as alterações de dados em linha. As empresas utilizam-no amplamente para diferentes fins. Por exemplo, as lojas em linha utilizam-na para recolher os preços dos seus concorrentes e as páginas publicamente disponíveis. Depois, utilizam esta informação para ajustar os seus preços. Outra prática comum de raspagem da Web é a raspagem de contactos, em que as organizações recolhem dados pessoais, como números de telefone ou endereços de correio eletrónico, para fins de marketing. 

Porque é que a raspagem da Web é utilizada?

Porque é que alguém tem de extrair grandes quantidades de informação de sítios Web? Para o compreender, veja as seguintes aplicações da recolha de dados da Web.

  • Investigação e desenvolvimento - Pode recolher grandes conjuntos de dados (temperatura, informações gerais, etc.) de sítios Web e analisá-los para realizar inquéritos para investigação e desenvolvimento.
  • Comparação de preços - Empresas e serviços como o ParseHub utilizam a raspagem da Web para recolher dados de sítios de compras em linha e comparar os preços dos produtos.
  • Listagens de empregos - Pode utilizar a recolha de dados da Web para recolher detalhes sobre vagas de emprego e entrevistas de diferentes sítios Web e listá-los num único local. 
  • Raspagem de redes sociais - Pode utilizar a raspagem da Web para recolher dados de sítios Web de redes sociais, como o Instagram e o Twitter, e descobrir quais são as tendências.
  • Recolha de endereços de correio eletrónico - Muitas empresas utilizam o correio eletrónico como meio de marketing. Utilizam o web scraping para recolher IDs de correio eletrónico e depois enviam emails em massa.

Web Scraping usando Python

Pode extrair dados de sítios Web seguindo os passos abaixo indicados.

  • Obter o URL que pretende extrair
  • Inspecionar a página
  • Encontre os dados que tem de extrair
  • Escrever o código
  • Executar o código e extrair os dados
  • Armazenar os dados no formato pretendido

As bibliotecas que podemos utilizar para a recolha de dados da Web em Python são

Pandas - O Pandas é utilizado para manipular e analisar os dados. Pode utilizar esta biblioteca para extrair os dados e armazená-los no formato pretendido.

Beautiful Soup - É um pacote Python para analisar documentos HTML e XML. Cria árvores de análise que são úteis na extração fácil de dados de sítios Web.

Requests - É uma biblioteca HTTP simples.

Utilizaremos este sítio para extrair o número de casos de COVID. Em seguida, analisaremos os dados e criaremos algumas visualizações.

Importar bibliotecas

É possível importar pedidos e BeautifulSoup em Python para a recolha de dados da Web, como se mostra abaixo.

importar pedidos 
from bs4 import BeautifulSoup

URL para raspagem de dados

Especifique o URL do sítio Web a partir do qual tem de extrair os dados. Tem de utilizar o método requests.get() para enviar um pedido GET para o URL especificado. Além disso, tem de criar um construtor BeautifulSoup que receberá os dois argumentos de cadeia de caracteres, como mostra o código abaixo.

url = 'https://www.worldometers.info/coronavirus/countries-where-coronavirus-has-spread/'
página = requests.get(url) 
soup = BeautifulSoup(página.texto, 'html.parser') 
  
dados = []

Raspar todos os elementos

Pode recolher todos os elementos da tabela URL'sURL utilizando o método soup.find_all(). Ele retorna um objeto que oferece acesso baseado em índice às ocorrências encontradas e pode ser impresso usando um loop for ou while.

data_iterator = iter(soup.find_all('td'))

Utilizar um loop

Pode utilizar um ciclo while True que se repete até existirem dados disponíveis no iterador.

enquanto Verdadeiro: 
   tenta: 
        país = seguinte(iterador_de_dados).texto 
        confirmado = seguinte(iterador_de_dados).text 
        mortes = seguinte(iterador_de_dados).text 
        continente = seguinte(iterador_de_dados).text

Para as colunas "confirmed" e "deaths", certifique-se de que remove as vírgulas e converte para int. 

data.append(( 
            país, 
            (confirmados.substituir(', ', '')), 
            (mortes.substituir(',', '')), 
            continente
        )) 
    
    exceto StopIteration: 
       break

Quando o número de elementos que restam para iterar é zero, o erro StopIteration é ativado.

Criar um Dataframe do Pandas

Pode extrair os dados do sítio Web depois de executar o código acima. Tem de criar um quadro de dados Pandas para analisar melhor os dados. No código abaixo, ordenámos os dados pelo número de casos confirmados de COVID.

Importar a biblioteca pandas para criar um quadro de dados.

data.sort(key = lambda row: row[1], reverse = True)
import pandas as pd
df = pd.DataFrame(data,columns=['country','Number of cases','Deaths','Continent'],dtype=float)
df.head()
df['Número de casos'] = [x.replace(',', '') for x in df['Número de casos']]
df['Número de casos' ] = pd.to_numeric(df['Número de casos'])
df

Obterá o seguinte resultado:

Para obter informações sobre o Dataframe, utilize df.info().

df.info()

Criar coluna Death_rate

Vamos criar uma nova coluna com o nome Taxa de mortalidade, como mostrado abaixo.

dff = df.sort_values(by ='Número de casos',ascending = False)
dff['Taxa de mortalidade'] = (dff['Óbitos']/dff['Número de casos'])*100
dff.head()

O resultado é o seguinte.

Raspagem da Web com proxies

Um servidor proxy permite-lhe utilizar um endereço IP único para aceder às informações que pretende extrair. Desta forma, o sítio Web não vê o seu endereço IP real, o que lhe permite recolher dados de forma anónima. É necessário utilizar proxies para a recolha de dados da Web pelas seguintes razões

  • Pode enviar vários pedidos simultâneos a um servidor Web sem ser banido, utilizando um conjunto de proxies.
  • Com a ajuda de proxies, é possível fazer pedidos a partir de um determinado local, dispositivo, ISP ou rede móvel. Também é possível rastrear conteúdos apresentados numa área ou dispositivo específico.
  • Alguns sítios Web têm proibições de IP e é possível contorná-las com a ajuda de proxies. 

Tipos de proxies para Web Scraping

Pode utilizar os dois proxies abaixo para extrair dados de sítios Web.

  • Proxies do centro de dados - Os endereços IP do centro de dados são os endereços IP do servidor. Os servidores estão localizados em centros de dados. O principal objetivo dos proxies de centros de dados é ocultar o seu endereço dos sítios Web que rastreia. Estes proxies são utilizados principalmente para recolher dados comerciais.
  • Proxies residenciais - Os endereços IP residenciais são mais caros do que os IPs do centro de dados e são difíceis de obter. Estes proxies permitem-lhe escolher uma localização específica, ou seja, cidade, país, etc. e navegar na Web como um utilizador real nessa área geográfica.

Visualização de dados com Python

Sabe que a visualização de dados é a representação gráfica de dados ou informações. Pode utilizar ferramentas visuais como tabelas, mapas e gráficos como uma forma acessível de compreender os dados representados. Vejamos como podemos visualizar os dados extraídos deste sítio Web utilizando ferramentas de visualização de dados.

Importar bibliotecas

É necessário importar as seguintes bibliotecas para visualizar os dados, como se mostra a seguir.

import seaborn as sns
import matplotlib.pyplot as plt
from pylab import rcParams

Traçar um gráfico de pares

É possível traçar um gráfico de pares para demonstrar as relações entre pares num conjunto de dados. Pode implementá-lo facilmente utilizando o código abaixo e pode identificar tendências nos dados para análise posterior.

rcParams['figure.figsize'] = 15, 10
from matplotlib.pyplot import figure
figure(num=None, figsize=(20, 6), dpi=80, facecolor='w', edgecolor='k')
sns.pairplot(dff,hue='Continente')

Obterá o resultado como.

Traçar um gráfico de barras

Pode desenhar um gráfico de barras que apresenta dados categóricos como barras rectangulares e compara os valores de diferentes categorias nos dados. 

sns.barplot(x = 'country',y = 'Number of cases',data = dff.head(10))

O resultado é o seguinte.

Traçar um gráfico de dispersão

É possível compreender a relação entre valores numéricos utilizando um gráfico de dispersão. Este gráfico utiliza pontos para representar a relação entre variáveis. 

sns.scatterplot(x = "Número de casos", y = "Óbitos",hue = "Continente",data = dff)

O resultado é o seguinte.

Agrupar e ordenar os dados

No código abaixo, vamos agrupar os dados por Continente e ordená-los pelo número de casos de COVID.

dfg = dff.groupby(by = 'Continent',as_index = False).agg({'Number of cases':sum,'Deaths':sum})
dfgg = dfg[1:]
df1 = dfgg.sort_values(by = 'Number of cases',ascending = False)
df1['Death_rate'] = (df1['Deaths']/df1['Number of cases'])*100
df1.sort_values(by = 'Death_rate',ascending = False)

O resultado é o seguinte.

Agora, vamos traçar um gráfico de barras entre "Continente" e "Taxa de mortalidade", como mostrado abaixo.

sns.barplot(x = 'Continent',y = 'Death_rate',data = df1.sort_values(by = 'Death_rate',ascending = False))

O resultado é o seguinte.

Este gráfico de barras mostra que, entre todos os países, a taxa de mortalidade é mais elevada na América do Sul e mais baixa na Austrália. 

Importar tabela de texto

Instale texttable para criar uma tabela ASCII simples. Depois, importe-a como tt.

!pip install texttable

importar texttable como tt

Criar um objeto texttable

Tem de criar um objeto de tabela de texto como se mostra abaixo. Tem de adicionar uma linha vazia no início da tabela para os cabeçalhos e alinhar as colunas.

tabela = tt.Texttable() 

table.add_rows([(None, None, None, None)] + data) table.set_cols_align(('c', 'c', 'c', ' c', 'c'))  # 'l' indica a esquerda, 'c' indica o centro e 'r' indica a direita 
table.header((' Country ', ' Number of cases ', ' Deaths ', ' Continent ')) 
  
print(table.draw())

Aqui, a saída representa algumas das linhas da tabela como.

Conclusão

Com o web scraping, pode extrair grandes quantidades de dados de sítios Web de forma rápida e eficiente. Pode converter os dados não estruturados extraídos num formato utilizável, como um ficheiro .csv. Vimos que podemos extrair os dados da Web utilizando dois módulos, ou seja, Pandas e BeautifulSoup. Os proxies permitem-lhe extrair os dados da Web de forma anónima. Pode utilizar proxies de centros de dados ou residenciais para a recolha de dados da Web. Os proxies residenciais são mais fiáveis mas mais caros do que os proxies de centros de dados. Além disso, podemos efetuar a análise de dados para obter informações úteis com base nas nossas necessidades. Neste artigo, analisámos os dados utilizando ferramentas de visualização de dados, como gráficos de barras, gráficos de pares e gráficos de dispersão.