curl
둘 다 연속된 파일 범위( in , in )를 다운로드하는 기능을 제공 wget
하지만 둘 다 단점이 있습니다. 즉, 시퀀스의 각 다운로드 사이에 쉽게 일시 중지할 수 있는 방법을 제공하지 않습니다. 일부 서버는 몇 번의 빠른 다운로드 후에 다운로드를 중단하지만, 다운로드 사이에 일시 중지하는 것이 정중하고 적절하며, 반드시 좋은 크롤러 시민이 되는 것이 좋습니다. 예를 들어, 누군가 각 요청 사이에 5초 동안 일시 중지하기를 원할 경우 추가 스크립팅 없이는 이를 수행할 수 있는 방법이 없다는 것을 이해합니다. 이는 지원의 의미를 별도의 요청으로 만들어 순차 범위에 대한 기본 제공 조항을 본질적으로 깨뜨립니다.[1-100]
curl
{1..100}
wget
curl
이 문제에 대한 해결책은 위의 원하는 결과를 얻기 위해 wget
편의 플래그를 사용하는 것입니다. --wait=5
불행히도 wget
다른 문제도 있습니다. URL의 특수문자 처리에 문제가 있는 것 같고, 범위를 {1..100}
인식하지 못하는 것 같아서 URL 앞뒤에 따옴표를 사용할 수 없는 것 같습니다. 이는 특수 문자를 수동으로 이스케이프해야 하는 경우가 있음을 의미합니다. 이는 관리 가능하지만 성가신 일입니다.
그러나 더 중요한 것은 wget
동적으로 이름이 지정된 출력이 지원되지 않는다는 것입니다(이 -O
플래그는 여기서 도움이 되지 않습니다). 제공된 편의성 에도 불구하고 curl
내장된 순차 범위 지원을 다시 우회하고 개별 요청에 대한 스크립트된 컬렉션을 만들거나 다운로드 후 파일 이름을 편집하거나 편집하지 않고는 -o "#1.jpg"
동일한 동적 결과를 달성하는 것이 불가능해 보입니다 .wget
rename
이것은 꽤 일반적인 작업인 것 같습니다. 일련의 연속 소스 파일을 다운로드하고, 각 요청 사이에 정중하게 일시 중지하고, 출력의 이름을 동적으로 바꾸는 것입니다. 대안이 누락되어 위의 두 가지 문제를 극복하고 있습니까 curl
? wget
1) 각 요청 사이에 일시 중지 2) 파일 이름을 동적으로 출력합니다.
답변1
URL의 특수 문자를 처리하는 데 문제가 있는 것 같고, {1..100} 범위가 인식되지 않는 것 같아서 URL 앞뒤에 따옴표를 사용할 수 없습니다.
이는 이 범위 구문이 실제로 의 기능이 아니라 wget
인수를 확장하는 셸(예: bash)의 기능이기 때문입니다.앞으로에 전달하고 wget
비교하십시오.
$ echo abc{1..5}
abc1 abc2 abc3 abc4 abc5
또는
$ ruby -e 'p ARGV' abc{1..5}
["abc1", "abc2", "abc3", "abc4", "abc5"]
매개변수를 인용하면 쉘은 매개변수를 확장하지 않습니다.
$ echo 'abc{1..5}'
abc{1..5}
그러나 범위를 제외한 모든 것을 참조할 수 있습니다.
$ echo 'abc'{1..5}'def'
abc1def abc2def abc3def abc4def abc5def
그러나 더 중요한 것은 wget이 동적으로 명명된 출력을 지원하지 않는다는 것입니다.
wget
이러한 범위는 함수가 아니기 때문에 이러한 범위를 처리할 수 있는 함수가 없습니다 wget
.
아니요, 하나의 명령으로 이 모든 것을 수행할 수는 없는 것 같습니다. 하지만 여전히 oneliner에 넣을 수 있습니다.
for i in {1..100}; do curl "https://example.com/${i}.jpg" -o "output_${i}.jpg"; sleep 5; done
UNIX 도구는 상당히 집중적이면서도 스크립트 작성이 쉽도록 설계되었습니다. 그 중 일부는 이미 일반적인 작업을 한 번에 수행할 수 있는 다양한 옵션을 제공하지만 모든 사용 사례를 자체적으로 처리할 수는 없습니다.
답변2
"요청 사이에 잠시 멈출 수 있습니다"에 대한 직접적인 대답이 아니라 "좋은 파충류 시민"이 되기 위한 직접적인 대답입니다.
--limit-rate
엔드포인트에서 "너무 많은 요청"을 받은 후 이 옵션을 성공적으로 사용했습니다. 내 임무를 완수하려면 약간의 시행착오와 50K를 거쳐야 했습니다.
curl --limit-rate 50k "https://someURL.com/resource?p=[1-100]" -o "path\to\file_#1.txt"
답변3
컬 7.84.0 이상에서는 다음 --rate
에 설명된 매개변수를 사용할 수 있습니다.이 블로그 게시물:
허용되는 가장 빠른 속도를 설정합니다.
--rate "N/U"
여기서 N은 정수이고 U는 시간 단위입니다. 지원되는 단위는 "s"(초), "m"(분), "h"(시간), "d"(일, 24시간 단위)입니다. U는 시간 단위입니다. "/U"가 제공되지 않으면 기본 시간 단위는 시간당 전송 수입니다.예를 들어, 컬이 요청을 분당 2번 이하로 실행하도록 하려면 를 사용하고,
--rate 2/m
시간당 25번 실행하려면 을 사용하십시오--rate 25/h
.
따라서 요청을 5초보다 더 자주 보내지 않으려면(물론 이는 요청 사이에 5초 동안 일시 중지하는 것과는 다릅니다) 를 사용할 수 있습니다 --rate 12/m
.