Pergunta

A próxima frase me chamou a atenção no do Wget Manual

wget --spider --force-html -i bookmarks.html

This feature needs much more work for Wget to get close to the functionality of real web spiders.

I encontrar as seguintes linhas de código relevante para a opção de aranha em wget.

src/ftp.c
780:      /* If we're in spider mode, don't really retrieve anything.  The
784:      if (opt.spider)
889:  if (!(cmd & (DO_LIST | DO_RETR)) || (opt.spider && !(cmd & DO_LIST)))
1227:      if (!opt.spider)
1239:      if (!opt.spider)
1268:      else if (!opt.spider)
1827:          if (opt.htmlify && !opt.spider)

src/http.c
64:#include "spider.h"
2405:  /* Skip preliminary HEAD request if we're not in spider mode AND
2407:  if (!opt.spider
2428:      if (opt.spider && !got_head)
2456:      /* Default document type is empty.  However, if spider mode is
2570:           * spider mode.  */
2571:          else if (opt.spider)
2661:              if (opt.spider)

src/res.c
543:  int saved_sp_val = opt.spider;
548:  opt.spider       = false;
551:  opt.spider       = saved_sp_val;  

src/spider.c
1:/* Keep track of visited URLs in spider mode.
37:#include "spider.h"
49:spider_cleanup (void)

src/spider.h
1:/* Declarations for spider.c

src/recur.c
52:#include "spider.h"
279:      if (opt.spider)
366:              || opt.spider /* opt.recursive is implicitely true */
370:             (otherwise unneeded because of --spider or rejected by -R) 
375:                   (opt.spider ? "--spider" : 
378:                     (opt.delete_after || opt.spider
440:      if (opt.spider) 

src/options.h
62:  bool spider;           /* Is Wget in spider mode? */

src/init.c
238:  { "spider",           &opt.spider,            cmd_boolean },

src/main.c
56:#include "spider.h"
238:    { "spider", 0, OPT_BOOLEAN, "spider", -1 },
435:       --spider                  don't download anything.\n"),
1045:  if (opt.recursive && opt.spider)

Eu gostaria de ver as diferenças no código, não abstratamente. Eu amo exemplos de código.

Como fazer aranhas diferem de aranha do Wget no código?

Foi útil?

Solução

Uma aranha real é um monte de trabalho

Escrevendo uma aranha para toda a WWW é uma tarefa bastante --- você tem que tomar cuidado com muitos "pequenos detalhes", tais como:

  • Cada computador aranha deve receber dados de alguns milhares de servidores em paralelo, a fim de fazer uso eficiente da largura de banda de conexão. (Assíncrona tomada i / o).
  • Você precisa de vários computadores que aranha em paralelo, a fim de cobrir a grande quantidade de informações sobre a WWW (agrupamento; particionamento do trabalho)
  • Você precisa ser educado com os sites spidered:
    • Respeitar os arquivos robots.txt.
    • Do not buscar um monte de informações muito rapidamente:. Este sobrecargas dos servidores
    • Do not buscar arquivos que você realmente não precisa. (Por exemplo, imagens de disco ISO; pacotes .tgz para download software ...)
  • Você tem que lidar com ids biscoitos / sessão: Muitos sites anexar IDs de sessão únicas para URLs para identificar sessões de cliente. Cada vez que você chegar no local, você terá um novo ID de sessão e um novo mundo virtual de páginas (com o mesmo conteúdo). Por causa de tais problemas, os motores de busca cedo ignorado conteúdo dinâmico. motores de busca modernos aprenderam quais são os problemas e como lidar com eles.
  • Você tem de detectar e ignorar problemáticos dados:. Conexões que fornecem uma quantidade aparentemente infinita de dados ou conexões que são muito lento ao fim
  • Além de seguir links, você pode querer parse sitemaps para obter URLs de páginas.
  • Você pode querer avaliar qual informação é importante para você e muda frequentemente para ser atualizado com mais frequência do que outras páginas. Nota: Uma aranha para toda a WWW recebe um monte de dados --- você pagar por essa banda. Você pode querer usar HTTP solicitações cabeça para adivinhar se uma página mudou ou não.
  • Além de receber, você deseja processar as informações e armazená-lo. Google constrói índices que lista para cada palavra as páginas que contenham. Você pode precisar de computadores de armazenamento separados e uma infra-estrutura para conectá-los. bases de dados relacionais tradicionais não manter-se com os requisitos de volume de dados e desempenho de armazenamento / indexação de todo o WWW.

Este é um monte de trabalho. Mas se o seu objetivo é mais modesto do que ler toda a WWW, você pode pular algumas das partes. Se você quiser apenas para baixar uma cópia de um wiki etc. você chegar até as especificações do wget.

Nota: Se você não acredita que é muito trabalho, você pode querer ler sobre como o Google re-inventou a maioria das rodas de computação (em cima do kernel Linux básico) para construir boas aranhas. Mesmo se você cortar um monte de cantos, é um monte de trabalho.

Deixe-me acrescentar algumas observações mais técnicos em três pontos

Ligações paralelas / assíncrona comunicação de soquete

Você pode executar vários programas de aranha em processos paralelos ou threads. Mas você precisa de cerca de 5000-10000 conexões paralelas, a fim de fazer bom uso de sua conexão de rede. E esta quantidade de processos paralelos / tópicos produz muita sobrecarga.

A melhor solução é assíncrona entrada / saída: processo de cerca de 1000 ligações paralelas em um único segmento de abertura das tomadas em modo de não-bloqueio e utilização epoll ou seleccionar para processar apenas a essas ligações que tenham recebido dados. Desde que o Linux kernel 2.4, o Linux tem excelente suporte para escalabilidade (Eu também recomendo que você estudar arquivos de memória mapeada) continuamente melhorado em versões posteriores.

Nota: Usando E / S assíncrona ajuda muito mais do que usar uma "linguagem rápida": É melhor escrever um processo orientado a epoll para 1000 conexões escritos em Perl do que correr 1000 processos escritos em C. Se você fizer isso direito , você pode saturar uma conexão de 100 Mb com processos escritos em perl.

A partir da resposta original: O lado negativo dessa abordagem é quevocê terá que implementar a especificação HTTP-se de forma assíncrona (Eu não estou ciente de uma biblioteca reutilizável que faz isso). É muito mais fácil de fazer isso com o / 1.0 protocolo simples HTTP que o moderno protocolo HTTP / 1.1. Você provavelmente não iria beneficiar das vantagens de HTTP / 1.1 para navegadores normais de qualquer forma, então isso pode ser um bom lugar para economizar alguns custos de desenvolvimento.

Editar cinco anos depois: Hoje, há um monte de tecnologia de código livre / aberto disponível para ajudá-lo com este trabalho. Eu, pessoalmente, como o assíncrona http implementação de node.js --- ele poupa-lhe todo o trabalho mencionado na acima parágrafo original. Claro, hoje também há um monte de módulos prontamente disponível para os outros componentes que você precisa em sua aranha. Note, no entanto, que a qualidade dos módulos de terceiros podem variar consideravelmente. Você tem que verificar o que você usa. [Envelhecimento informações:] Recentemente, escrevi uma aranha usando node.js e eu achei a confiabilidade de módulos NPM para HTML processamento de link e extração de dados insuficientes. Para este trabalho, eu "terceirizada" este processamento para um processo escrito em outra linguagem de programação. Mas as coisas estão mudando rapidamente e pelo tempo que você ler este comentário, esse problema pode já uma coisa do passado ...

Particionando o trabalho ao longo de vários servidores

Um computador não pode manter-se com spidering toda a WWW. Você precisa distribuir seu trabalho ao longo de vários servidores e troca de informações entre eles. Sugiro para atribuir certas "gamas de nomes de domínio" para cada servidor: manter uma base de dados central de nomes de domínio com uma referência a um computador aranha.

URLs Extrato de páginas da web recebidos em lotes: tipo los de acordo com seus nomes de domínio; remover duplicatas e enviá-los para o computador de aranha responsável. Nesse computador, mantenha um índice de URLs que já estão buscado e buscar os URLs restantes.

Se você manter uma fila de URLs à espera de ser obtida em cada computador aranha, você não terá gargalos de desempenho. Mas é um monte de programação para implementar isso.

Leia as normas

Eu mencionei várias normas (HTTP / 1.x, robots.txt, Cookies). Leve o seu tempo para lê-los e implementá-las. Se você apenas seguir exemplos de sites que você sabe, você vai cometer erros (esquecer partes do padrão que não são relevantes para as suas amostras) e causar problemas para os sites que usam esses recursos adicionais.

É uma dor para ler a 1,1 documento HTTP / standard. Mas todos os pequenos detalhes foi adicionado a ele porque alguém realmente precisa esse pequeno detalhe e agora usa-lo.

Outras dicas

Eu não tenho certeza exatamente o que o autor original do comentário estava se referindo, mas posso adivinhar que wget é lento como uma aranha, uma vez que parece usar apenas um único segmento de execução (pelo menos por aquilo que você tem mostrado ).

aranhas "real", como Heritrix usar um monte de paralelismo e truques para otimizar sua velocidade de rastreamento, ao ser simultaneamente agradável ao site que eles estão rastejando. Isso normalmente significa limitar batidas a um local a uma taxa de uma por segundo (ou mais), e o rastreamento de vários sítios ao mesmo tempo.

Mais uma vez tudo isso é apenas um palpite com base no que eu sei de aranhas em geral, eo que você postou aqui.

Infelizmente, muitos dos mais conhecidos 'reais' aranhas web são de código fechado, e de fato fechado binário. No entanto, há uma série de técnicas básicas wget está faltando:

  • O paralelismo; você nunca vai ser capaz de manter-se com toda a web sem recuperar várias páginas de cada vez
  • Priorização; algumas páginas são mais importantes para aranha que outros
  • A limitação de taxa; você vai ser banido rapidamente se você manter a puxar para baixo páginas tão rapidamente como você pode
  • Saving para algo diferente de um sistema de arquivos local; a Web é grande o suficiente para que ele não está indo para caber em uma única árvore de diretórios
  • Reverificação páginas periodicamente sem reiniciar todo o processo; na prática, com uma aranha real, você vai querer verificar novamente as páginas 'importantes' para atualizações freqüentes, enquanto as páginas menos interessantes pode ir para meses.

Existem também vários outros insumos que podem ser utilizadas, tais como mapas de sites e afins. O ponto é, wget não é projetado para rastrear toda a web, e não é realmente uma coisa que pode ser capturado em uma amostra de código pequeno, como é um problema de toda a técnica geral a ser utilizado, em vez de um único pequeno sub-rotina estar errado para a tarefa.

Eu não vou entrar em detalhes de como a aranha na internet, eu acho que o comentário wget é em relação ao spidering um site que ainda é um sério desafio.

  • Como uma aranha que você precisa descobrir quando parar, não entrar em rastreamentos recursiva só porque o URL mudou como data = 1/1/1900 a 1900/01/02 e assim
  • Ainda maior desafio para resolver URL Rewrite (não tenho qualquer indício que assim sempre como Google ou qualquer outro lida com isso). É muito grande desafio suficiente rastreamento, mas não muito. E como se pode reconhecer automaticamente URL Rewrite com alguns parâmetros aleatórios e mudanças aleatórias na conteúdo?
  • Você precisa analisar Flash / Javascript, pelo menos até um certo nível
  • Você precisa considerar alguns problemas louco HTTP como base de tag . Mesmo analisar o HTML não é fácil, considerando que a maioria dos sites não são XHTML e navegadores são tão flexível na sintaxe.

Eu não sei o quanto destes implementadas ou considerados em wget, mas você pode querer dar uma olhada em httrack para compreender os desafios desta tarefa.

Eu adoraria dar-lhe alguns exemplos de código, mas isso é grandes tarefas e uma aranha decente será de cerca de 5000 loc sem bibliotecas 3rd party .

+ Alguns deles já explicado por @ Yaakov-arroto então eu não vou digitá-los novamente

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