Como se raspa no ecrã? [fechado]

quando não existe uma API webservice disponível, a sua única opção pode ser filtrar o Scrape, mas como é que o faz em c#?

Como pensas fazê-lo?

Author: Seth Petry-Johnson, 2010-03-11

6 answers

As respostas do Matt e do Paul estão correctas. "Raspagem de tela" ao analisar o HTML de um site é geralmente uma má idéia porque:
  1. Processar HTML pode ser difícil , especialmente se for malformado. Se você está raspando uma página muito, muito simples, então expressões regulares podem funcionar. Caso contrário, use um framework de análise como o pacote de agilidade HTML.

  2. Os Websites são um alvo em movimento . Você terá que atualizar seu código cada vez que o site de origem muda a estrutura de marcação.

  3. Raspagem de tela não funciona bem com Javascript . Se o site alvo está usando qualquer tipo de script dinâmico para manipular a página web você vai ter um tempo muito difícil raspá-lo. É fácil agarrar a resposta HTTP, é muito mais difícil raspar o que o navegador exibe em resposta ao script do lado do cliente contido nessa resposta.

Se a raspagem de ecrã é a única opção, aqui estão algumas chaves para sucesso:

  1. Torne o mais fácil possível mudar os padrões que você procura. Se possível, armazenar os padrões como arquivos de texto ou em um arquivo de recursos em algum lugar. Torne muito fácil para outros desenvolvedores (ou você mesmo em 3 meses) entender o que o markup que você espera encontrar.

  2. Validar a entrada e criar excepções significativas. Em seu código de análise, tome cuidado para tornar suas exceções muito úteis. O local de destino irá mudar em si, e quando isso acontece você quer que suas mensagens de erro para dizer não só que parte do código falhou, mas por que {[40] } falhou. Menciona o padrão que procuras e o texto que estás a comparar.

  3. Escreva muitos testes automatizados. Você quer que seja muito fácil executar seu raspador de uma forma não-destrutiva porque você estará fazendo um monte de desenvolvimento iterativo para obter os padrões certos. Automatizar o máximo de testes que puder, ele irá compensa a longo prazo.

  4. Considere uma ferramenta de automação de navegador como Watin . Se você precisar de interações complexas com o site alvo pode ser mais fácil escrever o seu raspador do ponto de vista do próprio navegador, em vez de mexer com os pedidos HTTP e respostas à mão.

Quanto a Como raspar no ecrã em C#, pode usar o Watin (ver acima) e raspar o documento resultante usando o DOM, ou pode use a classe WebClient [veja MSDN ou Google] para obter a resposta HTTP raw, incluindo o conteúdo HTML, e então use algum tipo de análise baseada em texto para extrair os dados que deseja.

 12
Author: Seth Petry-Johnson, 2010-03-11 13:39:51

Usar O Pacote De Agilidade Html . Ele lida mal e malformado HTML. Ele permite que você consulta com XPath, tornando muito fácil encontrar os dados que você está procurando. Não escreva um analisador à mão e não use expressões regulares, é muito desajeitado.

 12
Author: Matthew Olenik, 2010-03-11 13:09:55
O termo que procuras chama-se raspagem de Ecrã. Uma coisa que você tem que considerar sobre raspar sites é que eles estão além de seu controle e podem mudar com freqüência e significativamente. Se você for com raspando o fato da mudança deve fazer parte de sua estratégia global. Por exemplo, você terá que atualizar seu código mais cedo ou mais tarde para lidar com um "alvo em movimento." Aqui estão alguns c# links para te apanhar. iniciado:

Http://www.cambiaresearch.com/c4/3ee4f5fc-0545-4360-9bc7-5824f840a28c/How-to-scrape-or-download-a-webpage-using-csharp.aspx

 3
Author: Paul Sasik, 2012-03-02 11:50:06

Aqui estão a amostra C# code que irá ajudá-lo

Uri url = new Uri("http://msdn.microsoft.com/en-US/");
if (url.Scheme == Uri.UriSchemeHttp)
{
    //Create Request Object
    HttpWebRequest objRequest = (HttpWebRequest)HttpWebRequest.Create(url);
    //Set Request Method
    objRequest.Method = WebRequestMethods.Http.Get;
    //Get response from requested url
    HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
    //Read response in stream reader
    StreamReader reader = new StreamReader(objResponse.GetResponseStream());
    string tmp = reader.ReadToEnd();
    objResponse.Close();
    //Set response data to container
    this.pnlScreen.GroupingText = tmp;
}
 3
Author: Jayesh Sorathia, 2012-07-27 11:47:49

Apenas uma coisa a notar, algumas pessoas mencionaram puxar para baixo o site como XML e, em seguida, usando XPath para iterar através dos nós. É provavelmente importante ter certeza de que você está trabalhando com um site que foi desenvolvido em XHTML para se certificar de que o HTML representa um documento XML bem formado.

 1
Author: Brian Scott, 2010-03-11 13:46:35

De um ponto de vista prático (escrevi dezenas de aplicações "web-interactivas" ao longo dos anos), finalmente assentei em Watin combinado com CSQuery.

O Watin fornece as bases da automação do navegador (interagindo com botões, etc), enquanto o CSQuery lhe permite usar a sintaxe do estilo jQuery para analisar o conteúdo da página.

Usei o selénio durante algum tempo (também concebido para testes automáticos de sítios web) com o IE e o FireFox, mas achei que era propenso a colidir quando usado. para raspar a longo prazo. Todos os meus sistemas de produção atuais são Watin + CSQuery e fornecer raspagem confiável de vários sites em uma base diária.

Nota: sei que o Watin não foi actualizado há algum tempo, mas "se não está partido, usa-o!" :)

 1
Author: Gone Coding, 2015-08-03 17:00:08