병렬 wget이 있습니까? fping과 같은 것이지만 다운로드 전용입니까?


15

나는 puf (Parallel URL fetcher) 만 찾았지만 파일에서 URL을 읽을 수 없었습니다. 같은

 puf < urls.txt

작동하지 않습니다.

서버에 설치된 운영 체제는 Ubuntu입니다.


이것은 Python 및 pycurl 라이브러리와 스크립트의 약간의 글루 로직으로 수행 할 수 있습니다. 그러나 나는 그것을위한 "통조림"도구를 모른다.
Keith

@Keith이 접근 방식은 urllib와 함께 일부 비동기 라이브러리를 gevent로 사용하는 것보다 낫습니까?
Moonwalker

urllib은 비동기 적으로 사용되도록 설계되지 않았습니다. libcurl에는 자체 비동기 루프가 있으며 "multi"인터페이스를 사용하여 최소 1000 개의 동시 페치를 수행하도록 설정할 수 있습니다.
Keith

@ Keith 나는 당신의 대답을 가장 좋아하므로 그것을 정당한 신용을 얻기 위해 "진짜"대답으로 쓸 수 있습니까?
Moonwalker

답변:


25

사용 GNU는 병렬 ,

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

또는 xargs에서 GNU findutils의 ,

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

여기서 ${jobs}의 최대 번호 wget는 동시에 실행할 수있게하려면 (설정 -n1하나 얻을 wget줄에 호출에를 urls.txt). 없이 -j/ -P, parallel(위해 반드시 이해가되지 않습니다 CPU 코어로 한 번에 여러 작업으로 실행됩니다 wget네트워크 IO 구속)하고, xargs한 번에 하나씩 실행됩니다.

하나 개의 좋은 기능 parallel을 통해 한 xargs동시에 실행되는 작업의 출력을 유지하고 분리,하지만 당신은 그것에 대해 걱정하지 않는 경우, xargs사전 설치 될 가능성이 높습니다.


최적은 jobs경로 지연 시간, 경로 대역폭, 원격 서버 정책 등 : 여러 가지 요인에 따라 달라집니다
dhchdhd


2

파이썬과 pycurl 라이브러리를 사용하여 구현할 수 있습니다. pycurl 라이브러리에는 다중 동시 연결을 가능하게하는 자체 짝수 루프를 구현하는 "멀티"인터페이스가 있습니다.

그러나 인터페이스는 다소 C 형이므로 다른 "Pythonic"코드와 비교하면 다소 번거 롭습니다.

더 완벽한 브라우저와 유사한 클라이언트를 구축하는 래퍼를 작성했습니다. 이를 예로 사용할 수 있습니다. pycopia.WWW.client 모듈을 참조하십시오 . HTTPConnectionManager는 멀티 인터페이스를 래핑합니다.


2

이것은 적절하게 조정되어 작동하며 로컬 또는 원격 DoS가 아닙니다.

(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 {}                             \
)

1

GNU Parallel 매뉴얼 페이지의 일부에는 병렬 재귀 wget의 예가 들어 있습니다.

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

HTML은 두 번 다운로드됩니다. 링크를 추출하기 위해 한 번, 디스크로 다운로드하기 위해 한 번입니다. 다른 컨텐츠는 한 번만 다운로드됩니다.

재귀가 필요하지 않으면 ephemient의 대답은 분명해 보입니다.


참고로 병렬 및 wget "솔루션"은 콘텐츠를 두 번 다운로드해야하기 때문에 본질적으로 비효율적 이며 모든 다단계 다운로드로 인해 속도가 느리며 모든 대역폭 낭비에 대해 비용을 지불 해야하는 시스템 관리자에게는 좋지 않습니다. 효율적인 솔루션을 사용하지 마십시오.
dhchdhd

0

Paralell 다운로드의 희생자들은 즐겁지 않습니다. 그들은 하나의 연결이 각 클라이언트에 서비스를 제공 할 것으로 기대합니다. 여러 연결을 설정하면 전체적으로 클라이언트가 줄어 듭니다. (즉, 이것은 무례한 행동으로 간주됩니다).


1
그러나 그는 다른 서버에서 파일을 다운로드하고있을 수 있으므로 적용되지 않습니다.
Renan

@vonbrand가 말한 것 외에도 "너무 많은 연결"과 같은 것을 얻을 수 있으며 모든 파일을 다운로드 할 수는 없습니다. 그리고 약간 느릴 수 있습니다 (예 : 여러 HTTP 연결을 만드는 것과 비교하여 하나의 HTTP 연결을 재사용하는 경우)
golimar

2
숫자를 제대로 유지하는 한 큰 문제는 아닙니다. 예를 들어, 이것을 작성할 당시 Firefox는 지속적인 연결을 사용하지 않을 때 서버 당 15 개의 연결 을 사용하고있었습니다 (그 후에는 서버 당 6 개로 제한된 연결 만 시도했습니다). 다른 브라우저는 비슷한 숫자를 사용합니다.
derobert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.