All for Joomla All for Webmasters
Mineração de Dados Ruby

Udemy: minerando lista de cursos com Crawler em Ruby

O Udemy é uma dentre as principais plataformas de cursos online mais utilizadas atualmente. Particularmente é minha preferida pela usabilidade (tanto web quanto mobile), acesso vitalício e bons cursos pagos que ocasionalmente são oferecidos de graça. Recentemente, adicionei ao blog uma seção de cursos grátis, cuja primeira fonte foi o Udemy. Vou demonstrar nesse post a implementação para minerar a lista de cursos grátis da plataforma.

Em postagens anteriores, mostrei aplicações semelhantes em Ruby utilizando o Nokogiri e o Mechanize (lembrando que o Nokogiri é uma dependência do Mechanize). Para este caso, entretanto, essas bibliotecas de navegação não se mostraram eficazes, retornando muitos erros de Bad Request (400). Precisei então escovar alguns bits: analisar as requisições HTTP no console do navegador, inspecionar cookies e cabeçalhos e reproduzir o processo pelas bibliotecas. Ainda assim, as requisições continuaram com retorno de erro.

Em testes, reproduzi no console do Linux a requisição através do curl (os consoles dos navegadores tem uma opção para transformar a requisição em um comando do curl, clicando com o botão direito na requisição desejada). O resultado retornado foi o esperado: uma lista de cursos em format JSON. Decidi então utilizar a biblioteca HTTP padrão do Ruby para reproduzir a requisição feita no curl (existe um serviço online que faz a conversão da linha de comando curl para o código em ruby). Vou explicar a seguir o código desenvolvido:

O CÓDIGO-FONTE

Explicando os pontos mais importantes que merecem atenção no código:

  • A URL passada como parâmetro na função foi obtida através da inspeção do fluxo de navegação no console do navegador (é altamente recomendável fazer esse acompanhamento para melhor entendimento dos protocolos HTTP). Na URL, que se refere ao canal de cursos em TI (cujo é o foco da página), acompanham os parâmetros de preço (apenas cursos grátis), idioma do curso (inglês e português do Brasil) e a página da lista (iniciada por padrão como a primeira – zero).
  • O código inicial, até o momento da obtenção da resposta (linha 27) é resultado da conversão da requisição feita à página para o código em Ruby na sua biblioteca HTTP padrão.
  • Como a resposta da requisição é um JSON, foi utilizada a biblioteca padrão de mesmo nome do Ruby para fazer o parsing para uma variável local, possibilitando acessar os seus atributos como um hash.
  • Em minha aplicação, utilizei uma variável de instância “@cursos” para armazenar todos os resultados obtidos, extraindo do hash somente as informações de meu interesse (linhas 34-50).
  • As respostas das requisições são paginadas, o que quer dizer que não é possível obter toda a lista de uma só vez, sendo necessário navegar página a página para obter todos os cursos. O link da página seguinte é um dos atributos retornados na resposta, auxiliando essa navegação. A função de extração dos dados é chamada enquanto houver uma página seguinte a ser extraída.

Neste post procurei manter a implementação curta e direta para facilitar o entendimento. Na aplicação real (a página do blog), existe um trabalho adicional para persistir a lista no banco de dados para ser exibida posteriormente. O processo descrito aqui pode ser estendido para a obtenção de objetos em demais plataformas que permitam a pesquisa/filtro de elementos. Quaisquer dúvidas ou sugestões, utilize os comentários ou entre em contato!

Você Também Pode Gostar

1 Comentário

  • Responder
    Sannytet
    12 de dezembro de 2018 at 04:31

    Nice posts! 🙂
    ___
    Sanny

  • Deixe uma resposta para Sannytet Cancelar Resposta