많은 작은 웹 페이지를 다운로드하는 빠른 방법?


2

최대한 빨리 작은 페이지를 많이 다운로드해야합니다. 한 페이지의 평균 크기는 3kb입니다. 수백만 페이지가 있습니다. 첫째, 나는 시도했다. curl 하지만 서버가 요청에 응답하기를 기다리고 있었기 때문에 아마 느려졌습니다. 그런 다음 다음 페이지에 대해 동일한 프로세스를 실행하십시오.

curl -O "http://website.com/pages/[0000001-1000000].html"

편집 : 몇 가지 테스트를 한 후에, 나는이 결과를 관찰했다. 나는 항상 더 많은 제안에 열려 있습니다. 나는 속도를 더 향상시키고 싶다.

비교 1 : (dns 대 DNS 없음)

느린 :

curl -O "http://website.com/pages/[1-1000].html" -s -S

더 빠름 :

curl -O "http://90.111.123.222/pages/[1-1000].html" -s -S

작은 페이지를 많이 다운로드 할 때 DNS 지연이 중요합니다.

비교 2 : (컬 시퀀스 대 "연속"사용)

느린 :

curl -O "http://90.111.123.222/pages/{1}.html" -s -S ::: $(seq 1 1000)

더 빠름 :

curl -O "http://90.111.123.222/pages/[1-1000].html" -s -S

비교 3 : (병렬 실행)

느린 :

time parallel -j 5 curl -O \'"http://90.111.123.222/pages/{1}.html"\'
-S -s ::: $(seq 1 1000)

더 빠름 :

( time curl -O "http://90.111.123.222/pages/[1-200].html" -s -S &
  time curl -O "http://90.111.123.222/pages/[201-400].html" -s -S &
  time curl -O "http://90.111.123.222/pages/[401-600].html" -s -S &
  time curl -O "http://90.111.123.222/pages/[601-800].html" -s -S &
  time curl -O "http://90.111.123.222/pages/[801-1000].html" -s -S & )

Btw, 분명히 더 많은 인스턴스를 실행하면 두 가지 방법의 속도가 어느 정도 향상됩니다.


컬은 프로토콜을 사용하는 것이 더 느리므로 wget이 다른 옵션이지만, 사용하는 것이 더 빠를지 모르겠다.
Francisco Tapia

curl과 wget은 병렬로 실행하지 않는 한 느려질 것입니다. 동시에 여러 범위에서 5 개의 컬 명령을 실행했을 때 총 속도는 4-5 배로 뛰었지만 실용적인 방법은 아니 었습니다.
dandidondi

답변:


2

작업을 여러 개의 작은 작업으로 분할하여 속도를 높이십시오. 예를 들어, 10 개의 컬링 프로세스를 생성하고 배경을 처리 할 수 ​​있습니다.

curl -O "http://website.com/pages/0[000000-999999].html" &
curl -O "http://website.com/pages/1[000000-999999].html" &
curl -O "http://website.com/pages/2[000000-999999].html" &
...

등등.

그러나 더 똑똑하고 유연한 솔루션은 GNU 병렬 여러 파일을 병렬로 다운로드 할 수 있으며 작업 배포를 병렬 처리 할 수 ​​있습니다.

선택의 당신의 포장 매니저와 그것을 설치하십시오 그 때 간단하게 무언가 일 것입니다

parallel -j 10 curl -O "http://website.com/pages/{1}" ::: $(seq -w 1000000)

훨씬 더 우아합니다.


내 URL에 "& amp;"이 포함되어 있습니다. 문자 및 이로 인해 병렬을 사용할 때 문제가 발생합니다. 병렬없이 사용하면 잘 작동합니다. curl -O "http://website.com/page1.php?varx=1&vary=0" 그러나 이것은 "& amp;"뒤에 링크를 읽지 않습니다. : parallel -j 10 curl -O "http://website.com/page{1}.php?varx=1&vary=0" ::: $(seq -w 1000000)
dandidondi

~을 사용하여 '/ 전후에 링크가 내 문제를 해결했습니다. parallel -j 10 curl -O '/ "http://website.com/page{1}.php?varx=1&vary=0"'/ ::: $(seq -w 1000000)
dandidondi

1
특수 쉘 문자 (& amp;, 등)를 백틱 (\)으로 이스케이프 할 수도 있습니다.
chui101

모든 페이지에 대한 URL을 "알았 으면" 매개 변수화 된 URI 지원 aria2c.
Alexey Ivanov

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.