Existe wget paralelo? Algo como fping, mas apenas para download?

14

Encontrei apenas puf (Buscador de URLs paralelo), mas não consegui ler URLs de um arquivo; algo como

 puf < urls.txt

também não funciona.

O sistema operacional instalado no servidor é o Ubuntu.

Moonwalker
fonte
Isso pode ser feito com a biblioteca Python e pycurl e um pouco da lógica da cola em um script. Mas não conheço uma ferramenta "enlatada" para isso.
8302 Keith
@ Keith Essa abordagem é melhor do que usar alguma biblioteca assíncrona como gevent com urllib?
8892 Moonwalker
O urllib não foi projetado para ser usado de forma assíncrona. O libcurl possui seu próprio loop assíncrono e pode ser configurado para realizar pelo menos 1000 buscas simultâneas usando a interface "multi".
Keith
@ Keith Eu gosto mais da sua resposta, então você poderia escrevê-la como uma resposta "real" para receber o devido crédito?
quer

Respostas:

24

Usando o GNU Parallel ,

$ parallel -j $ {jobs} wget <urls.txt

ou xargsdo GNU Findutils ,

$ xargs -n 1 -P $ {jobs} wget <urls.txt

onde ${jobs}é o número máximo de wgetvocê deseja permitir a execução simultânea (ajuste -npara 1obter uma wgetinvocação por linha no urls.txt). Sem -j/ -P, parallelexecutará tantos trabalhos por vez quanto os núcleos da CPU (o que não necessariamente faz sentido para o wgetIO da rede) e xargsserá executado um de cada vez.

Um recurso interessante parallelacabou xargsmantendo a saída dos trabalhos em execução simultânea separados, mas se você não se importa com isso, xargsé mais provável que esteja pré-instalado.

efémero
fonte
O ideal jobsdepende de muitos fatores: latência do caminho, largura de banda do caminho, políticas de servidor remoto etc.
dhchdhd
2

Você pode implementar isso usando Python e a biblioteca pycurl. A biblioteca pycurl possui a interface "multi" que implementa seu próprio loop par que permite várias conexões simultâneas.

No entanto, a interface é parecida com C e, portanto, um pouco complicada em comparação com outro código, mais "Pythonic".

Eu escrevi um wrapper para ele que cria um cliente mais completo, semelhante a um navegador, sobre ele. Você pode usar isso como um exemplo. Veja o módulo pycopia.WWW.client . O HTTPConnectionManager envolve a multi interface.

Keith
fonte
2

Isso funciona, e não faz DoS local ou remoto, com os ajustes adequados:

(bandwidth=5000 jobs=8; \
 parallel      \
   --round     \
   -P $jobs    \
   --nice +5   \
   --delay 2   \
   --pipepart  \
   --cat       \
   -a urls.txt \
     wget                                \
       --limit-rate=$((bandwidth/jobs))k \
       -w 1                              \
       -nv                               \
       -i {}                             \
)
dhchdhd
fonte
1

Parte da página de manual do GNU Parallel contém um exemplo de wget recursivo paralelo.

https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Breadth-first-parallel-web-crawler-mirrorer

O HTML é baixado duas vezes: uma vez para extrair links e uma vez para baixar no disco. Outro conteúdo é baixado apenas uma vez.

Se você não precisa da resposta do epemiente recursivo, parece óbvio.

Ole Tange
fonte
Apenas um FYI tardio de que qualquer "solução" paralela e wget é inerentemente ineficiente porque requer o download de conteúdo duas vezes , lenta por causa de todo o download em várias fases e também não é bom para os administradores que precisam pagar por todo o desperdício de largura de banda porque você não use uma solução eficiente.
dhchdhd 18/09/17
0

As vítimas do seu download paralelo não serão divertidas: elas esperam que uma conexão atenda a cada cliente; configurar várias conexões significa menos clientes em geral. (Ou seja, isso é considerado comportamento rude).

vonbrand
fonte
1
Mas ele pode estar baixando arquivos de servidores diferentes, então isso não se aplicaria.
Renan
Além do que o @vonbrand disse, você pode obter algo como "Muitas conexões" e não conseguir baixar todos os arquivos. E pode ser um pouco mais lento (por exemplo reutilizando uma ligação de HTTP em comparação com a criação de várias ligações HTTP)
Golimar
2
Contanto que você mantenha o número correto, não é grande coisa. Por exemplo, no momento em que você escreveu isso, o Firefox estava usando 15 conexões por servidor quando não estava usando conexões persistentes (eles passaram a tentar apenas conexões persistentes, limitadas a 6 por servidor). Outros navegadores usam números semelhantes.
derobert