Extração de dados da web (ou web scraping) é o processo de extrair dados de sites. Como os dados podem assumir várias formas, o termo captura de texto é usado especificamente quando se refere à coleta de dados textuais.
Ter uma grande quantidade de dados relevantes é essencial para cada decisão comercial bem-sucedida. A coleta de informações de sites concorrentes pode fornecer uma visão da lógica de negócios deles, o que pode ajudá-lo a obter uma vantagem competitiva. Neste tutorial, você aprenderá como implementar um raspador de texto em Python, facilitando a extração e o uso de dados da web.
Pré-requisitos
Antes de começar este tutorial, você precisa dos seguintes pré-requisitos:
- A versão mais recente de Python e pip instalada em seu sistema.
- Um ambiente virtual Python. Certifique-se de instalar todos os pacotes necessários no ambiente virtual, incluindo requests para buscar o conteúdo HTML de uma página da web, Beautiful Soup para analisar e extrair o texto ou dados desejados do HTML e pandas para organizar e armazenar os dados extraídos em um formato estruturado, como um arquivo CSV.
Se você estiver procurando por mais informações para ajudá-lo a começar a fazer web scraping com Python, confira este artigo.
Entendendo a estrutura do site
Antes de começar a extrair, você precisa analisar a estrutura do site que está segmentando. Os sites são criados usando HTML, que é uma linguagem de marcação que define como o conteúdo é organizado e exibido.
Cada parte do conteúdo, seja um título, parágrafo ou link, está dentro de tags HTML. Essas tags ajudam a identificar onde os dados que você deseja coletar estão localizados. Por exemplo, neste exemplo, você extrai as aspas de Quotes to Scrape, um site simulado. Para visualizar a estrutura deste site, você precisa abrir o site em seu navegador e acessar as Ferramentas de desenvolvedor clicando com o botão direito na página e selecionando Inspecionar ou Inspecionar elemento. Isso abre o código HTML da página:
Reserve algum tempo para se familiarizar com a estrutura — procure tags como <div>
, <span>
, <p>
e <a>
pois elas geralmente contêm o texto ou links que você talvez queira extrair. Além disso, observe que as tags geralmente contêm um atributo class
. Sua finalidade é definir uma classe específica para o elemento HTML, permitindo que ele seja estilizado com CSS ou selecionado com JavaScript.
Nota: o atributo
class
é particularmente útil na captura de texto porque ajuda você a segmentar elementos específicos em uma página que compartilham o mesmo estilo ou estrutura, facilitando a extração dos dados exatos de que você precisa.
Aqui, cada citação está contida em um elemento div
com a classe quote
. Se você estiver interessado no texto e no autor de cada citação, o texto está contido em um div
com a classe text
, e o autor está contido em um pequeno
elemento com a classe de author
:
Se você não está familiarizado com o funcionamento do HTML, confira este artigo sobre web scraping em HTML para saber mais.
Captura de texto em um site
Com a estrutura do site em mente, a próxima etapa é escrever o código que você usará para copiar o site Quotes to Scrape.
Python é uma escolha popular para essa tarefa devido à sua facilidade de uso e bibliotecas poderosas, incluindo requests
e BeautifulSoup
. Você usa a biblioteca requests
para buscar o conteúdo HTML da página. Ela é necessária porque você precisa recuperar os dados brutos antes de poder analisá-los ou extraí-los. Depois de ter o conteúdo HTML, você pode dividi-lo em uma estrutura mais gerenciável usando BeautifulSoup
.
Para começar, crie um arquivo Python para o script de captura de texto chamado text-scraper.py
. Em seguida, importe BeautifulSoup
e requests
:
import requests
from bs4 import BeautifulSoup
Especifique a URL do site que está copiando e envie uma solicitação GET:
# URL of the quotes website
url = 'https://quotes.toscrape.com/'
# Send a GET request to the URL
response = requests.get(url)
Depois de enviar a solicitação GET, você recebe o HTML de uma página inteira. É necessário analisá-lo para extrair apenas os dados necessários, que nesse caso são o texto e o autor de cada citação. Para fazer isso, a primeira coisa que você precisa fazer é criar um objeto BeautifulSoup
para analisar o HTML:
soup = BeautifulSoup(response.text, 'html.parser')
Encontre todos os elementos div
que contêm aspas (o que significa que eles são da classe quote
):
quotes = soup.find_all('div', class_='quote')
Crie uma lista para armazenar as aspas em:
data = []
Em seguida, extraia o texto e o autor de cada citação e armazene-os na lista data
:
for quote in quotes:
text = quote.find('span', class_='text').text.strip()
author = quote.find('small', class_='author').text.strip()
data.append({
'Text': text,
'Author': author
})
O script deve ter uma aparência semelhante a esta:
import requests
from bs4 import BeautifulSoup
# URL of the quotes website
url = 'http://quotes.toscrape.com/'
# Send a GET request to the URL
response = requests.get(url)
# Create a BeautifulSoup object to parse the HTML
soup = BeautifulSoup(response.text, 'html.parser')
# Find all quote containers
quotes = soup.find_all('div', class_='quote')
# Extract data from each quote
data = []
for quote in quotes:
text = quote.find('span', class_='text').text.strip()
author = quote.find('small', class_='author').text.strip()
data.append({
'Text': text,
'Author': author
})
print(data)
Agora é hora de executar o script a partir do seu terminal:
# For Linux and macOS
python3 text-scraper.py
# For Windows
python text-scraper.py
Você deve obter uma lista das citações extraídas exibida na tela:
[{'Author': 'Albert Einstein',
'Text': '"The world as we have created it is a process of our thinking. It '
'cannot be changed without changing our thinking."'},
{'Author': 'J.K. Rowling',
'Text': '"It is our choices, Harry, that show what we truly are, far more '
'than our abilities."'},
{'Author': 'Albert Einstein',
'Text': '"There are only two ways to live your life. One is as though '
'nothing is a miracle. The other is as though everything is a '
'miracle."'},
{'Author': 'Jane Austen',
'Text': '"The person, be it gentleman or lady, who has not pleasure in a '
'good novel, must be intolerably stupid."'},
{'Author': 'Marilyn Monroe',
'Text': ""Imperfection is beauty, madness is genius and it's better to be "
'absolutely ridiculous than absolutely boring."'},
{'Author': 'Albert Einstein',
'Text': '"Try not to become a man of success. Rather become a man of '
'value."'},
{'Author': 'André Gide',
'Text': '"It is better to be hated for what you are than to be loved for '
'what you are not."'},
{'Author': 'Thomas A. Edison',
'Text': ""I have not failed. I've just found 10,000 ways that won't work.""},
{'Author': 'Eleanor Roosevelt',
'Text': '"A woman is like a tea bag; you never know how strong it is until '
"it's in hot water.""},
{'Author': 'Steve Martin',
'Text': '"A day without sunshine is like, you know, night."'}]
Embora essa captura de texto pareça bastante simples, você provavelmente enfrentará desafios durante a extração de dados da web, como bloqueio de IP, se o site detectar muitas solicitações, ou CAPTCHAs para impedir o acesso automatizado. Para superar esses desafios, você pode usar proxies.
Usando proxies para extração anônima
Os proxies ajudam você a evitar e contornar bloqueios de IP e CAPTCHAs, alternando seu endereço IP e fazendo com que suas solicitações pareçam vir de locais diferentes. Para usar proxies, você precisa configurar o método request.get ()
para rotear todas as solicitações por meio de um servidor proxy.
Nesse cenário, você usa os proxies rotativos Bright Data, que fornecem acesso a mais de 72 milhões de endereços IP de mais de 195 países. Para começar, crie uma conta gratuita na Bright Data selecionando Iniciar teste gratuito no canto superior direito, preenchendo o formulário de registro e clicando em Criar conta:
Criar um proxy residencial básico
Depois de criar sua conta Bright Data, faça login e navegue até a seção Proxies & Scraping. Na seção Redes proxy , encontre proxies residenciais e clique em Começar:
Você receberá uma solicitação para adicionar uma nova zona para o proxy residencial. Mantenha todos os padrões, nomeie a zona e clique em Adicionar:
E isso é tudo o que é preciso para criar uma nova zona de proxy residencial!
Para usar o proxy, você precisa de suas credenciais (ou seja, nome de usuário, senha e host). Para encontrar essas credenciais, vá para a seção Proxies & Scraping novamente e selecione a zona de proxy que você acabou de criar:
Depois de clicar na zona proxy, você verá o painel de controle da zona. Na seção Autorização, você vê suas credenciais:
Atualize o script de extração
Agora que você tem suas credenciais de proxy, é hora de configurar o proxy. Para começar, armazene suas credenciais como variáveis:
host = 'brd.superproxy.io'
port = 22225
username = 'brd-customer-<customer_id>-zone-<zone_name>'
password = '<zone_password>'
Em seguida, crie um URL de proxy com as credenciais armazenadas:
proxy_url = f'http://{username}:{password}@{host}:{port}'
Crie uma configuração de proxy para solicitações HTTP e HTTPS:
proxies = {
'http': proxy_url,
'https': proxy_url
}
E adicione a configuração de proxy à chamada requests.get()
:
response = requests.get(url, proxies=proxies)
Neste momento, seu script PHP deverá estar assim:
import requests
from bs4 import BeautifulSoup
# BrightData credentials
host = 'brd.superproxy.io'
port = 22225
username = 'brd-customer-<customer_id>-zone-<zone_name>'
password = '<zone_password>'
# Compose a proxy URL
proxy_url = f'http://{username}:{password}@{host}:{port}'
# Create a proxy configuration
proxies = {
'http': proxy_url,
'https': proxy_url
}
# URL of the quotes website
url = 'http://quotes.toscrape.com/'
# Send a GET request to the URL via the specified proxy
response = requests.get(url, proxies=proxies)
# Create a BeautifulSoup object to parse the HTML
soup = BeautifulSoup(response.text, 'html.parser')
# Find all quote containers
quotes = soup.find_all('div', class_='quote')
# Extract data from each quote
data = []
for quote in quotes:
text = quote.find('span', class_='text').text.strip()
author = quote.find('small', class_='author').text.strip()
data.append({
'Text': text,
'Author': author
})
print(data)
Execute e teste o script
A execução desse script fornece o mesmo resultado do script sem proxies. A diferença é que o site do qual você está extraindo dados agora pensa que a solicitação vem de outro lugar, mantendo sua localização real privada. Vamos ilustrar escrevendo um novo script simples.
Importe as bibliotecas necessárias e defina o url
como "http://lumtest.com/myip.json"
no script:
import requests
from bs4 import BeautifulSoup
url = "http://lumtest.com/myip.json"
Envie uma solicitação GET para o url
sem uma configuração de proxy e crie um objeto BeautifulSoup
para a resposta:
# Send a GET request to the URL
response = requests.get(url)
# Create a BeautifulSoup object to parse the HTML
soup = BeautifulSoup(response.text, 'html.parser')
Finalmente, imprima o objeto soup
:
print(soup)
Execute esse script. Em seguida, você obtém informações sobre seu endereço IP e localização como resposta.
Para comparar, configure a solicitação GET para usar um proxy Bright Data e deixe todo o resto igual:
# BrightData credentials
host = 'brd.superproxy.io'
port = 22225
username = 'brd-customer-hl_459f8bd4-zone-test_residential_proxy'
password = '8sdgouh1dq5h'
proxy_url = f'http://{username}:{password}@{host}:{port}'
proxies = {
'http': proxy_url,
'https': proxy_url
}
# Send a GET request to the URL
response = requests.get(url, proxies=proxies)
Ao executar o script atualizado, você deve ver que está recebendo um endereço IP diferente como resposta; esse não é o seu IP real, mas o endereço IP de um proxy que você configurou. Você está essencialmente escondendo seu endereço IP atrás de um dos servidores proxy.
Armazenando dados
Depois de coletar dados de um site com sucesso, a próxima etapa é armazená-los em um formato estruturado que permita fácil acesso e análise. O CSV é popular por isso, pois é amplamente suportado por ferramentas de análise de dados e linguagens de programação.
Para salvar dados copiados em um arquivo CSV, comece importando a biblioteca pandas
(na parte superior do script de extração), pois ela tem métodos para converter dados no formato CSV:
import pandas as pd
Em seguida, crie um objeto pandas DataFrame a partir dos dados coletados:
df = pd.DataFrame(data)
Finalmente, converta o DataFrame em um arquivo CSV e dê a ele um nome (por exemplo quotes.csv
):
df.to_csv('quotes.csv', index=False)
Depois de fazer essas alterações, execute o script. Em seguida, você obtém os dados copiados armazenados no arquivo CSV.
Neste exemplo simples, não há muito que você possa fazer com as citações. No entanto, dependendo dos dados coletados, existem várias maneiras de analisá-los para extrair insights.
Você pode começar explorando estatísticas descritivas usando a função describe()
do pandas. Essa função fornece uma visão geral rápida de seus dados numéricos, incluindo média, mediana e desvio padrão. Você pode visualizar seus dados usando Matplotlib ou seaborn para criar histogramas, gráficos de dispersão ou gráficos de barras, ajudando você a identificar padrões ou tendências visualmente. Para dados textuais, considere usar técnicas de processamento de linguagem natural, como análise de frequência de palavras ou análise de sentimentos, para entender temas comuns ou sentimentos gerais em resenhas ou comentários.
Para obter insights mais profundos, procure correlações entre diferentes variáveis em seu conjunto de dados. Por exemplo, você pode examinar a relação entre as avaliações de livros e comprimento das resenhas, ou analisar como as avaliações variam em diferentes gêneros ou autores. Use a função pandas groupby()
para agregar dados e comparar métricas entre categorias.
Não se esqueça de considerar o contexto de seus dados e as perguntas que você está tentando responder. Por exemplo, se você estiver analisando resenhas de livros, poderá investigar quais fatores contribuem mais para altas classificações ou identificar tendências em gêneros populares ao longo do tempo. Seja sempre crítico com as suas descobertas e considere possíveis vieses em seu processo de coleta de dados.
Conclusão
Neste tutorial, você aprendeu a raspar textos com Python, explorou os benefícios do uso de proxies e descobriu como os proxies rotativos Bright Data podem ajudá-lo a evitar bloqueios de IP e manter o anonimato.
Embora o desenvolvimento de suas próprias soluções de scraping possa ser gratificante, geralmente traz desafios, como manter o código, lidar com CAPTCHAs e manter a conformidade com as políticas do site. É aqui que as APIs de coleta de dados da Bright Data podem ajudar. Com recursos como resolução automática de CAPTCHA, rotação de IP e análise robusta de dados, a Bright Data simplifica o processo de coleta e permite que você se concentre na análise de dados em vez do gerenciamento da infraestrutura.
Inscreva-se para um teste gratuito da Bright Data para ver como a Bright Data pode aprimorar seus projetos de web scraping, fornecendo soluções de coleta de dados confiáveis, escaláveis e eficientes para suas necessidades comerciais.
Não é necessário cartão de crédito