1
resposta

Dica stream via HTTP

Dica stream via HTTP

Depois da aula "Criando um filtro" do curso "PHP I/O: trabalhando com arquivos e streams" resolvi fazer algo semelhante ao web scraping. Realmente foi uma aula muito muito boa !!

O que é um web scraping ? Seria "raspar" a informação que me interessa de um determinado site.

O problema ! A receita federal disponibilizou em formato aberto dados referentes a CNPJ, esse dados são atualizados a cada 3 meses só que a url estava alterando a cada nova atualização, dificultando as atulizações.

A solução ? usar stream_filter_append do PHP para filtra o que não quero, web scraping. Deixando apenas uma lista de links para downloads ;-) Hooooooo

Problemas técnicos do PHP ;-(

Infelizmente o filesize NÃO funciona com http (testado com PHP 8.1.8) !! Sim isso mesmo não funciona. Nesse momento vc provalmente já clicou na documentação que fala que funciona com Wrapper HTTP e HTTPS.

Screenshot da documentação do filsize

Sem o filesize fica complicado usar o fread com stream_filter_append.

DIIIIICAAA !!! A solução POG foi usar o strlen com file_get_contents, pronto tudo funcionou !! ;-)

Abaixo o código funcionando !!

<?php

require_once 'filtroHref.class.php';

$url = 'https://www.gov.br/receitafederal/pt-br/assuntos/orientacao-tributaria/cadastros/consultas/dados-publicos-cnpj';
$conteudoTotal = file_get_contents($url);

//POG no PHP 8.1 filesize não funciona com Wrapper HTTP ou HTTPS
$tamanho = strlen($conteudoTotal);

$conteudo = fopen($url, "r");
stream_filter_register('alura.partes',filtroHref::class);
stream_filter_append($conteudo,'alura.partes');

echo fread($conteudo,$tamanho);
<?php

class filtroHref extends php_user_filter
{
    public $stream;
    public function onCreate(): bool
    {
        $this->stream = fopen( 'php://temp','w+');
        return $this->stream !== false;
    }
    public function filter($in, $out, &$consumed, bool $closing): int
    {
        $saida = '';
        while($bucket = stream_bucket_make_writeable($in)){
            $linhas = explode(PHP_EOL, $bucket->data); 
            foreach ($linhas as $linha) {
                if (stripos($linha, '.zip') !== false){
                    $saida .= "$linha" . PHP_EOL;
                }
            }
        }
        $bucketSaida = stream_bucket_new($this->stream, $saida);
        stream_bucket_append($out, $bucketSaida);
        return PSFS_PASS_ON;
    }
}

Momento propaganda !!

Se vc precisa consultar os dados de CNPJ de receita federal em parceria com várias pessoas do mundo software livre criei um web com PHP para realizar essa consulta. Mais informações no GitHub

https://github.com/bjverde/cnpjrfb

1 resposta

Olá, Reinaldo! Tudo bem?

Desculpa a demora por um retorno.

Fico feliz em saber que você está aproveitando o curso e encontrou uma solução interessante para o problema que estava enfrentando. Parabéns pela iniciativa de criar projetos paralelos ao curso!

Web scraping é realmente uma técnica útil para extrair informações de sites de forma automatizada. É ótimo saber que você conseguiu aplicar esse conceito ao lidar com os dados da Receita Federal.

Sobre o problema técnico que você mencionou, realmente o filesize não funciona com URLs HTTP no PHP 8.1.8. É importante estar ciente dessas limitações e buscar alternativas, como você fez ao utilizar o strlen em conjunto com o file_get_contents. Essa é uma solução criativa e eficaz!

Aproveito para destacar o seu projeto no GitHub para consulta de dados de CNPJ da Receita Federal. É muito legal ver pessoas contribuindo com o software livre e compartilhando soluções úteis. Tenho certeza de que muitas pessoas vão se beneficiar do seu trabalho!

Continue assim, explorando novos conceitos e encontrando soluções criativas para os desafios que surgem. Se tiver alguma dúvida ou precisar de ajuda, estou à disposição.

Um forte abraço e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software