Sejam bem vindos.
Esta é uma série de vídeos que mostra como coletar dados, com a devida autorização, de sites na web utilizando um servidor php. O exemplo utilizado coleta o último resultado da Mega Sena no site da Caixa Economica Federal. São utilizados alguns conceitos aplicados na engenharia de software para incentivar as boas práticas de desenvolvimento aos interessados.
As informações aqui apresentadas são para fins didáticos e não nos responsabilizamos pela sua má utilização, entendendo que cada usuário é responsável por seus atos perante a Lei.
No primeiro é mostrado o projeto a ser executado . No use case o ator é o servidor que acessa a pagina web indicada e coleta os dados para exibí-los ao usuário. O fluxograma inicia quando o servidor acessa o endereço web solicitado e coleta os dados existentes, caso encontre alguma dificuldade para executar a tarefa um log será mostrado contendo o respectivo erro finalizando o processo. Em caso de sucesso os dados coletados serão processados para a retirada da informação proposta, o resultado da mega sena, na sequência essa informação é mostrada ao usuário finalizando com sucesso o fluxo. Por se tratar de um exemplo didático simples, onde não são utilizadas as orientações a objetos nem a eventos não será mostrado o diagrama de classes como de costume em nossas séries.
Para facilitar um arquivo contendo todo o conteúdo aqui mostrado está disponível para donwload no artigo referente aos vídeos da série no blog CustomerSys, com o link na descrição.
No segundo é mostrado como criar os arquivos php que irão receber a estrutura de programação necessária para a execução do projeto aqui proposto.
Para que se possa efetivamente observar os resultados é necessário que se tenha um servidor devidamente instalado na sua máquina e que ele contenha o php. Caso isso não ocorra é necessário que se providencie a instalação. Outro ponto importante é o editor, existem vários muito bons e cada um é livre para escolher o que melhor lhe convier, o que está sendo utilizado para a criação deste projeto é o bluefish.
São necessários dois arquivos para acomodar a programação envolvida. O primeiro trata de receber a solicitação da informação, ou seja, o resultado propriamente dito e o segundo é onde são mantidas todas as funções necessárias para executar o processo.
A primeira ação é testar se o servidor está funcionando corretamente, para isso é feita a chamada do arquivo criado "coletaDadoSite.php" por meio de um browser onde é digitado o endereço. Se tudo estiver funcionando corretamente a mensagem "Servidor Ativo" deve aparecer na tela. A segunda ação é a inclusão do arquivo "funcoesColeta.php" por meio da função require(); Caso tudo esteja certo a mensagem "Funções Para Coletar Dados Ativadas" deverá ser adicionada na tela.
Feito isso, a estrutura necessária para a execução do projeto foi criada.
No terceiro vídeo é mostrado como configurar corretamente uma função php para que ela faça a coleta de dados em sites da web.
A primeira ação desta fase do projeto é a criação da função getPage($url); ela tem como parâmetro a variável $url e a sua correta configuração vai permitir retornar com todo o conteúdo html contido na página alvo. Logo em sequida é necessário a criação das variáveis $timeOut, $dir, $cookie_File e $ch, elas são necessárias para a correta configuração da função.
A biblioteca php responsável pela ação específica de coletar os dados é a curl, existem outras mas essa é a mais recomendada, essa biblioteca precisa estar instalada no php, caso não esteja é necessário configurar o arquivo php.ini. A primeira ação é inicializá-la por meio da variável $ch=curl_init($url); informando a url que é exigida no parâmetro e, naturalmente tudo que começa precisa terminar utilizando curl_close($ch); A partir daí é necessário a configuração de alguns elementos por meio de curl_setop(); conforme segue:
O primeiro é curl_setopt($ch, CURLOPT_FAILONERROR, true); Verdadeiro para falhar silenciosamente se o código HTTP retornado for maior ou igual a 400. O comportamento padrão é retornar a página normalmente, ignorando o código.
O segundo é curl_setopt($ch, CURLOPT_HEADER, 0); Verdadeiro para incluir o cabeçalho na saída.
O terceiro é curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); O nome do arquivo que contém os dados do cookie. O arquivo de cookie pode estar em formato Netscape, ou simplesmente cabeçalhos de estilo HTTP despejados em um arquivo. Se o nome for uma string vazia, nenhum cookie será carregado, mas o manuseio de cookie ainda estará ativado.
O quarto é curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); O nome de um arquivo para salvar todos os cookies internos quando o identificador é fechado, após uma chamada para curl_close.
O quinto é curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true ); Verdadeirp para seguir qualquer cabeçalho "Location:" que o servidor envia como parte do cabeçalho HTTP (observe que este elemento é recursivo, PHP seguirá como muitos cabeçalhos "Location:" que são enviados, a menos que CURLOPT_MAXREDIRS esteja definido).
O sexto é curl_setopt($ch, CURLOPT_ENCODING, "" ); O conteúdo do cabeçalho "Accept-Encoding:". Isto permite a descodificação da resposta. As codificações suportadas são "identity", "deflate", and "gzip". Se uma string vazia, "", for definida, um cabeçalho contendo todos os tipos de codificação suportados será enviado.
O sétimo é curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); Verdadeiro para retornar a transferência como uma seqüência de caracteres do valor de retorno de curl_exec () em vez de sair diretamente.
O oitavo é curl_setopt($ch, CURLOPT_AUTOREFERER, true ); Verdadeiro para definir automaticamente o Referer: campo em pedidos onde segue um Location: redirect.
O nono é curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout ); O número de segundos a aguardar ao tentar se conectar. Use 0 para aguardar indefinidamente.
O décimo é curl_setopt($ch, CURLOPT_TIMEOUT, $timeout ); O número máximo de segundos para permitir que as funções cURL sejam executadas.
O décimo primeiro é curl_setopt($ch, CURLOPT_MAXREDIRS, 10 ); A quantidade máxima de redirecionamentos de HTTP a seguir. Use essa opção ao lado de CURLOPT_FOLLOWLOCATION.
O último é curl_setopt($ch, CURLOPT_REFERER, 'http://www.loterias.caixa.gov.br'); O conteúdo do cabeçalho "Referer:" a ser usado em uma solicitação HTTP.
Essas são algumas das possibilidades de configuração, dentro da documentação oficial disponível no site do php, existem várias outras que podem e devem ser estudadas para serem aplicadas conforme a necessidade de cada projeto. Após terminadas as configurações é preciso executar as ações e manter a resposta em uma variável $pagina. Neste ponto é criado uma condição para que em caso de erro esse seja exibido, contemplando assim, um dos possíveis fluxos vistos no fluxograma do projeto. Em caso de sucesso o caminho feliz é utilizado e todo o conteúdo coletado é retornado.
No último vídeo é mostrado como trabalhar um conteúdo coletado no site da Caixa Econômica Federal, por meio da função getPage($url); construída anteriormente no projeto, para filtrar e apresentar na tela somente as informações relativas ao resultado da mega sena.
A primeira ação nesta fase de execução do projeto é a criação da variável $url contendo o endereço no qual se pretende coletar os dados, neste caso está sendo utilizado a landing page que contém o resultado da mega sena disponibilizado pela Caixa Economica Federal e de livre acesso, não sendo necessário nenhum tipo de autorização. Lembrando novamente a importância da autorização de acesso para conteúdos privados. Após o carregamento do endereço na variável $url é necessário a chamada da função getPage($url); passando-a como parâmetro o retorno será carregado na variável $pagina e posteriormente impresso na tela. Em caso positivo todo o conteúdo html do endereço solicitado é apresentado na tela, um detalhe interessante é que os links são mantidos e em caso de clique haverá o direcionamento. Também é importante ressaltar a operação hora com o servidor da Caixa, hora com o Localhost consultado a landing page da caixa.
O próximo passo é a identificação, dentro do código fonte da página, do trecho que apresenta as informações pertinentes ao resultado da mega sena. Neste ponto é muito importante o entendimento sobre strings pois, todo o conteúdo html foi carregado na variável página com tipo string sendo assim, serão utlilizados alguns recursos pertinentes. Primeiro para o mapeamento do trecho em seguida para capturá-lo. A partir de agora não será mais necessário a impressão da variável $pagina pois, será construída a função responsável para a captura do trecho contendo o resultado e que daqui para frente será chamado de subString. Após identificada a string inicial do trecho é necessário carregar essa informação em uma variável $stringInicial. Em seguida é preciso encontrar o final do trecho com todas as informações sobre o resultado da mega e carregá-lo em uma variável $stringFinal.
Agora todos os parâmetros necessários para a construção da função getResultado já estão disponíveis e o próximo passo é a criação dela solicitando os três parâmetros criados $pagina, $stringInicial, $stringFinal. Em seguida será feita a chamada da função getResultado que irá carregar a variável $resultado. É muito importante, para quem desenvolve, ir testando o código passo-a-passo para se certificar que está tudo certo, existem pequenos detalhes pertinente as linguagens que geralmente passam desapercebidos como uma aspa, um ponto vírgula, entre outros, nesse caso foi um sinal de igual que impediu o correto funcionamento da função. Se tudo correr bem será impresso na tela que a "Função Resultado Entrou" e é possível continuar com o desenvolvimento.
Agora serão criadas as variáveis responsáveis pelo mapeamento do trecho que contém o resultado e para isso é utilizada a função nativa do php strpos($pagina, $stringInicial); com ela é possível achar o ponto inicial do trecho e carregar uma variável com o tipo int $inicio. Haystack significa palheiro e Needle significa agulha, ou seja, procurando agulha em um palheiro. O parâmetro offset não será utilizado nesse projeto. Novamente, será utilizada a função nativa do pho strpos($pagina, $stringFinal); para mapear o final do trecho desejado. Na sequência é criada uma variável $comprimento para que nela seja carregado o tamanho da subString desejada por meio de uma subtração $fim-$inicio.
A partir de agora todos os parâmetros necessários para a captura da subString já estão disponíveis. Essa ação é possível por meio da função nativa php substr($pagina, $inicio, $comprimento); onde $pagina contém todo o conteúdo do endereço solicitado, $início é a posição inicial da subString em inteiro e $comprimento é o tamanho desejado da subString. Essa informação é carregada em uma variável $resultado que é retornada. Sendo assim a função getResultado está concluída. Como a chamada da função getResultado($pagina, $stringInicial, $stringFinal); já foi criada no arquivo "coletaDadoSite.php", o sistema está pronto para imprimir na tela somente as informações relativas ao resultado da mega sena, deixando todo o restante de lado.
Sendo assim, é possivel observar que a impressão inicia na $stringInicial e termina na $stringFinal. Naturalmente, é possível continuar a formatação desta saída de dados deixando-a com um visual mais amigável ficando isso a critério de cada um, o objetivo do projeto era a coleta do resultado da mega sena e esse foi concluído com sucesso.
Terminamos então, mais uma jornada em busca do conhecimento. Para você que nos acompanhou até aqui um Muito Obrigado!
Fica a dica, se gostou de um like e inscreva-se no canal para nos ajudar a continuar trabalhando. Até a próxima!