Pergunta

Por favor, informe como raspar páginas AJAX.

Foi útil?

Solução

Resumo:

Todos tela raspagem primeiro requer revisão manual da página que você deseja extrair recursos. Ao lidar com AJAX você normalmente só precisa analisar um pouco mais do que simplesmente o HTML.

Ao lidar com AJAX Isto apenas significa que o valor desejado não estiver no documento HTML inicial que você pediu, mas que javascript será exectued que pede o servidor para a informação extra que você deseja.

Você pode, portanto, geralmente simplesmente analisar o javascript e ver qual solicitar os javascript marcas e apenas chamar este URL em vez desde o início.


Exemplo:

Leve isso como um exemplo, suponha que a página que você quer raspar de tem o seguinte script:

<script type="text/javascript">
function ajaxFunction()
{
var xmlHttp;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    try
      {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    catch (e)
      {
      alert("Your browser does not support AJAX!");
      return false;
      }
    }
  }
  xmlHttp.onreadystatechange=function()
    {
    if(xmlHttp.readyState==4)
      {
      document.myForm.time.value=xmlHttp.responseText;
      }
    }
  xmlHttp.open("GET","time.asp",true);
  xmlHttp.send(null);
  }
</script>

Então tudo que você precisa fazer é, em vez fazer uma solicitação HTTP para time.asp do mesmo servidor em vez. Exemplo de w3schools .


avançada raspagem com C ++:

Para o uso complexo, e se você estiver usando C ++, você também pode considerar o uso do motor de javascript firefox SpiderMonkey para executar o javascript em uma página.

Avançado raspagem com Java:

Para o uso complexo, e se você estiver usando Java você também pode considerar o uso do motor de javascript firefox para Java Rhino

Avançado raspagem com NET:

Para o uso complexo, e se você estiver usando .Net você também pode considerar o uso do Microsoft.vsa montagem. Recentemente substituído com ICodeCompiler / CodeDOM.

Outras dicas

Na minha opinião a solução simpliest é usar Casperjs , um quadro com base nos PhantomJS navegador WebKit sem cabeça.

A página inteira é carregada, e é muito fácil de raspar todos os dados relacionados com o Ajax. Você pode verificar este tutorial básico para aprender Automatizando & Raspagem com PhantomJS e CasperJS

Você também pode dar uma olhada neste código de exemplo, sobre como google raspar sugere palavras-chave:

/*global casper:true*/
var casper = require('casper').create();
var suggestions = [];
var word = casper.cli.get(0);

if (!word) {
    casper.echo('please provide a word').exit(1);
}

casper.start('http://www.google.com/', function() {
    this.sendKeys('input[name=q]', word);
});

casper.waitFor(function() {
  return this.fetchText('.gsq_a table span').indexOf(word) === 0
}, function() {
  suggestions = this.evaluate(function() {
      var nodes = document.querySelectorAll('.gsq_a table span');
      return [].map.call(nodes, function(node){
          return node.textContent;
      });
  });
});

casper.run(function() {
  this.echo(suggestions.join('\n')).exit();
});

Se você pode obter para ele, tentar examinar a árvore DOM. selênio faz isso como parte do teste de uma página. Ele também tem funções para clicar botões e seguir links, que podem ser úteis.

A melhor maneira de páginas web raspar usando Ajax ou em páginas gerais usando Javascript é com ele mesmo um navegador ou um navegador sem cabeça (um navegador sem GUI). Atualmente PhantomJS é um navegador sem cabeçalho bem promovido usando WebKit. Uma alternativa que eu usei com sucesso é HtmlUnit (em Java ou .NET através de IKVM , que é um navegador simulado. Outra alternativa conhecida é usar uma ferramenta de automação de web como Selenium .

Eu escrevi muitos artigos sobre este assunto como href="http://blog.databigbang.com/web-scraping-ajax-and-javascript-sites/" raspagem Ajax e Javascript Sites e autenticação OAuth browserless automatizado para Twitter . No final do primeiro artigo, há uma série de recursos extras que tenho vindo a compilar desde 2011.

Depende da página ajax. A primeira parte do screen scraping é determinar como a página funciona. Existe algum tipo de variável que você pode iterar para solicitar todos os dados da página? Pessoalmente eu usei Web Scraper Além disso para um monte de tela raspagem tarefas relacionadas porque é barato, não é difícil para começar, não-programadores podem fazê-lo funcionar de forma relativamente rápida.

Nota lateral: Termos de Uso é, provavelmente, em algum lugar que você pode querer verificar antes de fazer isso. Dependendo da iteração site através de tudo o que pode levantar algumas bandeiras.

Gosto PhearJS , mas que pode ser parcialmente porque eu construí-lo.

Dito isto, é um serviço é executado em segundo plano que fala HTTP (S) e renderiza páginas como JSON para você, incluindo quaisquer metadados que você pode precisar.

Como uma solução de baixo custo que você pode também tentar SWExplorerAutomation (SWEA). O programa cria uma API de automação para qualquer aplicação Web desenvolvida com HTML, DHTML ou AJAX.

Eu acho que a resposta de Brian R. Bondy é útil quando o código-fonte é fácil de ler. Eu prefiro uma maneira fácil usando ferramentas como o Wireshark ou HttpAnalyzer para capturar o pacote e obter a URL do campo "Host" e "GET" campo.

Por exemplo, eu capturar um pacote como o seguinte:

GET /hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330 
 HTTP/1.1
Accept: */*
Referer: http://quote.hexun.com/stock/default.aspx
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: quote.tool.hexun.com
Connection: Keep-Alive

Em seguida, a URL é:

http://quote.tool.hexun.com/hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330

O selênio WebDriver é uma boa solução: você programa um navegador e você automatizar o que precisa ser feito no navegador. Navegadores (Chrome, Firefox, etc) fornecer os seus próprios motoristas que trabalham com selênio. Uma vez que funciona como um navegador real automatizado , as páginas (incluindo JavaScript e Ajax) são carregados como fazem com um ser humano usando esse navegador.

A desvantagem é que ele é lento (desde que você seria mais provavelmente, como esperar por todas as imagens e scripts para carga antes de fazer a sua raspagem nessa única página).

Já anteriormente ligado ao solvente e EnvJS do MIT como minhas respostas para raspar páginas Ajax. Estes projectos parecem não acessível.

Por pura necessidade, eu inventei uma outra maneira de realmente raspar páginas Ajax, e ele tem trabalhado para locais difíceis como findthecompany que têm métodos para encontrar mecanismos JavaScript sem cabeça e não apresentam dados.

A técnica é usar o Chrome extensões para fazer raspagem. Chrome extensões são o melhor lugar para raspar páginas Ajax porque eles realmente permitir-nos o acesso a javascript modificado DOM. A técnica é a seguinte, eu certamente open source o código em algum momento. Criar uma extensão do Chrome (supondo que você sabe como criar um, e sua arquitetura e capacidades. Isso é fácil de aprender e praticar como existem muitas amostras),

  1. Usar scripts de conteúdo para acessar o DOM, usando XPath. Praticamente obter a lista ou tabela inteira ou apresentados dinamicamente conteúdo utilizando XPath em uma variável como cordas Nodes HTML. (Somente scripts de conteúdo pode acessar DOM, mas eles não podem entrar em contato com uma URL usando XMLHTTP)
  2. A partir script de conteúdo, usando a passagem de mensagens, a mensagem inteira despojado DOM como corda, para um script de fundo. (Scripts de fundo podem falar com URLs, mas não pode tocar o DOM). Nós usamos a passagem de mensagens para obter estes para falar.
  3. Você pode usar vários eventos para loop através de páginas da web e passar cada conteúdo HTML Nó despojado para o script de fundo.
  4. Agora use o script de fundo, para conversar com um servidor externo (em localhost), um simples criado usando NodeJS / python. Basta enviar todo o HTML Nodes como corda, para o servidor, onde o servidor só iria persistir o conteúdo postado a ele, em arquivos, com variáveis ??adequadas para identificar números de página ou URLs.
  5. conteúdo AJAX Agora você ter raspado (HTML Nodes como string), mas estes são os nós html parciais. Agora você pode usar sua biblioteca XPATH favorito para carregá-los na memória e uso XPath para informações arranhão em tabelas ou texto.

Por favor, comente se você não pode entender e eu posso escrever melhor. ( primeira tentativa ). Além disso, estou tentando liberar código de exemplo, o mais rapidamente possível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top