컬에 요청 사이의 일시 중지가 누락되고, wget에 동적 파일 출력 이름이 누락되었습니다. 연속 범위 파일 다운로드를 위해 미리 만들어진 대안이 있습니까?

컬에 요청 사이의 일시 중지가 누락되고, wget에 동적 파일 출력 이름이 누락되었습니다. 연속 범위 파일 다운로드를 위해 미리 만들어진 대안이 있습니까?

curl둘 다 연속된 파일 범위( in , in )를 다운로드하는 기능을 제공 wget하지만 둘 다 단점이 있습니다. 즉, 시퀀스의 각 다운로드 사이에 쉽게 일시 중지할 수 있는 방법을 제공하지 않습니다. 일부 서버는 몇 번의 빠른 다운로드 후에 다운로드를 중단하지만, 다운로드 사이에 일시 중지하는 것이 정중하고 적절하며, 반드시 좋은 크롤러 시민이 되는 것이 좋습니다. 예를 들어, 누군가 각 요청 사이에 5초 동안 일시 중지하기를 원할 경우 추가 스크립팅 없이는 이를 수행할 수 있는 방법이 없다는 것을 이해합니다. 이는 지원의 의미를 별도의 요청으로 만들어 순차 범위에 대한 기본 제공 조항을 본질적으로 깨뜨립니다.[1-100]curl{1..100}wgetcurl

이 문제에 대한 해결책은 위의 원하는 결과를 얻기 위해 wget편의 플래그를 사용하는 것입니다. --wait=5불행히도 wget다른 문제도 있습니다. URL의 특수문자 처리에 문제가 있는 것 같고, 범위를 {1..100}인식하지 못하는 것 같아서 URL 앞뒤에 따옴표를 사용할 수 없는 것 같습니다. 이는 특수 문자를 수동으로 이스케이프해야 하는 경우가 있음을 의미합니다. 이는 관리 가능하지만 성가신 일입니다.

그러나 더 중요한 것은 wget동적으로 이름이 지정된 출력이 지원되지 않는다는 것입니다(이 -O플래그는 여기서 도움이 되지 않습니다). 제공된 편의성 에도 불구하고 curl내장된 순차 범위 지원을 다시 우회하고 개별 요청에 대한 스크립트된 컬렉션을 만들거나 다운로드 후 파일 이름을 편집하거나 편집하지 않고는 -o "#1.jpg"동일한 동적 결과를 달성하는 것이 불가능해 보입니다 .wgetrename

이것은 꽤 일반적인 작업인 것 같습니다. 일련의 연속 소스 파일을 다운로드하고, 각 요청 사이에 정중하게 일시 중지하고, 출력의 이름을 동적으로 바꾸는 것입니다. 대안이 누락되어 위의 두 가지 문제를 극복하고 있습니까 curl? wget1) 각 요청 사이에 일시 중지 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"

https://catonmat.net/cookbooks/curl/make-curl-slow

답변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.

관련 정보