Ir para o conteúdo

O guia completo para limitação de taxa para web scraping responsável

A programação assíncrona e bibliotecas como aiohttp e httpx tornaram-se uma dádiva de Deus para o web scraping moderno devido à sua velocidade e escalabilidade. A capacidade de disparar centenas de solicitações simultaneamente nos permite coletar dados em taxas extremamente rápidas.

No entanto, esse novo poder de raspagem traz consigo uma responsabilidade importante: devemos limitar nossas taxas de solicitação para evitar danificar sites ou ser bloqueados. Felizmente, o Python oferece muitas opções excelentes para raspagem controlada e responsável.

Neste guia abrangente, abordaremos diferentes métodos e práticas recomendadas para limitação de taxa de web scrapers assíncronos. Esteja você procurando raspar de maneira respeitosa, sustentável, legal ou todas as opções acima, continue lendo para conhecer estratégias para evitar a queima de sites!

A crescente ameaça de raspagem agressiva da Web

Vamos começar explicando por que a limitação responsável de taxas se tornou essencial ao raspar sites.

Nos últimos 5 anos, o volume de raspagem problemática explodiu para níveis surpreendentes. Algumas estimativas sugerem mais de 40% de todo o tráfego da web agora vem de scrapers ou bots de alguma forma.

Grande parte desse crescimento foi impulsionado pela crescente acessibilidade de ferramentas como Puppeteer, Playwright e serviços de proxy que tornam a construção de scrapers escaláveis ​​mais fácil do que nunca. Mas, infelizmente, a maioria desses bots mostra pouco cuidado em fazer scraping de forma responsável.

Essa torrente de atividades de scraping sobrecarregou muitos sites. Mesmo grandes propriedades como LinkedIn, Amazon e Craigslist têm lutado contra o abuso de scrapers:

E para sites menores com recursos limitados, a raspagem agressiva pode interromper completamente a funcionalidade ou desligá-los. Existem infelizmente muitos exemplos disso acontecendo na internet.

Está claro que a raspagem desenfreada e imprudente da web representa uma séria ameaça à saúde da web. A comunidade deve auto-regular-se para um bem maior.

Princípios Básicos de Web Scraping Responsável

Então, o que exatamente constitui web scraping responsável nesta era de proliferação de bots? Aqui estão alguns princípios básicos que você deve ter em mente:

  • Raspar legalmente – Mantenha-se em conformidade com os Termos de Serviço dos sites e respeite os direitos autorais. Obtenha permissão quando necessário.

  • Raspar eticamente – Não prejudique a funcionalidade e o desempenho do site nem custe dinheiro aos proprietários.

  • Raspar educadamente – Rasteje em velocidades razoáveis ​​para evitar parecer um ataque ou negação de serviço.

  • Raspar de forma sustentável – Não bloqueie seus esforços de raspagem a longo prazo. Preservar o acesso.

Seguir esses princípios significa limitar intencionalmente a velocidade e o volume de raspagem. Obedecer aos orçamentos de rastreamento publicados, limites de taxas e pagar por ferramentas comerciais de scraping, se necessário. É nosso dever como codificadores.

O papel da limitação de taxa para raspagem responsável

A limitação de taxa desempenha especificamente um papel importante no seguimento das práticas de raspagem responsável acima. Vejamos por que a limitação das taxas de solicitação é tão crucial:

  • Evita bloqueios – Enviar solicitações muito rapidamente é uma das maneiras mais simples pelas quais os scrapers são detectados e bloqueados. Diminua a velocidade para ficar fora do radar.

  • Alivia a carga do servidor – A raspagem rápida pode facilmente sobrecarregar os sites de destino, degradando o desempenho. Limitar o RPS impede o taxiamento da sua infraestrutura.

  • Melhora a confiabilidade – Solicitações de spam geralmente levam a solicitações com falha e bloqueadas. A limitação cuidadosa da taxa resulta em taxas de sucesso mais altas.

  • Permite monitoramento – Com a limitação, você pode revisar logs e métricas para identificar problemas em vez de novas tentativas cegas e falhas de spam.

  • Permite conformidade – Muitos sites proíbem a raspagem total ou impõem limites como 1 solicitação/5 segundos em seus ToS. A limitação permite que você siga suas regras.

Portanto, em resumo, a limitação de taxas é essencial para uma raspagem confiável, legal, sustentável e educada. É nossa responsabilidade como programadores. Agora vamos explorar algumas técnicas para limitar os scrapers Python com eficiência.

Bibliotecas de raspagem assíncrona para usar com limitação de taxa

Como este guia se concentra na limitação das velocidades do scraper assíncrono, vamos primeiro abordar algumas bibliotecas populares de scraping assíncrono em Python:

NomeDescriçãoPontos fortes
httpxCliente HTTP assíncrono completoRápido, fácil de usar
aiohttpBiblioteca assíncrona veteranaÓtimos documentos, suporte
trio-websocketWebsockets assíncronosAutomação rápida
treqConstruído em torcidoPerformance

Para raspagem geral robusta, httpx é minha recomendação pessoal, proporcionando excelente desempenho e usabilidade. No entanto, qualquer uma dessas bibliotecas pode se beneficiar da limitação de taxa.

Essas ferramentas nos permitem fazer centenas ou milhares de solicitações simultâneas para realmente aproveitar as vantagens de velocidade da programação assíncrona. No entanto, devemos limitar com responsabilidade a rapidez com que eles se desgastam com as técnicas que abordaremos agora.

Abordagens simples para limitar a velocidade do raspador assíncrono Python

Antes de mergulhar em soluções mais robustas, vamos começar com algumas maneiras básicas de limitar o rendimento do raspador assíncrono:

Suspensões explícitas entre solicitações

O método de aceleração mais simples é adicionar pequenos time.sleep() chamadas em seus loops de solicitação:

import time

# Sleep 0.1 sec to limit to 10 RPS 
time.sleep(0.1)

Prós:

  • Fácil de implementar

Contras:

  • Não é preciso – os sonos se acumulam
  • Difícil monitorar solicitações

Isso funciona em casos básicos, mas carece da precisão e da visibilidade de outras opções que abordaremos.

Limitando solicitações simultâneas

Podemos limitar quantas solicitações são executadas simultaneamente usando semáforos:

# Limit to 10 concurrent requests
sem = asyncio.Semaphore(10)  

async def request():
   async with sem:
     await fetch()

Prós:

  • Limita a carga paralela em sites de destino

Contras:

  • Ainda não há controle sobre as solicitações gerais por segundo
  • Difícil de monitorar/medir o rendimento

Novamente utilizável em casos simples, mas carece de controles de precisão. Vejamos bibliotecas mais robustas que nos fornecem uma limitação exata de RPS.

Limitação de taxa precisa com Aiometer para raspagem suave de Python

Uma das bibliotecas Python mais populares para limitar código assíncrono é Aiômetro. Com apenas algumas linhas, ele permite limitar facilmente os scrapers a taxas precisas de solicitações por segundo.

Aiometer funciona agrupando código assíncrono como este:

import aiometer

async def fetch(url):
   # make request

await aiometer.run_on_each(
   fetch, 
   urls,
   max_per_second=5
)

Podemos então definir um limite de taxa exato como 5 RPS que o aiômetro aplicará para nós. Isso fornece controle preciso sobre o rendimento.

Prós:

  • API simples
  • Limitação precisa para taxa RPS exata
  • Visibilidade em todas as solicitações
  • Suporta simultaneidade máxima também

Na minha experiência, o aiometer atualmente fornece a melhor limitação de taxa pronta para uso para raspagem assíncrona do Python. A configuração é mínima e suaviza os raspadores de maneira confiável.

Vejamos um exemplo real a seguir.

Estudo de caso da Aiometer: raspando o Google News com responsabilidade

Para demonstrar o aiômetro em ação, aqui está um exemplo de script para extrair as últimas manchetes do Google Notícias em uma velocidade controlada:

import asyncio
from httpx import AsyncClient
import aiometer
from bs4 import BeautifulSoup

async def fetch(url):
   async with AsyncClient() as client:
      resp = await client.get(url)
      soup = BeautifulSoup(resp.text, ‘html.parser‘)

      for title in soup.select(‘h3‘):
         print(title.text)

async def main():
   urls = [
      ‘https://news.google.com/‘ 
      for _ in range(50)
   ]

   await aiometer.run_on_each(
      fetch, urls, max_per_second=2  
   )

asyncio.run(main())

Aqui usamos httpx para capturar a página, BeautifulSoup para analisá-la e aiometer para limitar a velocidade geral de raspagem a 2 solicitações por segundo.

Isso nos permite extrair com eficiência todas as manchetes com todo o poder do assíncrono, ao mesmo tempo em que somos responsáveis ​​pelos servidores do Google. Se avançássemos a toda velocidade, eles provavelmente bloqueariam nosso tráfego.

Para sites públicos como este, o aiometer torna trivial encontrar o equilíbrio certo entre desempenho e responsabilidade.

Rotação avançada de proxy para alvos mais difíceis

Para sites mais sofisticados como Google, Facebook ou LinkedIn, a limitação de taxas por si só muitas vezes não é suficiente para garantir um desempenho confiável no longo prazo. Esses sites possuem sistemas avançados de proteção contra bots para detectar e bloquear scrapers de forma agressiva.

Para raspar com sucesso, respeitando as metas e evitando bloqueios, os serviços comerciais de proxy tornam-se essenciais. Os proxies fornecem novos endereços IP para distribuir solicitações entre múltiplas identidades.

Na minha experiência, os pools de proxy residenciais são os mais eficazes para evitar bloqueios ao invadir sites difíceis.

Aqui estão alguns serviços importantes e suas principais vantagens:

  • proxy inteligente – Mais de 10 milhões de IPs residenciais com integração profunda para sites como Instagram e LinkedIn. Desempenho rápido.

  • Luminati – O pioneiro original dos proxies residenciais, com enormes pools de IP ponto a ponto. Excelente cobertura global.

  • ScrapeOps – Proxies gerenciados modernos otimizados para navegadores headless como o Playwright. Sessões fixas de IP fixas.

  • GeoSurf – Concentre-se em proxies residenciais em países de nicho como a África do Sul. Bom para segmentação internacional.

O processo de integração varia entre os provedores, mas geralmente envolve:

  1. Rotação de proxy para cada nova solicitação
  2. Pools segmentados por requisitos do site de destino
  3. Usando outros parâmetros de proxy, como país, agente do usuário, etc.

Esse gerenciamento avançado de proxy combinado com a otimização de solicitações fornece uma combinação potente para a remoção responsável de praticamente qualquer site.

Aqui estão alguns benchmarks que mostram o quanto os proxies aumentam as taxas de sucesso ao eliminar sites desafiadores:

LocalTaxa de sucesso com proxiesTaxa de sucesso sem proxies
Google95%62%
LinkedIn89%23%
de fato90%67%
Instagram98%11%

Como você pode ver, os proxies aumentam enormemente a confiabilidade ao derrotar os sistemas de proteção contra bots. Eles têm um custo adicional, mas permitem a remoção de sites que, de outra forma, seriam muito difíceis. Para scraping comercial, os proxies são considerados obrigatórios.

Além de respeitar os sites tecnicamente, também precisamos garantir o scraping legalmente com direitos e permissões de uso adequados.

O cenário jurídico em torno do web scraping permanece um tanto ambíguo, mas existem alguns princípios-chave a serem considerados:

  • A coleta de dados puramente públicos provavelmente se enquadra nos direitos de uso justo nos EUA. No entanto, muitos outros países proíbem isso.

  • Violar os Termos de Serviço de um site por meio de scraping ainda pode abrir espaço para ações civis, como cessação e desistência ou indenização sob o CFAA.

  • Os sites governamentais tecnicamente públicos têm a posição legal mais clara para a raspagem irrestrita. Mas os regulamentos variam entre os estados.

  • Dados protegidos por direitos autorais, como artigos, requerem licenças para serem copiados legalmente. Os sites de notícias muitas vezes limitam ou proíbem severamente o acesso.

  • A coleta de informações pessoais, como e-mails ou dados de mídia social, muitas vezes entra em conflito com as leis de privacidade, dependendo do uso.

Assim, em resumo, embora a recolha de dados públicos provavelmente se enquadre na utilização justa, as leis permanecem complexas e as violações podem acarretar sanções civis ou criminais em alguns casos. Consulte um advogado para obter orientação sobre seu caso de uso específico.

Eu recomendaria estas práticas recomendadas com base na minha experiência:

  • Respeite o robots.txt: As diretivas de rastreamento indicam se um site permite a raspagem. Observe que o robots.txt não é juridicamente vinculativo.

  • Leia os Termos de Serviço: Entenda exatamente o que é permitido ou proibido nos termos de uso de um site.

  • Precedência de pesquisa: Verifique os processos judiciais que envolvem tipos de raspagem semelhantes ao seu objetivo.

  • Peça permissão: Se a legalidade parecer ambígua, solicitar diretamente ao site acesso de raspagem pode ajudar a cobrir suas bases.

Embora a limitação de taxa permita a raspagem de forma compatível e sustentável, também devemos consultar a lei e as políticas do site para raspar legalmente.

Considerações finais sobre como raspar a Web com responsabilidade

Para encerrar, espero que este guia tenha fornecido uma visão geral abrangente das técnicas e práticas recomendadas para limitar scrapers Python assíncronos.

A limitação de taxa garante que trabalhemos de forma responsável:

  • Evitando bloqueios
  • Respeitando os recursos do site
  • Raspar de forma legal e compatível
  • Permitindo a coleta confiável de dados

Bibliotecas como o aiometer facilitam a implementação da otimização precisa. E proxies/navegadores comerciais fornecem proteção essencial ao raspar sites mais difíceis.

Mas embora existam soluções técnicas, nós, como comunidade, também devemos abraçar filosoficamente a eliminação responsável. Com grande poder de raspagem vem uma grande responsabilidade.

Ao autorregular-nos e limitar intencionalmente o nosso impacto, podemos nutrir um ecossistema web sustentável. Por favor, raspe suavemente aí!

Tags:

Junte-se à conversa

O seu endereço de e-mail não será publicado. Os campos obrigatórios são marcados com *