Obtendo dados de uma página da Web de maneira estável e eficiente


11

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.


8
Não existe uma maneira estável, não importa como você implemente sua raspagem, ela pode ser facilmente quebrada com uma simples alteração da página da web. A maneira estável de obter seus dados é entrar em contato com os autores e intermediar um acordo para você obter os dados em um formato saudável. Às vezes isso nem custa dinheiro.
Joachim Sauer

1
@JoachimSauer - A pergunta ainda pode ser respondida com o método 'melhor'.
Anônimo

Como a maioria dos sites é dinâmica e armazena seus dados em bancos de dados, a melhor maneira é obter o banco de dados no site. Se o site tiver uma API, você poderá usá-lo. Caso você queira raspar as páginas estáticas, os módulos urllib e HTMLParser internos do Python funcionam bem. Alguns pacotes para copiar HTML também estão disponíveis no PyPi.
Ubermensch

A raspagem de sites é uma atividade skeezy. Não existe realmente uma maneira estável de fazer isso, porque os proprietários do site não querem que você faça isso, e o setor como um todo está tentando impedir que as pessoas o façam.
9118 Steven Evers

1
Talvez incorpore um navegador da Web como o Webkit e use o script DOM para obter informações da página renderizada? Quase todas as plataformas podem fazer isso, mas aqui está como você pode fazê-lo em Qt: doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
user16764

Respostas:


2

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).


Obrigado, certamente darei uma olhada no XPath um pouco mais. Não estou acostumado a trabalhar com isso, então será uma coisa agradável de aprender. +1 :)
Mike

5

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 .


E por 'código de rede HTTP' você quer dizer capturar a resposta do servidor quando uma solicitação é feita? Obrigado pelas sugestões, procurarei nelas. +1
Mike

Exatamente. No .NET, você pode usar System.Net.WebClient ou uma biblioteca como RestSharp | restsharp.org . Eu também usei no Mono para Droid.
precisa saber é o seguinte

4

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.


Obrigado, tenho usado a Beautiful Soup para fazer o trabalho. Sei que não será estável, provavelmente devo esclarecer isso nas minhas perguntas. +1 para você :)
Mike

4

Como uma pergunta secundária: como você lidaria com isso quando a página da Web é construída por chamadas do Ajax?

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.


2
Vale notar que muitos serviços inspecionar a cabeçalhos HTTP para garantir 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.
Tim Post

@ TimPost, você está 100% correto. Concordo sua "nojenta", na verdade :) mas na ausência de qualquer API pública, precisa deve ..
Darknight

Eu poderia usar isso no meu próprio aplicativo AJAX (e por 'próprio' não quero dizer que o escrevi, mas a configuração é minha), mas não seria adequado tentar ignorar o sistema de outro servidor, por isso devo concordar com @ TimPost, parece meio 'nojento'. É uma boa ideia, no entanto, obrigado! +1!
7763 Mike

1

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.


Eu sei que as páginas HTML não deveriam ser analisadas pelos computadores, mas às vezes simplesmente não há outra opção. Além disso, estou usando informações publicamente disponíveis para um projeto pessoal que não é comercial de forma alguma. Acho que não preciso de autorização explícita, preciso? Obrigado pela sua contribuição! +1 para você também;)
Mike

@MikeHeremans Para saber se você está autorizado a obter informações de um site, leia os ToS e o robots.txt. Se os dois não negarem o direito de raspar as informações automaticamente, você provavelmente estará bem na maioria dos casos legalmente. Claro, IANAL ...
K.Steff

Se você deseja ver o código do projeto mencionado: code.google.com/p/acao-toolkit/source/browse/… . Verifique o content_script.js, é o código que é injetado na página.
nohros
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.