Skip to content

Instantly share code, notes, and snippets.

@hmaesta
Last active October 23, 2019 17:56
Show Gist options
  • Save hmaesta/ce966cc377d3de2b0538251d0b36219c to your computer and use it in GitHub Desktop.
Save hmaesta/ce966cc377d3de2b0538251d0b36219c to your computer and use it in GitHub Desktop.

Demanda crawler iCarros

Acessar o iCarros e capturar os dados da "ficha técnica" de cada veículo.

Exemplo:

  1. Acessar https://www.icarros.com.br/catalogo/fichatecnica.jsp?modelo=214&anomodelo=2017&versao=26876
  2. Capturar e categorizar as informações da ficha técnica
  3. Continuar o crawler (...)

Dentro do site há um formulário (#versaoForm) que exibe todos os ids que vamos precisar pro crawler continuar vasculhando outras páginas:

<form id="versaoForm" action="/catalogo/fichatecnica.jsp" method="GET">
	<input type="hidden" name="modelo" value="214">
	<input type="hidden" name="anomodelo" value="2017">
	<select name="versao">
		<option value="26876">Palio Fire 1.0 8V (Flex) 4p</option>
		<option value="26884">Palio Fire Way 1.0 8V (Flex)</option>
		<option value="26393">Palio Attractive 1.0 Evo (Flex)</option>
		<option value="26394">Palio Attractive 1.4 Evo (Flex)</option>
		<option value="26395">Palio Essence 1.6 16V (Flex)</option>
		<option value="26396">Palio Sporting 1.6 16V (Flex)</option>
	</select>
	<button type="submit">Alterar versão</button>
</form>

Além disso, também facilitam a separação de marca, modelo e ano no h1:

<h1>
	<span class="makeName">Fiat</span>
	<span class="modelName">Palio</span>
	<span class="modelYear">2017</span>
</h1>

Como as mudanças no setor automotivo acontecem 1 ou 2 vezes por ano, não é necessário que o sistema capture tudo de uma vez. Até seria bom que ele rodasse "mais lento" pra não levantar flag lá no servidor deles. Talvez a melhor forma seria ir "de marca em marca", ao invés de tentar capturar o site inteiro de uma vez.

Indo na página inicial do Catálogo iCarros dá pra pegar todas as Marcas e Modelos disponíveis: https://www.icarros.com.br/catalogo/index.jsp

Por exemplo, Fiat é marca=14 e Palio é modelo=214

O resultado deve ser guardado de forma similar a:

{
	"marca": "Fiat",
	"modelo": "Palio",
	"ano": 2017,
	"versao": "Palio Fire 1.0 8V (Flex) 4p",
	"created_at": "2019-10-23 14:10",
	"last_update": "2019-10-23 14:10",
	"data": {
		"motor": "1.0",
		"transmissao": "manual de 5 marchas",
		"tracao": "dianteira",
		"direcao": "Mecânica",
		"suspensao_dianteira": "Suspensão tipo McPherson, roda tipo independente e molas helicoidal.",
		"suspensao_traseira": "Suspensão tipo eixo de torção e traseira com barra estabilizadora, roda tipo independente e molas helicoidal.",
		"freios": "Dois freios à disco com dois discos ventilados.",
		"combustivel": {
			"0": {
				"nome": "Álcool",
				"potencia": 75,
				"torque": 9.9,
				"velocidade_maxima": 157,
				"tempo_0-100": 15.2,
				"consumo": {
					"cidade": 8.7,
					"estrada": 10.4
				}
			},
			"1": {
				"nome": "Gasolina",
				"potencia": 73,
				"torque": 9.5,
				"velocidade_maxima": 156,
				"tempo_0-100": null,
				"consumo": {
					"cidade": 12.2,
					"estrada": 15.3
				}
			}
		},
		"dimensoes": {
			"altura": 1433,
			"largura": 1634,
			"comprimento": 3.827,
			"peso": 940,
			"tanque": 48,
			"entre-eixos": 2373,
			"porta-malas": 290,
			"ocupantes": 5
		}
	},
	"unidades": {
		"potencia": "cv",
		"torque": "kgf.m",
		"velocidade": "km/h",
		"tempo_0-100": "s",
		"consumo": "km/l",
		"alt-larg-comp": "mm",
		"tanque": "L",
		"entre-eixos": "mm",
		"porta-malas": "L"
	}
}

Observações:

  1. Provavelmente a parte relacionada aos combustíveis vai ser a mais chata, porque há diferentes dados para "álcool" e "gasolina". (Ah, e às vezes pode ser outro combustível, como "Híbrido/Elétrico")
  2. O iCarros traz os números com vírgulas, mas devemos transformar em números com pontos, conforme exemplo acima
  3. Quando o iCarros não tem a informação, exibem "N/D", devemos salvar como "null"
  4. No exemplo acima, omiti as outras tabelas ("Segurança", "Conforto", etc), pois todos os itens são apenas true/false. (Aliás, observar que quando é true eles mostram o ícone fa-check-circle e quando é false mostram fa-times-circle)
  5. O exemplo é um JSON só pra facilitar a visualização. Precisa ser guardado em banco de dados.

last_update

Caso o crawler passe mais de uma vez pela mesma página, ele deve verificar se já existe registro no banco de dados para aquele respectivo carro. Se já tiver registro, deve verificar o last_update. Se last_update for mais antigo do que 1 mês, deve ATUALIZAR as informações, caso estejam diferentes. Caso o last_update seja mais recente do que 1 mês, simplesmente ignora.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment