Para alcançar o objetivo deste artigo, que é aprender a utilizar o cURL com um proxy, precisamos primeiro de apresentar o cURL. O Client URL (cURL) é, em resumo, uma linha de comandos fácil de utilizar, concebida para que os programadores possam obter dados de um servidor.
O que é o cURL?
Como utilizar o cURL?
Como já mencionei acima, usar o cURL é bastante simples e permite extrair informações com apenas um comando de uma linha. Primeiro, é necessário abrir um terminal e digitar curl seguido de um link de um site, por exemplo:
$ curl 'https://www.webscrapingapi.com/'
Parabéns, fez o seu primeiro pedido utilizando o cURL. Este comando simples solicita informações ao servidor tal como um navegador tradicional faz e devolve o HTML da página. Nem todos os sites lhe devolverão HTML; existem pontos finais que devolvem dados como um objeto JSON. Veja este exemplo:
$ curl 'https://jsonplaceholder.typicode.com/todos/3'
Digite este comando no seu terminal e deverá receber esta resposta:
{
"userId": 1,
"id": 3,
"title": "fugiat veniam minus",
"completed": false
}A maioria das APIs devolve HTML ou JSON quando executa comandos cURL contra elas. Bem, isto não é tudo o que o cURL pode fazer por nós. Na realidade, é uma ferramenta muito sofisticada que requer muito tempo para ser dominada. Se quiser saber mais sobre o cURL, recomendo vivamente que consulte a documentação do cURL para compreender melhor os seus parâmetros. Em alternativa, pode executar o seguinte comando:
$ curl --help
Isto irá mostrar-lhe algumas opções que pode definir no cURL:
Usage: curl [options...] <url>
-d, --data <data> HTTP POST data
-f, --fail Fail silently (no output at all) on HTTP errors
-h, --help <category> Get help for commands
-i, --include Include protocol response headers in the output
-o, --output <file> Write to file instead of stdout
-O, --remote-name Write output to a file named as the remote file
-s, --silent Silent mode
-T, --upload-file <file> Transfer local FILE to destination
-u, --user <user:password> Server user and password
-A, --user-agent <name> Send User-Agent <name> to server
-v, --verbose Make the operation more talkative
-V, --version Show version number and quit
This is not the full help, this menu is stripped into categories.
Use "--help category" to get an overview of all categories.For all options use the manual or "--help all".
Como provavelmente pode ver, estas nem sequer são todas as opções que pode definir no cURL; trata-se de um menu dividido em categorias. Provavelmente já adivinhou que, para obter todas as opções que gostaria de executar:
$ curl --help all
No entanto, usar apenas o cURL tem algumas limitações no que diz respeito ao número de servidores que podemos escolher para obter dados. Por exemplo, alguns servidores podem usar geolocalização e recusar-se a fornecer-nos os dados que procuramos devido à nossa localização. É neste momento que precisamos de um proxy, que atua como um intermediário entre nós e o servidor de destino.
O que é um proxy?
O conceito de servidor proxy não é nada difícil de entender. Como já mencionado acima, um servidor proxy é como um intermediário entre um cliente que solicita um recurso e o servidor que fornece esse recurso. Os proxies são concebidos para nos permitir obter dados de qualquer lugar. Para compreender melhor este conceito, vamos supor que temos um servidor chamado Bob que possui alguns dados nos quais estamos interessados, mas o Bob fornece esses dados apenas se estivermos na Europa, enquanto nós estamos nos Estados Unidos.
Como lidamos com isso? Enviamos o nosso pedido a um servidor proxy localizado na Europa, e não ao Bob, e dizemos ao proxy que queremos obter alguns dados do Bob. O proxy enviará o pedido ao Bob e o Bob devolverá os dados ao servidor proxy, uma vez que o proxy está na Europa. Em seguida, o servidor proxy enviar-nos-á os dados do Bob.
Este é o fluxo principal de como os proxies funcionam. Outro excelente caso de utilização de um proxy é, por exemplo, quando queremos obter dados que contenham preços numa moeda específica, para evitar confusão. Para uma compreensão mais aprofundada dos proxies, recomendo vivamente que consulte a Wikipédia.
Configuração do proxy
Para utilizar um proxy, provavelmente irá precisar de um host, uma porta, um utilizador, uma palavra-passe e um URL de destino do qual pretende obter dados. Para este exemplo, irei utilizar um proxy fornecido pela WebScrapingAPI para efetuar pedidos; pode encontrar mais informações sobre o mesmo aqui. A WebScrapingAPI não é um fornecedor de proxies, mas sim um serviço de web scraping que fornece proxies. Nos nossos exemplos, a nossa configuração será a seguinte:
- Nome de host do proxy: proxy.webscrapingapi.com
- Porta do proxy: 80
- Nome de utilizador do proxy: webscrapingapi.proxy_type=datacenter.device=desktop
- Palavra-passe do proxy: <A SUA CHAVE DE API AQUI> // pode obter uma registando-se aqui
- URL de destino: http://httpbin.org/get
Tenha em atenção que alguns fornecedores de proxy podem exigir outro esquema de autenticação.
Como utilizar o cURL com um proxy?
Uma vez que já abordámos o cURL e os proxies, estamos agora prontos para os combinar e efetuar pedidos utilizando um proxy, o que é um processo bastante simples. Primeiro, precisamos de nos autenticar e, em seguida, podemos utilizar o proxy.
Autenticação de proxy no cURL
A autenticação de proxy no cURL é bastante simples e, no nosso exemplo acima, pode ser feita da seguinte forma:
$ curl -U webscrapingapi.proxy_type=datacenter.device=desktop:<YOUR-API-KEY> --proxy @proxy.webscrapingapi.com:80 http://httpbin.org/get
Ao executar esse comando, o httpbin irá devolver-nos o nosso endereço IP e algumas outras propriedades:
{
"args": {},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Host": "httpbin.org",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5173.0 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-633af93b-35faf8637f37f7f075f185ec"
},
"origin": "45.9.120.69",
"url": "http://httpbin.org/get"
}Como provavelmente já deve ter percebido, a origem que recebe não é o seu endereço IP, mas sim o endereço do servidor proxy. Além disso, pode executar o comando mesmo sem revelar a sua palavra-passe no terminal. Isto pode ser feito da seguinte forma:
$ curl -U webscrapingapi.proxy_type=datacenter.device=desktop --proxy @proxy.webscrapingapi.com:80 http://httpbin.org/get
E, em seguida, receberá um prompt para introduzir a sua palavra-passe:
Enter proxy password for user 'webscrapingapi.proxy_type=datacenter.device=desktop':
Agora pode digitar a sua chave API ali sem a expor no terminal, tornando todo o processo mais seguro. Além disso, digitar as suas credenciais, host e porta todas as vezes que quiser executar um comando cURL através de um proxy pode não parecer o ideal, especialmente quando pretende executar muitos comandos através de um proxy e está a utilizar o mesmo fornecedor de proxy.
Claro que pode guardar as suas credenciais num ficheiro separado no seu computador e copiá-las e colá-las sempre, mas existe uma abordagem mais natural que pode adotar, que consiste em passá-las através de variáveis de ambiente, sobre as quais falaremos abaixo.
Usar o cURL com um proxy através de variáveis de ambiente
Uma variável de ambiente é como um objeto que armazena um valor editável na memória, que pode ser utilizado por um ou mais programas. Neste caso específico, podemos passar para o cURL uma variável chamada http_proxy ou https_proxy que contenha os nossos detalhes de proxy, e não precisaremos de os especificar em cada execução do comando. Pode fazer isso executando este comando:
$ export http_proxy="http://webscrapingapi.proxy_type=datacenter.device=desktop:<YOUR-API-KEY>@proxy.webscrapingapi.com:80"
Tenha em atenção que deve chamar à sua variável http_proxy ou https_proxy para que o cURL compreenda do que se trata. É isso mesmo, agora já não precisa de passar as suas credenciais em cada execução e pode simplesmente executar o cURL desta forma tão simples:
$ curl http://httpbin.org/get
Isso irá dar-nos o seguinte resultado:
{
"args": {},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Host": "httpbin.org",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-633bf912-66ace1104304ddaf5ea8ac65"
},
"origin": "132.255.134.104",
"url": "http://httpbin.org/get"
}Como provavelmente pode ver, o endereço IP é o endereço do proxy, o que confirma que fez um excelente trabalho ao configurar o seu proxy. Nesta altura, podemos executar qualquer comando cURL sem especificar os detalhes do proxy; o cURL tratará disso por nós.
Desativar o proxy para um comando específico
No entanto, se precisar de enviar um pedido específico sem proxy, não precisa de se preocupar em eliminar o valor da variável http_proxy. Sendo uma ferramenta sofisticada com muitas opções, o cURL pode tratar disso por nós através do seu parâmetro proxy, que lhe diz para não utilizar qualquer proxy ao efetuar o pedido. Pode ser feito da seguinte forma:
$ curl --noproxy "*" http://httpbin.org/get
E isso irá devolver-nos o nosso endereço IP, e não o dos proxies.
Resumo
Em conclusão, utilizar o cURL com um proxy é uma excelente forma de contornar filtros de geolocalização, aumenta o número de recursos que podemos obter de servidores web e é um bom ponto de partida para se aprofundar em tópicos como o web scraping, onde precisamos de utilizar proxies para conseguir obter determinados dados ou recebê-los no formato que desejamos.Espero que este artigo tenha sido útil para aprender a utilizar o cURL com um proxy e que experimente com ele e crie os seus próprios scripts para extrair dados de servidores que utilizam filtros de geolocalização.




