Web Scraping, Expressões Regulares e Visualização de Dados, Fazendo Tudo em Python

Python, Raspagem, Nov-15-20225 minutos de leitura

O Web scraping pode ser definido como o método de recolha e reestruturação de dados de sítios Web. Também pode ser definido como a abordagem programática da obtenção de dados de sítios Web de forma automatizada. Por exemplo, pretende extrair os IDs de correio eletrónico de todas as pessoas que comentaram uma publicação no Facebook. Pode fazê-lo através de

Índice

O Web scraping pode ser definido como o método de recolha e reestruturação de dados de sítios Web. Também pode ser definido como a abordagem programática da obtenção de dados de sítios Web de forma automatizada. Por exemplo, pretende extrair os IDs de correio eletrónico de todas as pessoas que comentaram uma publicação no Facebook. Pode fazê-lo através de dois métodos. Primeiro, pode apontar o cursor para a cadeia de endereços de correio eletrónico de qualquer pessoa. Em seguida, pode copiá-la e colá-la num ficheiro. Este método é conhecido como raspagem manual. Mas e se quiser reunir 2000 IDs de correio eletrónico? Com a ajuda de uma ferramenta de recolha de dados da Web, pode extrair todos os IDs de correio eletrónico em 30 segundos, em vez de 3 horas se utilizar a recolha manual.

Pode utilizar ferramentas de web scraping para extrair informações de sítios Web. Só precisa de saber clicar e não são necessários conhecimentos de programação. Estas ferramentas são eficientes em termos de recursos e poupam tempo e custos. Pode extrair milhões de páginas com base nas suas necessidades sem se preocupar com a largura de banda da rede. Alguns sítios Web implementam anti-bots que desencorajam os scrapers de recolher dados. Mas as boas ferramentas de extração de dados da Web têm características incorporadas que permitem contornar essas ferramentas e proporcionar uma experiência de extração sem problemas.

Raspagem da Web em Python

O Python tem excelentes ferramentas para extrair os dados da Web. Por exemplo, pode importar a biblioteca requests para obter o conteúdo de uma página Web e a bs4(BeautifulSoup) para extrair as informações relevantes. Pode seguir os passos abaixo para extrair dados da Web em Python. Vamos extrair informações deste sítio Web. 

Pedidos de importação:

É necessário importar a biblioteca de pedidos para obter o HTML do sítio Web. 

pedidos de importação

Pedido GET:

Tem de fazer um pedido GET ao sítio Web. Pode fazê-lo colando o URL na função requests.get().

r = requests.get('http://www.cleveland.com/metro/index.ssf/2017/12/case_western_reserve_university_president_barbara_snyders_base_salary_and_bonus_pay_tops_among_private_colleges_in_ohio.html')

Extrair o conteúdo:

Extrair o conteúdo do sítio Web utilizando r.content. Fornece o conteúdo do sítio Web em bytes. 

c = r.content

Importar BeautifulSoup:

Tem de importar a biblioteca BeautifulSoup, uma vez que esta facilita a recolha de informações de páginas Web.

from bs4 import BeautifulSoup

Criar um objeto sopa:

É necessário criar um objeto BeautifulSoup a partir do conteúdo e analisá-lo utilizando vários métodos.

sopa = BeautifulSoup(c)
print(soup.get_text())

Obterá o resultado (é apenas uma parte) mais ou menos assim.

Extrair dados úteis:

Temos de encontrar os selectores CSS correctos para extrair os dados pretendidos. Podemos encontrar o conteúdo principal da página Web utilizando o método .find() do objeto soup.

main_content = soup.find('div', attrs = {'class': 'entry-content'})

Utilizar o atributo .text:

Podemos obter as informações como texto da tabela utilizando o atributo .text do soup.

conteúdo = conteúdo_principal.find('ul').texto
imprimir(conteúdo)

Recuperámos o texto da tabela como uma cadeia de caracteres. Mas a informação será de grande utilidade se extrairmos as partes específicas da cadeia de texto. Para realizar esta tarefa, precisamos de passar para as Expressões Regulares.

Expressões regulares em Python

As expressões regulares (RegEx) são uma sequência de padrões que definem um padrão de pesquisa. A ideia básica é que:

  • Defina um padrão que pretende fazer corresponder numa cadeia de texto. 
  • Pesquisa na cadeia de caracteres para obter correspondências.

Suponhamos que queremos extrair os seguintes elementos de informação da tabela de texto.

  • Salários
  • Nomes dos colégios
  • Nomes dos presidentes

Pode extrair os três elementos de informação seguindo os passos mencionados abaixo.

Passo 01:

Importe re e, para extrair os salários, tem de criar um padrão de salários. Utilize o método re.compile() para compilar um padrão de expressão regular fornecido como uma cadeia de caracteres num objeto padrão RegEx. Além disso, pode utilizar pattern.findall() para encontrar todas as correspondências e devolvê-las como uma lista de cadeias de caracteres. Cada string representará uma correspondência.

importar re
salary_pattern = re.compile(r'\$.+')
salaries = salary_pattern.findall(content)

Passo 02:

Repita o mesmo procedimento para extrair os nomes das faculdades. Faça um padrão e extraia os nomes. 

school_pattern = re.compile(r'(?:,|,\s)([A-Z]{1}.*?)(?:\s\(|:|,)')
schools = school_pattern.findall(content)
print(schools)
print(salaries)

Passo 03:

Repita o mesmo procedimento para extrair os nomes dos presidentes. Faça um padrão e extraia os nomes necessários. 

name_pattern = re.compile(r'^([A-Z]{1}.+?)(?:,)', flags = re.M)
names = name_pattern.findall(content)
print(names)

Passo 04:

Os salários têm um aspeto confuso e não são compreensíveis. Por isso, utilizamos a compreensão de listas em Python para converter os salários em números. Utilizaremos o corte de cadeias de caracteres, a divisão e junção e a compreensão de listas para obter os resultados pretendidos.

salários = ['$876,001', '$543,903', '$2453,896']
[int(''.join(s[1:].split(','))) for s in salaries]

O resultado é o seguinte:

Visualização de dados em Python

A visualização de dados ajuda-o a compreender os dados visualmente para que as tendências, os padrões e as correlações possam ser expostos. Pode traduzir uma grande quantidade de dados em gráficos, diagramas e outros elementos visuais para identificar os valores anómalos e obter informações valiosas.

Podemos utilizar o matplotlib para visualizar os dados, como se mostra abaixo.

Importar as bibliotecas necessárias, como indicado abaixo.

import pandas as pd
import matplotlib.pyplot as plt

Crie um quadro de dados em pandas com escolas, nomes e salários. Por exemplo, pode converter as escolas num quadro de dados como:

df_escola = pd.DataFrame(escolas)
imprimir(df_escola)

A saída é:

Da mesma forma, pode fazer o mesmo para salários e nomes.

Para a visualização dos dados, podemos desenhar um gráfico de barras como mostrado abaixo.

df.plot(kind='barh', x = 'President', y = 'salary')

O resultado é o seguinte:

Porque é que os proxies são necessários para a recolha de dados da Web?

A extração de dados da Web ajuda as empresas a extrair informações úteis sobre as perspectivas de mercado e as indústrias para oferecer serviços baseados em dados e tomar decisões orientadas por dados. Os proxies são essenciais para extrair dados de vários sítios Web pelas seguintes razões

  • Evitar proibições de IP - Para impedir que os scrapers façam demasiados pedidos, os sítios Web comerciais limitam a quantidade de dados rastreáveis, designados por taxa de rastreio. A taxa de rastreio diminui a velocidade do sítio Web e torna-se difícil para o utilizador aceder eficazmente ao conteúdo pretendido. No entanto, se utilizar um conjunto suficiente de proxies para recolher os dados, conseguirá ultrapassar os limites de taxa do sítio Web alvo. Isto deve-se ao facto de os proxies enviarem pedidos a partir de diferentes endereços IP, permitindo-lhe assim extrair dados de sítios Web de acordo com as suas necessidades.
  • Permitir o acesso a conteúdos específicos da região - As empresas têm de monitorizar os seus concorrentes (sítios Web) para fornecerem características e preços de produtos adequados aos clientes numa região geográfica específica. Podem aceder a todo o conteúdo disponível nessa região utilizando proxies residenciais com endereços IP.
  • Segurança melhorada - Um servidor proxy acrescenta uma camada adicional de segurança ao ocultar o endereço IP do dispositivo do utilizador.

Sabe quantas procurações são necessárias para obter os benefícios acima referidos? Pode calcular o número necessário de proxies utilizando esta fórmula:

Número de proxies = Número de pedidos de acesso / Taxa de rastreio

O número de pedidos de acesso depende dos seguintes parâmetros.

  • A frequência com que o scraper extrai informações de um sítio Web
  • Número de páginas que o utilizador pretende extrair

Por outro lado, a taxa de rastreio é limitada pelo número de pedidos que o utilizador faz num determinado período de tempo. Alguns sítios Web permitem um número limitado de pedidos por utilizador para diferenciar os pedidos automatizados dos pedidos de utilizadores humanos. 

Usando Proxies em Python

Podes utilizar proxies em Python seguindo os passos abaixo.

  • É necessário importar o módulo requests do Python.
pedidos de importação
  • Pode criar um conjunto de proxies para os rodar.
proxy = 'http://114.121.248.251:8080'
url = 'https://ipecho.net/plain'
  • Pode utilizar requests.get() para enviar um pedido GET, passando um proxy como parâmetro para o URL.
page = requests.get(url,
                    proxies={"http": proxy, "https": proxy})
  • Pode obter o conteúdo do URL solicitado se não houver erro de ligação.
imprimir(página.texto)

O resultado é o seguinte:

Conclusão

Discutimos que podemos utilizar a raspagem na Web para extrair dados de sítios Web em vez de utilizar a raspagem manual. A raspagem da Web é um processo económico e que poupa tempo. As empresas utilizam-no para recolher e reestruturar informações da Web para tomar decisões baseadas em dados e obter informações valiosas. A utilização de proxies é essencial para uma recolha segura de dados da Web, uma vez que oculta o endereço IP original do utilizador do sítio Web alvo. Pode utilizar proxies de centros de dados ou residenciais para a recolha de dados da Web. Mas é preferível utilizar proxies residenciais, uma vez que são rápidos e não podem ser facilmente detectados. Além disso, podemos utilizar expressões regulares em Python para corresponder ou encontrar conjuntos de cadeias de caracteres. Isto significa que podemos extrair qualquer padrão de cadeia de caracteres do texto com a ajuda de expressões regulares. Também vimos que a visualização de dados converte quantidades volumosas de dados em tabelas, gráficos e outros elementos visuais que nos ajudam a detetar anomalias e a identificar tendências úteis nos dados.