LetMeCrawl — Web Scraping sem ser bloqueado
2.5 quintilhões de bytes são gerados diariamente. Estes dados são úteis para treinar modelos, analisar tendências, prever o futuro, extrair insights, etc. Além de tudo, estão disponíveis na internet para quem quiser usar na hora que bem entender. Mesmo?!
Dados na web estão, em sua maioria, desestruturados e além disso empresas grandes sabem como proteger seus dados de scrapers. Se você já tentou crawlear (sic) qualquer coisa sob *.google.com/*, por exemplo, possivelmente deu de cara com algo assim:
Sabendo que seu IP será bloqueado em algum momento durante o scraping, muitos desenvolvedores já incorporam um “tempo de espera” razoável entre requisições e ajustam isso empiricamente. Em outros casos, o detentor dos dados fornecem uma API onde é possível acessá-los, normalmente através de um plano pago atrelado a um rate limit. Por exemplo, a API do twitter permite 180 requisições a cada 15 minutos.
Uma maneira eficaz de evitar uso de APIs e de ser blacklisted é trocar de IP regularmente através do uso de Proxy Services. Esse tipo de serviço fornece um IP novo a cada requisição (ou de tempos em tempos) evitando que você seja rastreado. Existem vários serviços deste tipo na Internet, disponíveis nos mais variados preços (até free). Os free, em geral, são muito ruins e os proxies disponíveis não funcionam.
Uma boa alternativa é a biblioteca do python LetMeCrawl que faz a curadoria de vários proxies disponíveis na web. A instalação pode ser feita via pip:
pip install letmecrawl
Utilizando a biblioteca requets é possível ver um exemplo simples de como a rotacao de IPs utilizando a biblioteca funciona:
A biblioteca sempre irá disponibilizar um endereço de proxy diferente garantindo que este será o melhor em termos de latência dentre todos os que estão em sua base naquele momento. A saída para o snippet acima será algo assim:
{"ip":"103.206.185.68","ip_decimal":1741601092,"country":"Bangladesh","country_iso":"BD"}{"ip":"62.210.105.103","ip_decimal":1053976935,"country":"France","country_iso":"FR","hostname":"62-210-105-103.rev.poneytelecom.eu"}{"ip":"35.172.196.191","ip_decimal":598525119,"country":"United States","country_iso":"US","city":"Ashburn","hostname":"ec2-35-172-196-191.compute-1.amazonaws.com"}...
Yeah! Cada response tem um IP diferente. LetMeCrawl está na versão 0.7 e ainda é um beta. Importante lembrar: nunca se deve transmitir dados sensíveis através de proxies desconhecidos.