Pobierz adresy URL wymienione w pliku za pomocą curl? [Zamknięte]

15

Mam plik zawierający wszystkie adresy URL, z których muszę pobrać. Jednak muszę ograniczyć jedno pobieranie na raz. tzn. następne pobieranie powinno rozpocząć się dopiero po zakończeniu poprzedniego. Czy jest to możliwe przy użyciu curl? A może powinienem użyć czegoś innego.

Dev
źródło
3
Witaj i witaj w błędzie serwera. Podczas zadawania pytań na tej stronie zawsze pamiętaj, że nie ma ciebie i nie zgadnij, z jakiego środowiska korzystasz. W tym przypadku nie określono systemu operacyjnego, który utrudni prawidłowe odpowiadanie.
Stephane

Odpowiedzi:

20
xargs -n 1 curl -O < your_files.txt
Grumdrig
źródło
2
To najlepsza odpowiedź. Chociaż pytający nie podał, prawdopodobnie bezpiecznie jest założyć, że odpowiedzi na wszystkie adresy URL powinny być zapisane w poszczególnych plikach. -OAby to zrobić, użyj opcji z cURL. xargs -n 1 curl -O < your_file.txt
LS
Zgadzam się. Tak edytowane.
Grumdrig,
Tego naprawdę potrzebuję.
vu ledang
19

wget(1) domyślnie działa sekwencyjnie i ma tę opcję wbudowaną:

   -i file
   --input-file=file
       Read URLs from a local or external file.  If - is specified as file, URLs are read from the standard input.  (Use ./- to read from a file literally named -.)

       If this function is used, no URLs need be present on the command line.  If there are URLs both on the command line and in an input file, those on the command lines will be the first ones to be retrieved.  If
       --force-html is not specified, then file should consist of a series of URLs, one per line.

       However, if you specify --force-html, the document will be regarded as html.  In that case you may have problems with relative links, which you can solve either by adding "<base href="url">" to the documents
       or by specifying --base=url on the command line.

       If the file is an external one, the document will be automatically treated as html if the Content-Type matches text/html.  Furthermore, the file's location will be implicitly used as base href if none was
       specified.
dawud
źródło
3
Ponieważ pytający chciał wiedzieć, jak to zrobić za pomocą cURL, powinieneś przynajmniej podać rozwiązanie, które spróbuje go użyć.
LS
4

Jest to możliwe przy użyciu curl w skrypcie powłoki, coś takiego, ale musisz samemu znaleźć odpowiednie opcje curl itp

while read URL
    curl some options $URL
    if required check exit status 
          take appropriate action
done <fileontainingurls
użytkownik9517
źródło
2
Rozumiem, że to połowa pseudokodu, ale myślę, że pętla while powinna wciąż mieć „do”.
nwk
1
@ nwk to całkowicie pseudokod i nie zgadzam się.
user9517,
Co jeśli adres URL zawiera znaki handlowe? Czy uda im się uciec? Bez ucieczki powłoka pomyśli, że polecenie powinno być uruchomione w tle.
Jagger
2

Na podstawie odpowiedzi @iain, ale przy użyciu odpowiedniego skryptu powłoki -

while read url; do
  echo "== $url =="
  curl -sL -O "$url"
done < list_of_urls.txt

Działa również z dziwnymi postaciami, takimi jak znaki handlowe itp.

-OZamiast tego można zastąpić przekierowaniem do pliku lub w inny odpowiedni sposób.

Evgeny
źródło