병렬 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는 동시에 실행할 수있게하려면 (설정 -n을 1하나 얻을 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.