Recentemente, aprendi que usar uma regex para analisar o HTML de um site e obter os dados necessários não é o melhor curso de ação.
Portanto, minha pergunta é simples: qual é a melhor / mais eficiente e uma maneira geralmente estável de obter esses dados?
Devo observar que:
- Não há APIs
- Não há outra fonte de onde eu possa obter os dados (sem bancos de dados, feeds e outros)
- Não há acesso aos arquivos de origem. (Dados de sites públicos)
- Digamos que os dados sejam texto normal, exibidos em uma tabela em uma página html
Atualmente, estou usando python para o meu projeto, mas uma solução independente de linguagem / dicas seria bom.
Como uma pergunta secundária: como você lidaria com isso quando a página da Web é construída por chamadas do Ajax?
EDITAR:
No caso da análise de HTML, eu sei que não há uma maneira estável e real de obter os dados. Assim que a página mudar, seu analisador estará pronto. O que quero dizer com estável neste caso é: uma maneira eficiente de analisar a página, que sempre me entrega os mesmos resultados (para o mesmo conjunto de dados obviamente), desde que a página não mude.
Respostas:
Bem, aqui estão meus 2 centavos:
Se não houver AJAX envolvido ou puder ser limpo com facilidade, 'corrija' o HTML para XHTML (usando HTMLTidy por exemplo), use XPath em vez de expressões regulares para extrair as informações.
Em uma página da web bem estruturada, as entidades de informação logicamente separadas estão em
<div>
s diferentes , ou em qualquer outra tag, o que significa que você poderá encontrar facilmente as informações corretas com uma simples expressão XPath. Isso é ótimo também porque você pode testá-lo, digamos, no console do Chrome ou no console do desenvolvedor do Firefox e verificar se funciona antes de escrever mesmo uma linha de outro código.Essa abordagem também possui uma relação sinal / ruído muito alta, pois geralmente as expressões para selecionar as informações relevantes são de uma linha. Eles também são muito mais fáceis de ler do que expressões regulares e são projetados para esse fim.
Se houver AJAX e JavaScript sério envolvido na página, incorpore um componente do navegador ao aplicativo e use seu DOM para acionar os eventos necessários e o XPath para extrair informações. Existem muitos bons componentes de navegador incorporáveis por aí, a maioria deles usando navegadores do mundo real, o que é uma coisa boa, pois uma página da Web pode estar incorreta (X) HTML, mas ainda é boa em todos os principais navegadores ( na verdade, a maioria das páginas fica assim).
fonte
Na minha experiência, usando o ambiente .NET, você pode aproveitar o HTML Agility Pack .
Se a página estiver formatada como XHTML, você também poderá usar um analisador XML normal. Há muito a oferecer para qualquer ambiente que você possa imaginar.
Para a pergunta paralela sobre o AJAX, você pode usar o código de rede HTTP comum para obter dados e analisá-los.
Novamente, se sua pilha AJAX retornar XML, você terá muitas opções. Se retornar JSON, considere uma biblioteca que permita mapear o fluxo para objetos digitados. No .NET, sugiro Newtonsoft.Json .
fonte
A análise de HTML não é uma tarefa completamente trivial, pois é necessário lidar com uma marcação possivelmente incorreta (tag soup). Durante os anos, os navegadores implementaram mais ou menos a mesma estratégia para lidar com erros, e esse algoritmo foi batizado na especificação HTML5 (sim, a especificação HTML5 especifica o que fazer com coisas que não são HTML5).
Existem bibliotecas para todas as principais linguagens analisarem HTML, por exemplo, esta .
De qualquer forma, o que você obterá não é estável em nenhum sentido. Cada vez que o formato da página é alterado, você precisa adaptar seu raspador.
fonte
Se chamadas ajax estiverem sendo feitas, é muito provável que seja uma URL POST ou GET com algumas variáveis.
Eu examinaria o JavaScript para descobrir quais são os terminais e parâmetros. Depois disso, é muito provável que os dados retornados sejam json / xml / texto simples ou talvez html parcial.
Depois de conhecer as informações acima, basta fazer uma solicitação GET ou POST para esse terminal e analisar os dados retornados.
fonte
HTTP_X_REQUESTED_WITH
éXMLHttpRequest
. Os bons também implementarão algum tipo de proteção XSRF para solicitações POST, portanto você precisará desse cookie mágico também. Fazer cócegas nos pontos de extremidade do AJAX não expostos deliberadamente por alguma API pública parece um pouco nojento para mim, e o seu raspador é propenso a quebrar se a saída (ou política de solicitação) mudar.Não há uma maneira estável ou melhor de fazer isso, as páginas da Web em HTML não foram criadas para serem manipuladas por computadores. É para usuários humanos, mas se você precisar, sugiro que use um navegador e algum javascript. No meu trabalho, participei de um projeto que precisava extrair algumas informações de um site de terceiros. O aplicativo foi desenvolvido como uma extensão do Chrome. A lógica do aplicativo é escrita usando javascript injetado no site após a conclusão do carregamento da página. Os dados extraídos são enviados para um banco de dados através de um servidor http. Não é a melhor abordagem, mas funciona. Ps: O proprietário do site nos autorizou a fazer isso.
fonte