Pergunta

Quando não há API de serviço da web disponível, sua única opção pode ser a tela, mas como você faz isso em C#?

Como você acha isso?

Foi útil?

Solução

As respostas de Matt e Paul estão corretas. "Raspagem de tela" analisando o HTML de um site geralmente é uma má ideia porque:

  1. Analisar o HTML pode ser difícil, especialmente se estiver malformado. Se você estiver raspando uma página muito, muito simples, as expressões regulares podem funcionar. Caso contrário, use uma estrutura de análise como o HTML Agility Pack.

  2. Os sites são um alvo em movimento. Você precisará atualizar seu código sempre que o site de origem altera a estrutura de marcação.

  3. A raspagem de tela não joga bem com JavaScript. Se o site de destino estiver usando algum tipo de script dinâmico para manipular a página da web, você terá dificuldade em raspá -lo. É fácil pegar 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 da tela for a única opção, aqui estão algumas chaves para o sucesso:

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

  2. Validar a entrada e jogar exceções significativas. No seu código de análise, tome cuidado para tornar suas exceções muito úteis. O site alvo vai Mudar em você, e quando isso acontece, você deseja que suas mensagens de erro lhe digam não apenas que parte do código falhou, mas Por quê falhou. Mencione o padrão que você está procurando e o texto contra o qual você está comparando.

  3. Escreva muitos testes automatizados. Você quer que seja muito fácil executar seu raspador de maneira não destrutiva porque você vai estar fazendo muito desenvolvimento iterativo para acertar os padrões. Automatize o máximo de teste possível, ele será recompensado a longo prazo.

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

Quanto a Como as Para rastrear raspar em C#, você pode usar o Watin (veja acima) e raspar o documento resultante usando seu DOM, ou você pode usar o WebClient Classe [consulte MSDN ou Google] para obter a resposta HTTP bruta, incluindo o conteúdo HTML e, em seguida, use algum tipo de análise baseada em texto para extrair os dados desejados.

Outras dicas

Usar HTML Agility Pack. Ele lida mal e HTML malformado. Ele permite que você consulte o XPath, facilitando a localização dos dados que você está procurando. Não escreva um analisador à mão e não use expressões regulares, é muito desajeitado.

O termo que você está procurando é realmente chamado Raspagem de tela.

Uma coisa que você precisa considerar sobre a eliminação de sites é que eles estão além do seu controle e podem mudar com frequência e significativamente. Se você for eliminado, o fato da mudança deve parte de sua estratégia geral. Por exemplo, você precisará atualizar seu código mais cedo ou mais tarde para lidar com um "alvo em movimento".

Aqui estão alguns links C# para você começar:

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

Aqui estão o código C#, que o ajudará

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;
}

Apenas uma coisa a observar, algumas pessoas mencionaram puxar o site como XML e depois usar o XPath para iterar através dos nós. Provavelmente é importante garantir que você esteja trabalhando com um site desenvolvido no XHTML para garantir que o HTML represente um documento XML bem formado.

De uma perspectiva prática (escrevi dezenas de aplicativos "interativos da Web" ao longo dos anos), finalmente decidi Watin combinado com CsQuery.

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

Usei o selênio por um tempo (também projetado para testes automatizados de sites) com o IE e o Firefox, mas achei que era propenso a travar quando usado para raspagem de longo prazo. Todos os meus sistemas de produção atuais são Watin + CSQuery e fornecem raspagem confiável de vários sites diariamente.

Nota: Eu percebo que Watin não foi atualizado há algum tempo, mas "Se não estiver quebrado, use -o!" :)

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