Baixar o conteúdo de uma pagina WEB distante

Dezembro 2016



Introdução


Na biblioteca padrão, não existe função para baixar uma página web e, nem funções para se comunicar utilizando o protocolo HTTP.

Existem apenas duas maneiras:
  • Utilizar as funções de comunicação de baixo nível: os soquetes para reproduzir o diálogo HTTP.
  • Utilizar uma biblioteca capaz de fazer isso sozinha, permitindo que você se concentre no essencial.


A Libcurl é uma dessas livrarias que também suporta muitos outros protocolos como o ftp, o Idap, etc... Ela também é uma biblioteca livre e portátil (passa tanto no Windows quanto no Unix, por exemplo).

Instalação no Linux (Ubuntu/Debian)


Abra um shell e digite:
sudo apt-get install libcurl3 libcurl3-dev

Pronto, você instalou a biblioteca e seus arquivos de cabeçalho.

Instalação no Windows

Dev C++


Isso foi testado apenas com a versão 4.9.9.2.

Com o IDE gratuito Dev C++, a instalação é bem simples; assim, eu recomendo este software no nosso exemplo, ainda mais que ele é gratuito e livre.
Primeiro, vamos instalar a biblioteca zlib, da qual depende a libcurl, já que instalaremos a libcurl depois.

Abra então o Dev C++ e vá no menu Ferramentas/Novas Versões de Pacotes.
No menu dropdown intitulado "Select devpack server" no topo da janelinha de gestão de pacotes, selecione devpacks.org e clique no botão "Check for updates".


Nomes de biblioteca aparecerão, procure por "zlib" e selecione a versão mais recente.

Clique em "Download selected" e deixe-se guiar pelo instalador.



Em seguida, na mesma lista, procure a libcurl e verifique se a versão contém a menção "no_ssl", selecione-a e clique novamente em "Download Selected" e idem, deixe-se guiar.


Pronto, foi instalado!

Microsoft Visual C++


Explicação sobre a instalação com o Visual C++ (em inglês)

Explorar um pouco as funções do libcurl


Agora, olhemos de mais perto como utilizar esta biblioteca para baixar uma página web.
Alguns recursos úteis estão descritos aqui.

Vamos precisar das seguintes funções:
  • CURL *curl_easy_init( );
    Esta função é a primeira a ser chamada, ela inicializa a sessão e armazena em uma variável do tipo CURL * que é um tipo próprio da biblioteca, você não precisa se preocupar.
  • CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
    Esta função é a mais difícil de usar. É aqui que tudo acontece, de uma certa forma. O primeiro argumento é a sessão que você inicializou. A opção e o parâmetro formam um casal de dados que, por sua vez, forma uma direção conjunta. É nesse casal que você configura tudo: o URL, a função a ser utilizada para registrar o conteúdo baixado, o nome do arquivo, etc ... Por exemplo, para colocar o url da página a ser baixada, a opção será igual a CURLOPT_URL e o parâmetro será o url do tipo http://coisa.com. Vamos ver isso no exemplo. Mas lembre-se que o tipo de parâmetro depende muito da opção. Chamamos esta função tantas vezes quanto temos parâmetros a serem passados.
  • CURLcode curl_easy_perform(CURL * handle );
    Essa é a função mágica, ele executa o download.

Essa é uma função que não deve ser esquecida: ela libera os recursos utilizados durante a sessão que você inicializou.

Vamos pô-la em prática!

Um exemplo: baixar a página inicial do KIOSKEA


Precisamos baixar a página inicial do KIOSKEA.
Vamos salvar a pagina http://www.ccm.net no arquivo ./index_ccm.html
  • Arquivos de cabeçalho, obrigatórios para utilizar as funções e os tipos da libcurl e também para a gestão do nosso arquivo
    #include <curl/curl.h>
    #include <stdio.h>
    .
  • Inicialização da sessão CURL
    CURL *sessão = curl_easy_init(); //É, muito  fácil
    .
  • Especificamos que o url que nos interessa
    curl_easy_setopt(session, CURLOPT_URL, "http://www.ccm.net");
  • Especificamos o nome do nosso arquivo de destino que receberá o conteúdo da página
    FILE * fp = fopen("./index_ccm .html", "w"); //Criação do nosso arquivo
     curl_easy_setopt(sessão, CURLOPT_WRITEDATA, fp)//Nós equilibramos o nosso ponteiro de arquivo como destino
    .
  • Especificamos a função que vai gerar a gravação em nosso arquivo. Talvez você não esteja acostumado com isso, é preciso colocar um ponteiro de função no parâmetro curl_easy_setopt. Assim, o curl_easy_setopt usará esta função apontada para gravar nos arquivos. A função em questão deve respeitar o mesmo cabeçalho que a função padrão fwrite:
    size_t  fwrite(const  void  *ptr,  size_t  size,  size_t  nmemb,  FILE  *stream);
    . Você poderá criar uma função de gravação de sua escolha e colocá-la em parâmetro curl_easy_setopt, enquanto ela tiver o mesmo cabeçalho que o fwrite. Mas se você realmente não quiser se aporrinhar, utilize o fwrite já está pronto:
    curl_easy_setopt (sessão, CURLOPT_WRITEFUNCTION, fwrite)
    .
  • Acho que já fizemos o mais difícil, por assim dizer. Resta apenas iniciar o download
     curl_easy_perform (sessão);
  • Finalmente, liberamos nossos recursos utilizados

fclose(fp)
curl_easy_cleanup(sessão);

Nosso arquivo fonte


Veja o que dá o nosso exemplo:
#include <curl/curl.h>  
#include <stdio.h>  

int main(int argc, char **argv)  
{  
 CURL *sessão = curl_easy_init();   
 curl_easy_setopt(sessão, CURLOPT_URL, "http://www.ccm.net");  
 FILE * fp = fopen("./index_ccm .html", "w");   
 curl_easy_setopt(sessão,  CURLOPT_WRITEDATA, fp);   
 curl_easy_setopt(sessão,  CURLOPT_WRITEFUNCTION, fwrite);  
 curl_easy_perform(sessão);  
 fclose(fp);  
 curl_easy_cleanup(sessão);  
 return 0;  
}

Compilação com gcc (Unix/Linux)


Agora vamos compilá-lo. Vamos chamar nosso arquivo de ccm.c
Para compilar, é importante especificar que usamos a libcurl no editor de links, para que ele saiba onde encontrar as funções da libcurl. Então, vamos adicionar a opção -lcurl:
gcc ccm.c -o ccm -lcurl

Prontinho, agora é só executar a nossa aplicação:
./ccm

Compilação no Windows

Dev C++


Testado com a versão 4.9.9.2, como para a instalação.

Crie um novo projeto de aplicação em modo console.
Em seu main.c, cole o código do arquivo fonte da seção anterior. Agora, o nosso objetivo será o de indicar ao compilador e ao editor de links, as opções necessárias para a criação do nosso executável.
  • Compilar em modo estático. Vamos integrar o código da libcurl em nosso executável sem depender da dll da libcurl. Isto é chamado de compilaçãoio com a biblioteca estática. É menos problemático. Para isso, vamos compilar definindo a constante do macroprocessador CURL_STATICLIB.
  • Dependências de bibliotecas estáticas e dlls. Sim, realmente é preciso um monte de dll, como algumas do Windows, por exemplo. Vamos precisar da libcurl (obviamente), da dll de o gestão dos soquetes (Ws2_32.dll), da zlib (biblioteca de compressão de dados) e da winmm.dll.


Para definir tudo isso, vá em Ferramentas/Opções do compilador e adicione o seguinte comando para o compilador:
-DCURL_STATICLIB

e os seguintes comandos para o editor de links:
-lcurl -lWs2_32 -lz -lWinmm



Clique em OK e no ícone "Reconstruir tudo", e em princípio, e pronto.

Microsoft Visual C++


Explicação para compilar com o Visual C++ (mesmo documento que para a instalação) - em inglês

Notes


Esta biblioteca é, certamente, um pouco mágica, mas há limites:
  • Você só vai baixar a página especificada, os arquivos dos quais dependm a página não serão baixados (imagens, folhas de estilo, etc ...). Se você quiser todos os arquivos dos quais dependem uma página, você pode usar programas como o wget, por exemplo.
  • Você só terá o código fonte finalizado da página, você não terá o código fonte PHP de uma página web, por exemplo.

Complementos




Tradução feita por Lucia Maurity y Nouira

Veja também :
Este documento, intitulado « Baixar o conteúdo de uma pagina WEB distante »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.