rafaelgou / fipe-crawler

FIPE Crawler - Script que realiza download dos dados da Tabela FIPE Preço Médio de Veículos.
Other
72 stars 32 forks source link

Não importa veículos Álcool #7

Closed MauricioEstudier closed 1 year ago

MauricioEstudier commented 4 years ago

Bom dia! O script funcionou perfeito, mas após gravar no banco, percebi que não registrou nenhum veículo à álcool, ou melhor, sobrescreve o álcool com o valor do gasolina. Percebi que nestes cenários, o fipe_cod e anomod não idênticos para veículos com versões álcool e gasolina. Consulta exemplo: Modelo: "Monza GLS/ Hi-Tech 2.0 EFI 2p e 4p" fipe_cod: 004050-9 anomod: 1996 Este exemplo possui versão Álcool e Gasolina, com preços de tabela distintos, R$ 7.964,00 e R$ 8.555,00, respectivamente. Outro ponto, não relacionado ao funcionamento, mas à informação: ao final da execução, o report de HHMMSS está apresentando valores muito maiores que a execução real. Para carro, importei 202004 em cerca de 20/25min, no report apareceu mais de 18horas.

Parabéns pelo trabalho!

rafaelgou commented 4 years ago

Olá, @MauricioEstudier , grato pelo feedback. Você conseguiria listar alguns casos de inconsistências e postar aqui? Comecei e devo continuar em breve um completo refactoring da ferramenta para facilitar o uso em outros projetos. Ter casos de falhas me ajuda a escrever testes melhores.

Grato!

MauricioEstudier commented 4 years ago

Até o momento identifiquei apenas a "não persistência" dos veículos à álcool. Acredito que os registros comb=Álcool estejam sendo sobrescritos pelo par fipe_cod + anomod.

Ainda estou me familiarizando com o código para gerar uma alternativa de chave fipe_cod + anomod + comb.

Sobre o report final de tempo de execução, vou hoje fazer uma nova coleta e temporizar a parte, para ter a real relação.

rafaelgou commented 4 years ago

Esta função precisa ser revisada (a duração vem do stopwatch):

https://github.com/rafaelgou/fipe-crawler/blob/master/src/Fipe/Command/ExtrairVeiculoCommand.php#L137

MauricioEstudier commented 4 years ago

Olá @rafaelgou . Consegui alterar o stopwatch e reportou ok. Segundo a referência do Symfony, o stopwatch conta em milisegundos. Coloquei uma divisão em cada conversão e o report retornou o tempo correto.

    public function seconds2human($seconds )
    {
        $s = ($seconds / 1000) % 60;
        $m = floor((($seconds / 1000) % 3600) / 60);
        $h = floor((($seconds / 1000) % 86400) / 3600);

        return "{$h}h{$m}m{$s}s";
    }

Quanto a inserção dos carros à Álcool, alterei a sintaxe do database para testar, estou rodando agora... https://github.com/rafaelgou/fipe-crawler/blob/master/src/Fipe/Database.php#L203

    public function saveAnoModelos(array $anoMods, $tabelaId, $marcaId, $modeloId, $combCod) //incluído combCod como chave.
    {
        $results = array();

        $sql = "INSERT INTO anomod (modelo_id, desc, anomod_cod, ano, comb, comb_cod) "."VALUES (:modelo_id, :desc, :anomod_cod, :ano, :comb, :comb_cod);";
        $stmt = $this->conn->prepare($sql, array(\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY));

        //$sqlRef = "INSERT INTO ref_tab_mar_mod_ano (tabela_id, marca_id, modelo_id, anomod_id) "."VALUES (:tabela_id, :marca_id, :modelo_id, :anomod_id);";
        $sqlRef = "INSERT INTO ref_tab_mar_mod_ano (tabela_id, marca_id, modelo_id, anomod_id, comb_cod) "."VALUES (:tabela_id, :marca_id, :modelo_id, :anomod_id, :comb_cod);";
MauricioEstudier commented 4 years ago

Com esta alteração, consegui extrair veículos à Álcool, mas apenas em anoMod exclusivo. Se em determinado AnoMod há Gasolina e Álcool, grava em banco apenas o Gasolina.

Não consegui identificar o método que armazena os modelos para incluir a diferenciação entre Gasolina e Álcool para o mesmo ano, de forma que crie dois objetos de coleta independentes.

Dois códigos Fipe que constatei isso: 004050-9 Monza GLS/ Hi-Tech 2.0 EFI 2p e 4p (apenas anoMod 1997 puxou Álcool) 005150-0 Gol 1.0 Plus 8v 2p (apenas anoMod 2004 puxou Álcool) image

image

MauricioEstudier commented 4 years ago

image image

Apesar do script varrer todos, ficam pendentes para gravar no banco 409 veículos, justamente os que possuem variações de Álcool e Gasolina para o mesmo AnoMod.

rafaelgou commented 1 year ago

Muitos anos depois... Acredito que o problema seja o índice único da tabela, solucionável com:

ALTER TABLE `veiculo`
ADD UNIQUE `fipe_cod_anomod_comb_cod` (`fipe_cod`, `anomod`, `comb_cod`),
DROP INDEX `fipe_cod_anomod`;