O ato de raspar a web pode muitas vezes parecer uma caça ao tesouro em que se está a explorar a web para obter informações ocultas que não são fornecidas pelas API. E como em qualquer boa caça ao tesouro, há desafios a ultrapassar.
Um obstáculo notável é o facto de se deparar com bloqueios de acesso impostos pelo sítio web de destino. Estes bloqueios podem surgir por várias razões, tais como políticas rigorosas de raspagem, preocupações relacionadas com o abuso de recursos, questões de reputação do IP de origem ou a deteção de agentes de usuário (falsos).
Mas não tenha medo, este tutorial vai ensinar-lhe como raspar a web sem ser bloqueado pelo seu sítio web alvo, para que possa encontrar facilmente o seu tesouro na Internet.
Estratégias para o ajudar a evitar bloqueios de acesso
Uma vez que a raspagem da web é uma tarefa complexa, evitar bloqueios de acesso exige frequentemente a utilização de várias técnicas. Seguem-se nove estratégias que pode utilizar para contornar estes bloqueios incómodos.
1. Compreender as políticas e os termos de serviço do seu alvo
Quando começa a raspar um novo sítio, tem de se familiarizar com ele para além de aprender apenas a estrutura HTML da página. A familiarização também deve incluir a compreensão das políticas e dos termos de serviço do sítio que pretende raspar. Isto envolve frequentemente a posição do sítio em relação à raspagem da web, se permitem a raspagem e quais são as páginas específicas que podem ser raspadas. O desrespeito destas condições provoca o bloqueio do usuário e pode expô-lo a riscos legais.
Um documento crucial a ter em conta é o ficheiro robots.txt
. Este ficheiro está localizado no diretório raiz do sítio web e fornece instruções aos robôs da web sobre as partes do sítio web que não podem ser analisadas ou processadas.
Segue-se uma amostra de um ficheiro robots.txt
:
User-agent: *
Disallow: /private/
Disallow: /temp/
Aqui, o ficheiro robots.txt
dá instruções a todos os robôs da web (indicados pelo *
a seguir ao Usuário-agente
) para evitarem a raspagem dos diretórios privados
e temporários
do sítio web.
A raspagem respeitosa da web implica o cumprimento das diretrizes do seu sítio web em particular.
2. Cumprir as normas éticas de raspagem
Da mesma forma que deve aderir às políticas de um sítio web, também é melhor aderir a um código de conduta. As normas éticas de raspagem não só ajudam a evitar o bloqueio, como também respeitam os direitos e os recursos do sítio web visado.
É fundamental seguir estas diretrizes:
- Não bombardear os servidores com pedidos incessantes: Deixar intervalos de tempo suficientes entre os pedidos. Alguns sítios web podem detetar e bloquear raspadores da web que extraem grandes quantidades de dados rapidamente, porque não parece ser um comportamento humano. Para parecer mais natural e diminuir as hipóteses de ser bloqueado, é aconselhável adicionar um atraso de tempo aos pedidos. No entanto, em vez de ter um atraso de tempo fixo, é melhor utilizar intervalos irregulares para imitar mais de perto o comportamento humano.
- Não coletar dados pessoais sem consentimento: Não se trata apenas de uma questão ética, mas muitas vezes de uma questão jurídica. Certifique-se sempre de que tem as permissões necessárias antes de raspar dados pessoais.
- Respeitar os dados que obtém: Utilize os dados que raspa de forma responsável e legal. Certifique-se de que a sua utilização dos dados cumpre todas as leis e regulamentos aplicáveis, como as leis de direitos de autor e o Regulamento Geral de Proteção de Dados (RGPD).
Segue-se a forma como pode implementar intervalos irregulares entre pedidos em Python:
import time
import random
urls = ['https://www.targetwebsite.com/page1', 'https://www.targetwebsite.com/page2', 'https://www.targetwebsite.com/page3']
for url in urls:
response = requests.get(url)
# Process response
sleep_time = random.uniform(1, 10) # Generate a random sleep time between 1 and 10 seconds
time.sleep(sleep_time) # Sleep for a random time between requests
Este código percorre uma lista de URLs na matriz de urls
. Para cada URL, faz um pedido para o obter e depois faz uma pausa, utilizando a função time.sleep()
antes de prosseguir com o pedido seguinte. Estes intervalos aleatórios ajudam a imitar o comportamento de navegação humano, reduzindo as hipóteses de deteção.
3. Utilizar proxies (rotativos)
Uma ferramenta útil no seu kit de ferramentas de raspagem da web são os proxies, especialmente os proxies rotativos. Um proxy funciona como uma porta de ligação entre você e o sítio web que está a raspar. Oculta o seu endereço IP, fazendo com que os seus pedidos pareçam ser provenientes de locais diferentes.
Os proxies rotativos vão um pouco mais longe. Em vez de utilizar um único IP de proxy, dão-lhe um conjunto de endereços IP. Os seus pedidos rotam através destes IPs, alterando constantemente a sua aparência digital. Isto reduz muito as hipóteses de o seu raspador ser detetado e bloqueado, uma vez que é muito mais difícil para um sítio web identificar padrões nos pedidos.
Além disso, os proxies rotativos ajudam a distribuir os seus pedidos por vários IPs, reduzindo o risco de um único endereço IP ser banido por demasiados pedidos.
Segue-se um excerto de código que pode ser utilizado para o ajudar a implementar um proxy rotativo em Python:
import requests
from itertools import cycle
# List of proxies
proxy_list = ['ip1:port1', 'ip2:port2', ...]
proxy_pool = cycle(proxy_list) # create a cycle of proxies
url = 'https://www.targetwebsite.com'
for i in range(1,3):
# Get a proxy from the pool
proxy = next(proxy_pool)
print(f"Request #{i}:")
try:
response = requests.get(url, proxies={"http": proxy, "https": proxy})
print(response.content)
except:
# Most free proxies will often get connection errors, so we catch them here
print("Connection error with proxy:", proxy)
Este excerto de código utiliza uma lista de proxies (ou seja, proxy_list
) que é percorrida de modo que cada pedido efetuado tenha um endereço IP diferente. Isto torna mais difícil para os sítios detetarem as suas operações de raspagem da web.
A rotação de proxies é uma ferramenta poderosa, mas deve fazer parte de uma estratégia mais alargada. Para navegar nos mares agitados da raspagem da web sem ser bloqueado, é necessário combiná-las com as outras técnicas mencionadas neste artigo.
4. Utilizar os cabeçalhos e os agentes de usuário corretos
Os sítios web utilizam frequentemente cabeçalhos e agentes de usuário para detetar bots. Um Agente de Usuário
(ou Usuário-Agente) é um cabeçalho que o seu navegador envia para o servidor, fornecendo detalhes sobre o software e o sistema que iniciou o pedido. Inclui normalmente o tipo de aplicação, o sistema operativo, o fornecedor do software e a versão do software. Estas informações ajudam o servidor a fornecer conteúdos adequados ao seu navegador e sistema específicos.
Ao raspar a web, é crucial utilizar cadeias de agentes de usuário legítimas. Ao imitar um usuário real, é possível contornar eficazmente os mecanismos de deteção e reduzir a probabilidade de ser bloqueado.
Para além do Usuário-Agente
, outro cabeçalho importante a considerar é o cabeçalho Referenciador
. O cabeçalho Referenciador
revela o URL da página web que está ligada ao recurso que está a ser pedido. Incluir isto nos pedidos do seu raspador faz com que se pareça mais com um usuário humano navegando de uma página para outra.
Outros cabeçalhos úteis que o seu raspador pode incluir são Accept-Language
, Accept-Encoding
e Connection
. Estes cabeçalhos são normalmente enviados pelos navegadores web e raramente são incluídos por raspadores. Os raspadores normalmente negligenciam estes cabeçalhos porque não têm um impacto direto na recuperação do conteúdo da web. No entanto, a sua inclusão ajuda a fazer com que os pedidos do raspador pareçam mais genuínos, reduzindo as hipóteses de deteção.
Segue-se um trecho de Python que define o Usuário-Agente
e o Referenciador
no cabeçalho do pedido para imitar uma sessão de navegação genuína:
url = 'https://www.targetwebsite.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
'Referer': 'https://www.google.com/'
}
response = requests.get(url, headers=headers)
5. Lidar com armadilhas de mel e erros
Navegar no terreno de um sítio web pode ser um desafio graças a obstáculos como as armadilhas de mel. As armadilhas de mel são ligações ocultas intencionalmente concebidas para passarem despercebidas aos usuários normais, mas que podem ser detetadas por raspadores e bots. Estas ligações são frequentemente ocultadas utilizando elementos HTML definidos como hidden
(oculto) ou none
(nenhum), ou disfarçados de botões com cores que correspondem ao fundo da página. O principal objetivo da incorporação de armadilhas de mel é identificar e colocar bots na lista negra.
Segue-se um trecho de código simples que pode usar para tentar evitar armadilhas de mel em Python:
from bs4 import BeautifulSoup
import requests
url = 'https://www.targetwebsite.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
for link in soup.select('a'):
if 'display' in link.get('style', '') and 'none' in link['style']:
continue # Skip this link
# Process link
Este código ignora qualquer ligação com display: none
no seu atributo de estilo, uma caraterística comum das ligações de armadilhas de mel.
Ao raspar dados, outro aspeto importante a ter em conta são os erros, uma vez que não é incomum encontrar respostas de erro. Estes erros são frequentemente indicados por códigos de estado HTTP na faixa 4xx (erros do cliente) ou na faixa 5xx (erros do servidor). O tratamento destes erros é crucial para evitar sobrecarregar o servidor com pedidos excessivos, o que pode levar ao seu bloqueio.
Uma estratégia eficaz para gerir esses erros é implementar um algoritmo de backoff exponencial. Esta abordagem consiste em aumentar progressivamente o intervalo de tempo entre as tentativas de repetição subsequentes, permitindo um tratamento mais eficiente dos erros.
6. Utilizar um serviço de resolução de CAPTCHA
O teste de Turing Público Completamente Automatizado para Diferenciação entre Computadores e Humanos (CAPTCHA) é uma medida de segurança implementada por muitos sítios web para impedir atividades automatizadas de robôs, incluindo a raspagem da web. Foram concebidos para serem fáceis de resolver para os humanos mas difíceis para as máquinas, daí o seu nome.
Se você deparar com CAPTCHAs, deve considerar a utilização do Desbloqueador da Web da Bright Data. Este serviço utiliza vários métodos, incluindo algoritmos de aprendizagem automática e até solucionadores humanos, para decifrar os desafios CAPTCHA em seu nome. A sua função é automatizar o processo de resolução de CAPTCHA, permitindo que o seu raspador continue com o processo de extração de dados sem obstáculos.
7. Monitorizar os limites de taxa e as recusas de acesso
A maioria dos sítios web impõe limites de taxa e recusas de acesso para proteger os seus recursos de serem explorados por bots automatizados. Uma vez que cada pedido enviado a um servidor consome recursos, milhares de bots que enviam pedidos por segundo podem facilmente fazer cair um servidor ou degradar o desempenho de um sítio web. Para evitar isso, os sítios web impõem limites de taxa e alguns até fornecem um cabeçalho X-RateLimit-Limit
em suas respostas, detalhando seus limites de taxa. Deve respeitar estes limites para evitar ser bloqueado.
O servidor comunica normalmente estas restrições através de códigos de estado HTTP. Um código de estado 200
significa que tudo correu bem, mas um código 429
significa que enviou demasiados pedidos num determinado período. Da mesma forma, 403
significa que o acesso é proibido, enquanto 503
indica que o servidor não está disponível, possivelmente devido a sobrecarga. O conhecimento destes códigos é vital para navegar na extração de dados.
Segue-se um trecho de Python que utiliza a biblioteca requests para respeitar os limites de taxa:
import time
import requests
def respectful_requester(url, delay_interval=1):
response = requests.get(url)
# If the status code indicates rate limiting, sleep then retry
if response.status_code == 429:
print('Rate limit reached. Sleeping...')
time.sleep(delay_interval)
return respectful_requester(url, delay_interval)
elif response.status_code != 200:
print(f'Error: {response.status_code}. Try a different proxy or user-agent')
return response
Esta função envia um pedido GET para um URL e verifica a resposta. Se encontrar um código de estado 429
, faz uma pausa durante um intervalo de tempo especificado e, em seguida, tenta novamente o pedido. Pode também acrescentar um tratamento mais sofisticado para outros códigos de estado, se necessário.
8. Raspar do cache de Google
Para sítios web difíceis de raspar ou dados não sensíveis ao tempo, uma abordagem alternativa consiste em extrair dados da cópia em cache do sítio web do Google em vez do próprio sítio web. Esta técnica pode ser particularmente útil quando se lida com sítios web extremamente difíceis que bloqueiam ativamente os raspadores web. Estas páginas armazenadas em cache podem ser raspadas em vez das páginas web originais para evitar a ativação de quaisquer mecanismos antirraspagem. Tenha em atenção que este método pode não ser infalível, uma vez que alguns sítios web dão instruções ao Google para não colocar o seu conteúdo em cache. Além disso, os dados do cache do Google podem não estar atualizados.
Para extrair um sítio web do cache do Google, basta adicionar o URL do sítio ao final de http://webcache.googleusercontent.com/search?q=cache:
. Por exemplo, se pretender raspar o sítio web da Bright Data, pode utilizar o seguinte URL: http://webcache.googleusercontent.com/search?q=cache:https://https://brightdata.com/
.
Embora a raspagem do cache do Google possa ser mais fiável do que a raspagem de um sítio que bloqueia ativamente os seus pedidos, não se esqueça de ter em conta as limitações e verificar a relevância dos dados armazenados em cache.
9. Utilizar proxies e serviços de raspagem externos
À medida que se intensifica o jogo do gato e do rato entre os raspadores da web e os administradores de sítios web, aumentam as complexidades de manter uma configuração de raspagem da web eficaz e sigilosa. Os sítios web estão sempre a inventar novas formas de detetar, abrandar ou bloquear os raspadores da web, o que exige uma abordagem dinâmica para ultrapassar estas defesas.
Por vezes, a melhor abordagem é deixar que os especialistas tratem das partes mais difíceis. É aqui que os proxies e os serviços de raspagem externos, como a Bright Data, se destacam. A Bright Data está constantemente na vanguarda das tecnologias antirraspagem, adaptando rapidamente as suas estratégias para ultrapassar os novos obstáculos.
A Bright Data oferece soluções que o ajudam a imitar de forma convincente o comportamento humano, como proxies residenciais rotativos e resolução automatizada de CAPTCHA, permitindo que seus esforços de raspagem operem sob o radar. Os seus serviços também foram concebidos para serem escalados, ajudando-o a acomodar sem esforço as necessidades crescentes dos seus projetos de raspagem da web.
A utilização destas soluções ajuda-o a poupar tempo e recursos, libertando-o para se concentrar noutras partes do seu projeto, tais como a análise dos dados obtidos e a obtenção de informações a partir deles.
Conclusão
Nesta altura, já passou pelo terreno traiçoeiro dos bloqueios de raspagem da web. Compreendendo as políticas do seu alvo, utilizando padrões éticos de raspagem, empregando táticas como proxies rotativos, cabeçalhos apropriados e agentes de usuário, e lidando com armadilhas de mel e erros, está agora bem equipado para configurar os seus projetos de raspagem da web sem ser bloqueado.
No entanto, lembre-se que mesmo os exploradores mais experientes precisam de um conjunto de ferramentas fiável. É aí que entra a Bright Data. As suas soluções abrangentes oferecem uma vasta gama de serviços adaptados para simplificar o seu percurso de raspagem da web. Utilize o Desbloqueador da Web para aceder a dados escondidos atrás de CAPTCHAs. Ou selecione entre diversos serviços proxy, incluindo servidores proxy, proxies de centros de dados e proxies residenciais robustos, para manter o anonimato.
Boa raspagem!