Voltar ao blogue
Guias
Raluca Penciuc3 de fevereiro de 20236 min de leitura

Domine o Web Scraping: Como alternar proxies em Python

Domine o Web Scraping: Como alternar proxies em Python

Configurar o ambiente

Antes de começarmos, vamos certificar-nos de que temos todas as ferramentas necessárias à mão. Primeiro, descarregue e instale a versão mais recente do Python a partir do site oficial.

Para este tutorial, vamos utilizar o Visual Studio Code como nosso Ambiente de Desenvolvimento Integrado (IDE), mas pode utilizar qualquer outro IDE à sua escolha. Crie uma nova pasta para o seu projeto e um novo ficheiro index.py, onde iremos escrever o nosso código.

Agora abra o terminal e execute o seguinte comando para instalar o pacote necessário para enviar pedidos:

pip install requests

E é tudo! Podemos começar a programar.

Proxificar um pedido GET

Vamos começar por enviar um pedido GET simples. No ficheiro index.py recém-criado, escreva o seguinte código:

import requests

response = requests.get('https://api.ipify.org/?format=json')

print(response.text)

E agora execute o script utilizando o seguinte comando:

py index.py

Vais reparar que o resultado é o teu endereço IP real e que, independentemente do número de vezes que executares o script, este apresentará sempre o mesmo resultado.

O objetivo deste guia é mostrar-lhe como pode ocultar o seu endereço IP real e como obter um endereço IP diferente sempre que executar o script. É aqui que os proxies entram em cena. Encontrá-los-á na seguinte estrutura:

http://proxy_username:proxy_password@proxy_host:proxy_port

O protocolo pode ser«http»,«https»,«socks4»ou«socks5», enquanto«proxy_username»e«proxy_password»são opcionais.

O código atualizado deve ficar assim:

import requests

proxy_schema = {

    "http": "http://proxy_username:proxy_password@proxy_host:proxy_port",

    "https": "https://proxy_username:proxy_password@proxy_host:proxy_port"

}

URL = 'https://api.ipify.org/?format=json'

response = requests.get(URL, proxies=proxy_schema)

print(response.text)

Pode substituir o modelo de proxy por um proxy real, fornecido por um serviço de proxy gratuito, apenas para efeitos de teste. Vale a pena referir, no entanto, que estes não são fiáveis e devem ser utilizados apenas para fins de teste.

De qualquer forma, tendo em conta que mesmo os melhores proxies podem, por vezes, ser instáveis, é recomendável tratar as exceções no nosso código:

try:

    URL = 'https://api.ipify.org/?format=json'

    response = requests.get(URL, proxies=proxy_schema, timeout=30)

    print(response.text)

except:

    print('Não foi possível ligar ao proxy')

Se conseguiu encontrar um proxy gratuito que funcione, depois de executar o código deverá notar que o resultado mudou, uma vez que já não é o seu endereço IP real.

Alternar os proxies

Vamos agora ver como podemos utilizar vários proxies para tornar as nossas solicitações anónimas. Ao mesmo tempo, iremos gerir a velocidade do nosso script. Enviaremos as solicitações de forma assíncrona, utilizando a biblioteca «concurrent.futures».

Primeiro, vamos supor que temos a seguinte lista de proxies (ou conjunto de proxies):

proxy_pool = [

    "http://191.5.0.79:53281",

    "http://202.166.202.29:58794",

    "http://51.210.106.217:443",

    "http://5103.240.161.109:6666"

]

Isto pode ser definido diretamente no código ou lido a partir de um ficheiro, à sua escolha. Com isto, podemos escrever o seguinte código:

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=8) as pool:

    for response in list(pool.map(scrape_job, proxy_pool)):

        pass

Inicializamos um conjunto de threads com um máximo de 8 workers, para executar a função«scrape_job»(a ser definida em breve), que receberá como parâmetro um elemento da lista«proxy_pool».

Agora, a função «scrape_job» representará o código que escrevemos anteriormente, com um pequeno ajuste:

def scrape_job(proxy):

    try:

        URL = 'https://api.ipify.org/?format=json'

        proxy_scheme = {

            "http": proxy,

        	"https": proxy

    	  }

    	  response = requests.get(URL, proxies=proxy_scheme, timeout=30)

    	  print(response.text)

    except:

        print('Unable to connect to the proxy')

A variável«proxy_scheme»será agora atribuída dinamicamente, de acordo com o proxy que enviarmos como parâmetro. O script pode ser alargado para vários URLs, com um valor de tempo limite específico para cada um.

Ao executar o script, devem ser enviadas várias solicitações GET em simultâneo, cujo resultado serão diferentes endereços IP (se os proxies gratuitos estiverem a funcionar).

Aumentar a escala

Quando se trata de começar a alternar proxies, existem algumas práticas recomendadas essenciais que podem ajudar a garantir que a rotação de proxies seja o mais eficaz possível. Aqui ficam algumas dicas a ter em conta:

Os proxies gratuitos são uma má ideia

Embora os serviços de proxy gratuitos possam parecer uma opção económica, muitas vezes não são fiáveis e podem até pôr em risco os seus esforços de scraping. Considere investir num serviço de proxy premium que ofereça um nível mais elevado de segurança e fiabilidade.

Teste antes de raspar

Antes de começar a extrair dados, é aconselhável testar a rotação de proxies para se certificar de que está a funcionar como previsto. Isto irá ajudá-lo a identificar e resolver quaisquer problemas antes que estes causem complicações mais à frente.

Utilizar a rotação do user-agent

A rotação do endereço IP é uma forma eficaz de contornar as medidas anti-scraping, mas não é a única técnica em que deve confiar. Combinar a rotação de IP com a rotação do user-agent, que altera a assinatura do navegador, pode tornar ainda mais difícil para os sites detetarem e bloquearem o seu scraper.

Serviços de proxy premium

Nem todos os serviços de proxy são iguais, por isso é importante pesquisar bem e escolher um fornecedor que ofereça um elevado nível de segurança e fiabilidade. Procure um serviço que ofereça uma vasta gama de endereços IP e localizações, bem como funcionalidades como a rotação automática de IP e a navegação anónima.

Utilize uma API de web scraping

Utilizar uma API de web scraping pode ser uma excelente forma de simplificar o processo de rotação de proxies, especialmente se for novo no mundo do web scraping. Uma boa API de scraping irá gerir a rotação de proxies por si e proporcionar-lhe uma interface intuitiva e fácil de utilizar para aceder aos dados de que necessita.

O seu mecanismo de rotação de proxies evita completamente os bloqueios, e a sua base de conhecimento alargada permite aleatorizar os dados do navegador, de modo a que pareça um utilizador real.

No entanto, se preferir continuar a utilizar o seu próprio scraper, ou se o seu caso de utilização for demasiado complexo, também tem a opção de aceder à API através de um proxy. O pedido será simplesmente redirecionado para a API, enquanto o seu script beneficia da rotação de proxies.

Conclusão

Em resumo, saber como alternar proxies é uma técnica essencial para a extração de dados da Web, e o Python facilita a sua implementação. Ao seguir os passos descritos neste guia, adquiriu conhecimentos que vão desde a utilização de um proxy numa única solicitação até à forma de acelerar o processo de alternância de proxies.

Além disso, descobriu algumas dicas adicionais sobre a rotação de proxies no que diz respeito ao aumento da escala do seu projeto.

Lembre-se de que uma rotação eficaz de proxies pode aumentar significativamente o sucesso dos seus projetos de web scraping, e este guia forneceu-lhe as ferramentas e os conhecimentos necessários para o fazer como um profissional. Boa sorte com o scraping!

Sobre o autor
Raluca Penciuc, Desenvolvedora Full-Stack na WebScrapingAPI
Raluca PenciucDesenvolvedor Full-Stack

Raluca Penciuc é programadora Full Stack na WebScrapingAPI, onde desenvolve scrapers, aperfeiçoa estratégias de evasão e procura formas fiáveis de reduzir a deteção nos sites-alvo.

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.