Jak pobierać pliki za pomocą cURL: flagi, poprawki i skrypty

Ostatnia aktualizacja: August 11, 2026
Hand-drawn file download flowing from a terminal window into a verified folder
Podsumowanie AI
Praktyczny przewodnik po pobieraniu plików przez cURL obejmujący przekierowania, uwierzytelnianie, ponawianie prób, wznawianie pobrań, skrypty wsadowe, weryfikację oraz najczęstsze błędy.

Spędziłem absurdalnie dużo późnych nocy na debugowaniu skryptów, które miały po prostu „pobrać plik i iść dalej”. W dziewięciu przypadkach na dziesięć winny był cURL — robił dokładnie to, co mu kazałem, a nie to, czego naprawdę chciałem. Okazuje się, że między „curl -O działa” a „curl -O działa niezawodnie w produkcji” jest spora przepaść.

Właśnie tę lukę ma wypełnić ten poradnik. cURL jest domyślnie zainstalowany na macOS, większości dystrybucji Linuxa oraz w Windows 10 i nowszych, więc najpewniej już masz go na swoim komputerze. Ale między cichymi błędami przekierowań, tajemniczymi 403 i przejściem od „pobierz jeden plik” do „pobierz 500 plików bez zapychania terminala” łatwo utknąć. Pokażę Ci flagi, które naprawdę mają znaczenie, kroki i komendy, których sam używam, najczęstsze błędy oraz moment, w którym cURL rzeczywiście przestaje wystarczać — i po co sięgnąć wtedy zamiast niego.

Czym jest cURL i dlaczego warto się nim zainteresować?

cURL to darmowe, otwartoźródłowe narzędzie wiersza poleceń do przesyłania danych do lub z serwera za pomocą URL. Obsługuje HTTP, HTTPS, FTP, SFTP i mnóstwo innych protokołów, dlatego pojawia się wszędzie — od skryptów bash, przez Dockerfile, po pipeline’y CI. Pod maską polecenie curl, które wpisujesz w terminalu, korzysta z libcurl, czyli biblioteki transferowej w C, osadzanej w wielu aplikacjach i bindingach językowych. Przykładem jest rozszerzenie cURL w PHP; popularna biblioteka Requests w Pythonie to osobny klient HTTP zbudowany na urllib3, a nie na libcurl.

Aktualna stabilna wersja w chwili pisania tego tekstu to curl 8.21.0, wydana w czerwcu 2026 — ale nie zakładaj, że system operacyjny dostarcza dokładnie ten build. Wersje pakietowe cURL w dystrybucjach często pozostają w tyle za głównym projektem o miesiące, czasem dłużej, więc warto uruchomić curl --version, zanim założysz, że masz dostęp do flagi takiej jak --parallel.

Po co pobierać pliki przez cURL? Najczęstsze zastosowania

Często słyszę pytanie, po co w ogóle używać narzędzia z linii komend, skoro przeglądarki radzą sobie z pobieraniem plików całkiem dobrze. Odpowiedź jest prosta: przeglądarka jest świetna, dopóki nie trzeba niczego automatyzować.

ZastosowanieDlaczego cURL sprawdza się świetnie
Pobieranie binariów w pipeline’ach CI/CDMożna to skryptować, bez interfejsu graficznego
Pobieranie odpowiedzi API lub eksportów danychObsługuje własne nagłówki, autoryzację i przekierowanie wyjścia
Wznawianie dużych pobrań przez SSHWbudowana obsługa wznawiania (-C -)
Automatyzacja cyklicznych pobrań (cron)Lekki, dobrze współpracuje ze skryptami shellowymi
Pobieranie plików chronionych logowaniemElastyczne flagi uwierzytelniania (basic, token, cookies, .netrc)

Pobranie w przeglądarce to jednorazowe kliknięcie. cURL zamienia tę samą czynność w coś, co można zaplanować, wpiąć w pipeline, ponowić po błędzie i uruchomić identycznie na stu serwerach naraz. I właśnie w tym tkwi jego siła — nie jest „efektowny”, tylko powtarzalny.

Ręcznie rysowany przepływ od źródła w sieci do pobranego pliku i lokalnego folderu

Najważniejsze flagi cURL do pobierania plików

Wracam ciągle do tych samych kilkunastu flag, które załatwiają 90% mojej pracy. Oto skrócona ściąga, którą chciałbym dostać lata temu — uporządkowana według tego, co faktycznie robią.

Flagi do wyjścia i zapisywania plików

  • -O (--remote-name) zapisuje plik z ostatniego fragmentu URL jako nazwę pliku. Wygodne, ale może bez ostrzeżenia nadpisać istniejący plik o tej samej nazwie.
  • -o <nazwa_pliku> (--output) pozwala samodzielnie wskazać dokładną nazwę pliku: curl -o raport.pdf https://example.com/downloads/file.pdf.
  • -J (--remote-header-name) używa nazwy pliku z nagłówka Content-Disposition serwera zamiast tej z URL. To bywa wygodne przy pobieraniu z API, ale traktuj nazwy plików podane przez serwer jako niezaufane dane — zapisuj je do osobnego folderu, a nie do katalogu domowego, zgodnie z zaleceniami bezpieczeństwa cURL.

Flagi zachowania, których potrzebuje każde pobieranie

  • -L (--location) każe curl podążać za przekierowaniami HTTP. Bez tego odpowiedź 3xx zostanie zapisana jako mała strona HTML z przekierowaniem zamiast właściwego pliku — to zdecydowanie najczęstszy błąd typu „czemu moje pobieranie nie działa?”.
  • -C - (--continue-at -) wznawia przerwane pobieranie od miejsca, w którym się zatrzymało.
  • -s / -S działają cicho, ale nadal pokazują błędy — przydatne w skryptach, kiedy nie chcesz zaśmiecać logów paskiem postępu.
  • --limit-rate 1M ogranicza przepustowość (przydatne na współdzielonym łączu albo gdy nie chcesz zapchać sieci pomiarowej).
  • --connect-timeout 10 i --max-time 300 sprawiają, że zawieszone połączenie nie zamrozi skryptu na zawsze.
  • --retry 3 i --retry-delay 5 automatycznie ponawiają próbę przy przejściowych błędach — zgodnie z stroną podręcznika cURL, warto łączyć to z --retry-all-errors tylko wtedy, gdy dokładnie to samo żądanie naprawdę można bezpiecznie powtórzyć.

Flagi do postępu i debugowania

  • -# pokazuje prosty pasek postępu zamiast domyślnej tabeli statystyk.
  • -v wypisuje szczegółowe informacje, w tym pełne nagłówki żądania i odpowiedzi — mój pierwszy wybór, gdy coś zachowuje się dziwnie.
  • -I (--head) pobiera tylko nagłówki odpowiedzi, co świetnie sprawdza się jako szybki test przed dużym pobraniem.
  • -w pozwala wypisać własny wynik po transferze, np. curl -o /dev/null -s -w "%{http_code}\n" <url>, żeby sprawdzić sam kod statusu.

Zanim zaczniesz

  • Poziom trudności: początkujący do średnio zaawansowanego (sekcje o pobieraniu zbiorczym i uwierzytelnianiu są trochę bardziej zaawansowane)
  • Szacowany czas: około 15–20 minut na przejście przez podstawowe komendy
  • Czego potrzebujesz: terminala (Terminal na macOS, shell Linuxa lub PowerShell/WSL w Windows), zainstalowanego curl (sprawdź poleceniem curl --version) oraz testowego URL — jako przykład użyję publicznego assetu z GitHub Releases, bo jest stabilny i ogólnodostępny

Jak pobierać pliki za pomocą cURL: krok po kroku

Krok 1: Pobierz jeden plik

Najprościej: curl -O <url> zapisuje plik pod oryginalną nazwą, a curl -o myfile.zip <url> pozwala od razu go zmienić.

curl -LO https://github.com/curl/curl/releases/download/curl-8_21_0/curl-8.21.0.tar.gz

Od teraz -L dodaję zawsze, bez wyjątków — zbyt wiele razy przekierowanie zamieniało mój „download” w 400-bajtowy plik HTML. Powinieneś zobaczyć w terminalu wskaźnik postępu, który dojdzie do końca, a potem plik pojawi się w bieżącym katalogu.

Gdy komenda się powiedzie, pasek postępu osiąga 100%, a curl-8.21.0.tar.gz pojawia się w bieżącym katalogu. Zanim go użyjesz, sprawdź plik:

ls -lh curl-8.21.0.tar.gz

Krok 2: Pobierz i zmień nazwę pliku

Użyj -o, gdy chcesz własną lokalną nazwę pliku, niezależnie od tego, jak kończy się URL:

curl -L -o curl-latest.tar.gz -S https://github.com/curl/curl/releases/download/curl-8_21_0/curl-8.21.0.tar.gz

-S ponownie włącza pokazywanie błędów, jeśli gdzieś indziej w skrypcie użyłeś też -s. Taki zestaw — -L -o <nazwa> -S — to praktycznie moja domyślna komenda do pobrania pojedynczego pliku.

Krok 3: Wznów przerwane pobieranie

Jeśli duży plik rozłączy się w połowie (słabe Wi‑Fi, skok VPN, cokolwiek), nie zaczynaj od zera. Uruchom:

curl -C - -LO https://example.com/large-file.iso

Jest jednak haczyk: działa to tylko wtedy, gdy serwer obsługuje zapytania zakresowe bajtów. Accept-Ranges: bytes jest przydatną pozytywną wskazówką, ale jego brak nie dowodzi, że zakresy są niewspierane. Pewny test to odpowiedź serwera na rzeczywiste żądanie zakresowe: wznowione pobieranie zwykle zwraca 206 Partial Content z poprawnym Content-Range. Uruchom komendę wznowienia i sprawdź status przez -v albo -D -; jeśli serwer ignoruje zakres albo odrzuca przesunięcie, zacznij pobieranie świadomie od nowa, zamiast zakładać, że częściowy plik nadaje się do użycia.

Niezawodne pobieranie cURL wznawia się po przerwaniu i kończy po weryfikacji sumy kontrolnej

Krok 4: Pobierz z paskiem postępu albo po cichu

Jeśli chcesz czystszy widok w interaktywnym terminalu: curl -# -LO <url>. Jeśli piszesz skrypty lub zadania cron i zależy Ci tylko na błędach, bez hałasu: curl -sS -LO <url>. Wersji cichej używam niemal wszędzie, poza ręcznym debugowaniem.

Krok 5: Ogranicz prędkość pobierania

Na współdzielonym łączu biurowym (albo gdy nie chcę być tą osobą, która zjada całe pasmo podczas wideorozmowy) ograniczam transfer tak:

curl --limit-rate 1M -LO https://example.com/big-dataset.zip

Jednostki K, M i G oznaczają odpowiednio kilobajty, megabajty i gigabajty na sekundę.

Krok 6: Zapisz nagłówki odpowiedzi obok pliku

Czasem muszę wiedzieć dokładnie, co serwer zwrócił — typ zawartości, nagłówki cache i tym podobne — bez zaśmiecania terminala:

curl -L -D headers.txt -o file.zip https://example.com/file.zip

Ta komenda zapisuje nagłówki odpowiedzi do headers.txt, a właściwy plik trafia do file.zip. Świetne przy diagnozowaniu niezgodności content-type albo sprawdzaniu, czy CDN rzeczywiście cache’uje to, co myślisz, że cache’uje.

Wskazówki i typowe pułapki

  • Wskazówka: Zawsze domyślnie używaj -L. Naprawdę nie widzę żadnej wady w dodaniu tej flagi, a zapomnienie o niej kosztowało mnie godziny.
  • Wskazówka: W skryptach łącz --fail z komendą pobierania, żeby odpowiedź spoza zakresu 2xx faktycznie powodowała błąd i zakończenie skryptu, zamiast po cichu zapisać stronę błędu jako plik.
  • Pułapka: Nie łącz -C - z --remove-on-errorcURL podaje, że te opcje są niezgodne, ponieważ wznawianie wymaga, by częściowy plik nadal istniał.
  • Pułapka: -O może nadpisać pliki bez ostrzeżenia. Jeśli pobierasz wsadowo do współdzielonego katalogu, użyj --output-dir, żeby trzymać wszystko w jednym miejscu.

Jak pobierać wiele plików i robić pobieranie wsadowe za pomocą cURL

Przykłady z jednym plikiem są najłatwiejsze. Prawdziwe workflow, które budowałem — pobieranie nocnych eksportów danych, synchronizacja binariów między serwerami buildowymi — wymagały współbieżności, a tu większość poradników po prostu się urywa. Warto znać trzy podejścia, z których każde jest trochę bardziej zaawansowane od poprzedniego.

Podejście 1: Wiele URL-i w jednej komendzie cURL

Najprościej po prostu wypisać adresy:

curl -LO https://example.com/a.zip -LO https://example.com/b.zip -LO https://example.com/c.zip

To działa, ale jest sekwencyjne — curl kończy jeden plik, zanim zacznie następny. Dobre dla trzech plików, bolesne dla trzystu.

Podejście 2: Równoległe pobieranie z --parallel (curl 7.66+)

Od curl 7.66 możesz dodać --parallel (albo -Z), aby pobierać wiele URL-i równocześnie:

curl --parallel --parallel-max 5 --remote-name-all \
  https://example.com/a.zip https://example.com/b.zip https://example.com/c.zip

Warto wiedzieć, że domyślny limit równoległości to aż 50, czyli znacznie więcej jednoczesnych połączeń, niż większość serwerów (albo Twoja sieć) będzie wdzięczna. Ja ustawiam --parallel-max jawnie i zachowawczo — zwykle 4 do 8 — zamiast ufać domyślnej wartości.

Podejście 3: xargs i pętle Bash dla współbieżności z listy URL-i

Przy dużej liście adresów w pliku tekstowym zwykle sięgam po xargs:

cat urls.txt | xargs -n1 -P 8 curl -O -L

Albo, jeśli chcę mieć większą kontrolę nad tym, co dzieje się z każdym zadaniem, używam pętli bash z procesami w tle:

while read -r url; do
  curl -O -L "$url" &
done < urls.txt
wait

wait na końcu ma znaczenie — bez niego skrypt zakończy się, zanim pobieranie w tle dobiegnie końca.

Kiedy zamiast tego użyć wget albo aria2

Powiem wprost: cURL nie zawsze jest właściwym narzędziem. Jeśli chcesz skopiować całe drzewo katalogów strony, wget -r robi rekurencyjne crawlowanie „z pudełka” w sposób, do którego cURL po prostu nie został zaprojektowany. Jeśli potrzebujesz pobierania wieloźródłowego, dzielonego na segmenty, żeby wycisnąć maksimum z jednego ogromnego pliku, aria2c bywa naprawdę szybsze.

NarzędzieNajlepsze zastosowanie
cURLPrecyzja, skryptowanie, pobieranie pojedynczych plików lub małych paczek, praca z API
wgetRekurencyjne pobieranie i mirroring stron, prostsze zbiorcze pobieranie plików statycznych
aria2Pobieranie wieloźródłowe i segmentowe, maksymalizacja przepustowości przy dużych plikach

Moc cURL zawsze leżała w precyzji i łączeniu elementów — potoki, skrypty, elastyczność protokołów — a nie w brutalnym crawlowaniu.

Jak pobierać chronione pliki za pomocą cURL: wzorce uwierzytelniania

Większość poradników o cURL kończy na -u user:pass i tyle. To relikt wcześniejszego internetu. W 2026 pliki, które faktycznie pobieram, pochodzą z REST API, paneli opartych na sesjach i systemów CI — a każdy z nich wymaga innego rodzaju danych uwierzytelniających.

Basic Auth

curl -u username:password -O https://legacy-server.example.com/file.zip

Działa w przypadku starszych serwerów FTP albo prostych endpointów HTTP. Pamiętaj tylko, że hasło trafia do historii powłoki i listy procesów, jeśli nie zachowasz ostrożności — nie używałbym tego do niczego wrażliwego.

Uwierzytelnianie Bearer / OAuth Token

To jest opcja, o której w wielu poradnikach mówi się za mało, a ja korzystam z niej najczęściej:

curl -H "Authorization: Bearer $GITHUB_TOKEN" \
  -LO https://api.github.com/repos/curl/curl/releases/assets/12345

To prawdziwy wzorzec pobierania prywatnego assetu z GitHub Releases — podmień token i identyfikator assetu. REST API i zasoby chronione OAuth2 mówią dziś właśnie tym językiem.

Uwierzytelnianie oparte na cookies

W aplikacjach webowych, gdzie logowanie tworzy sesję, zapisz plik cookies podczas logowania i użyj go ponownie przy pobieraniu:

curl -c cookies.txt -d "user=me&pass=secret" https://example.com/login
curl -b cookies.txt -O https://example.com/protected/file.zip

Plik .netrc w środowiskach skryptowych i CI

To mój ulubiony sposób dla wszystkiego, co ma działać bez nadzoru. Utwórz plik ~/.netrc (albo _netrc w Windows):

machine example.com
login myusername
password mypassword

Zabezpiecz go poleceniem chmod 600 ~/.netrc, a potem odwołuj się do niego tak:

curl --netrc -LO https://example.com/protected-file.zip

Zaletą jest to, że dane logowania nigdy nie trafiają do historii terminala ani do źródeł skryptu — naprawdę ważne w CI/CD, gdzie logi często zapisują cały skrypt w całości.

Metoda uwierzytelnianiaFlaga/opcjaNajlepsze zastosowanie
Basic auth-u user:passStarsze FTP, prosty HTTP
Bearer token-H "Authorization: Bearer <token>"REST API, OAuth2
Cookie auth-b cookies.txt (+ -c do zapisu)Aplikacje webowe oparte na sesji
Plik .netrc--netrc lub --netrc-fileCI/CD, środowiska skryptowe

Ręcznie rysowane bloki postępu, strzałka ponawiania i ukończony folder

Rozwiązywanie najczęstszych błędów pobierania cURL

To jest sekcja, której naprawdę brakowało mi na początku, bo prawie nikt jej nie opisuje. „Dlaczego moje pobieranie curl nie działa” to prawdziwe, częste i frustrujące zapytanie — a poprawki zwykle sprowadzają się do jednej linii, gdy już znasz przyczynę.

ObjawPrawdopodobna przyczynaNaprawa
curl: (60) SSL certificate problemSamopodpisany lub wygasły certyfikat--cacert <file> albo -k (tylko dev)
403 Forbidden / pusty plikSerwer blokuje domyślny User-Agent curl-A "Mozilla/5.0..." albo -H "User-Agent: ..."
Pobieranie zaczyna się od 0 przy -C -Serwer nie obsługuje RangeSprawdź curl -I <url> i szukaj Accept-Ranges: bytes
Zapisano plik o rozmiarze 0 BNie podążono za przekierowaniemDodaj flagę -L
curl: (28) Operation timed outWolny serwer lub problemy z siecią--connect-timeout 10 --max-time 300 + --retry 3
Zapisano stronę HTML zamiast plikuStrona wymaga renderowania JavaScriptcurl nie wykonuje JS — zobacz sekcję poniżej

Błędy certyfikatu SSL: co znaczą i jak je naprawić

Błąd 60 oznacza, że curl nie mógł zweryfikować certyfikatu SSL serwera — zwykle dlatego, że jest samopodpisany, wygasły albo wystawiony przez urząd certyfikacji, któremu curl nie ufa. Jeśli kontrolujesz serwer, wskaż curlowi właściwy pakiet CA przez --cacert /path/to/ca.pem. Flaga -k (--insecure) całkowicie pomija weryfikację, co jest w porządku w lokalnym środowisku deweloperskim, ale bardzo złym pomysłem w czymkolwiek związanym z produkcją albo danymi realnych użytkowników.

403 Forbidden i puste pobrania

Zaskakująco wiele serwerów blokuje żądania, które identyfikują się jako curl/8.21.0 (domyślny User-Agent cURL), uznając je za boty albo scrapery. Zwykle wystarczy udawać przeglądarkę:

curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" -LO https://example.com/file.zip

Żeby sprawdzić, co naprawdę wraca, zanim pobierzesz cały plik, używam: curl -o /dev/null -s -w "%{http_code}\n" <url>.

Timeouty, ponawianie prób i niestabilne połączenia

To jest komenda, którą wytatuowałbym sobie na ramieniu, gdybym był odważniejszy w kwestii tatuaży.

Mój sprawdzony zestaw do pobierania, którego naprawdę używam w skryptach produkcyjnych, łączy wszystkie flagi niezawodności:

curl -L -C - --retry 5 --retry-delay 3 --connect-timeout 10 --max-time 600 --fail -O <url>

Czyli: podążanie za przekierowaniami, wznowienie, pięć ponowień z 3-sekundowym opóźnieniem, 10-sekundowy timeout połączenia, 10-minutowy limit całkowity i twardy fail przy złym statusie HTTP — praktycznie wszystko, czego nauczyłem się dodawać przez bolesne doświadczenie.

cURL w prawdziwej automatyzacji: pipeline’y CI/CD, potoki i bezpieczeństwo skryptów

Przekazywanie wyjścia cURL do innych narzędzi

curl wcale nie musi niczego zapisywać na dysk — bezpośrednie przekazanie wyjścia do innej komendy to jedna z jego najbardziej niedocenianych cech:

curl -sL https://example.com/archive.tar.gz | tar xz
curl -s https://api.example.com/data | jq '.results'

Pobieranie i rozpakowywanie albo pobieranie i parsowanie w jednej linii. To wzorzec, którego używam ciągle przy jednorazowych pobraniach danych.

Używanie cURL w GitHub Actions i CI/CD

Minimalny krok w GitHub Actions, który pobiera binarkę z logiką ponawiania i wyraźnie kończy się błędem, jeśli coś pójdzie nie tak:

- name: Download binary
  run: |
    curl -L --fail --retry 3 --retry-delay 5 \
      -o app-binary "https://example.com/releases/app-binary"

Wszelkie tokeny przechowuj jako sekrety CI i odwołuj się do nich przez zmienne środowiskowe — nigdy nie wpisuj ich na sztywno do samego skryptu. I używaj --fail (albo --fail-with-body, jeśli do debugowania potrzebujesz treści błędu), żeby uszkodzone pobranie rzeczywiście psuło build, zamiast cicho przechodzić z bezwartościowymi danymi.

Bezpieczeństwo komendy curl | sh

To pytanie pojawia się niemal na każdym forum dla developerów, i słusznie: podanie curl bezpośrednio do sh oznacza wykonywanie zdalnego kodu, którego nie sprawdziłeś, opierając się wyłącznie na zaufaniu, że serwer nie został przejęty i połączenie nie zostało podsłuchane. To jest realne ryzyko — nie paranoja, tylko zwykła obawa o łańcuch dostaw.

Bezpieczniejszy wzorzec polega na tym, żeby najpierw pobrać plik, przejrzeć skrypt, sprawdzić sumę kontrolną albo podpis GPG, jeśli są dostępne, a dopiero potem go uruchomić:

curl -sL https://example.com/install.sh -o install.sh
cat install.sh   # naprawdę to przeczytaj
sha256sum install.sh   # porównaj z opublikowaną sumą kontrolną, jeśli jest dostępna
bash install.sh

Znane instalatory, takie jak rustup i Homebrew, nadal używają wzorca curl | sh, i w ich konkretnych przypadkach jest on zwykle akceptowany, bo maintainerzy i kanał dystrybucji są dobrze ugruntowani. Ja i tak wolę poświęcić dodatkowe dziesięć sekund na sprawdzenie skryptu, niż przekonać się boleśnie, że nie powinienem był ufać mu w ciemno.

Kiedy cURL nie wystarcza: strony renderowane przez JS, antyboty i dane strukturalne

Jest taki scenariusz, który często wywraca ludzi do góry nogami, choć zwykle nie jest to ich wina: uruchamiasz curl -O na czymś, co wygląda jak zwykła strona, a zamiast treści dostajesz pustą powłokę HTML, stronę wyzwania Cloudflare albo coś przypominającego śmieci. curl zrobił dokładnie to, do czego został stworzony — pobrał surową odpowiedź HTTP — ale nie umie wykonywać JavaScriptu, rozwiązywać CAPTCHA ani przechodzić przez systemy odcisku palca antybotów. To nie są błędy cURL; to po prostu nie należy do jego zakresu działania.

Dlaczego cURL zawodzi na nowoczesnych stronach

Nowoczesne aplikacje SPA często zwracają niemal pusty szkielet HTML, a właściwa treść jest renderowana po stronie klienta przez JavaScript po załadowaniu strony — czego curl nigdy nie uruchomi. Do tego systemy takie jak Cloudflare i Akamai aktywnie serwują strony wyzwania każdemu, kto nie wygląda jak prawdziwa przeglądarka, a powtarzające się żądania curl z tego samego IP bardzo szybko mogą zostać ograniczone albo oznaczone jako ruch botów.

Następny krok: API do scrapowania AI dla developerów

Powiedziałbym, że curl jest właściwym narzędziem dla około 80% pobrań plików i danych — zasobów statycznych, odpowiedzi API, wszystkiego, co jest zwykłym zasobem HTTP. To te pozostałe 20%, czyli strony mocno oparte na JavaScript albo chronione przed botami, sprawiają, że widziałem developerów walczących godzinami z nagłówkami i User-Agentami, zanim w końcu odpuszczali i sięgali po inną warstwę.

Właśnie tę lukę mój zespół chciał domknąć tworząc Thunderbit, obok rozszerzenia Chrome, z którego większość osób nas kojarzy. Po stronie developerów otwarte API Thunderbit daje POST /distill, które zwraca czysty Markdown gotowy dla LLM z podanego URL — z renderowaniem strony obsługiwanym przez usługę — oraz POST /extract, które zwraca ustrukturyzowany JSON zgodny ze schematem, gdy potrzebujesz prawdziwych danych polowych zamiast tekstu do czytania. Jest też serwer MCP, dzięki któremu agenci w Claude lub Cursor mogą wywoływać thunderbit_distill i thunderbit_extract w trakcie zadania, oraz CLI (npx @thunderbit/thunderbit-cli distill <url>), które bardzo przypomina cURL w terminalu. Wyjście JSON możesz przekazać do jq, np. thunderbit distill <url> --format json | jq -r '.data.markdown'; wyjście --format markdown możesz z kolei skierować do narzędzia tekstowego albo do pliku.

Porównanie obok siebie jest bardzo wyraźne. Zapytanie curl do strony renderowanej przez JS może zwrócić głównie pusty <div id="root"></div>. Odpowiednik thunderbit distill zwraca renderowaną treść strony w czystym Markdown. Distill kosztuje 1 kredyt za URL, a Extract 20 kredytów za URL. Obecne limity zależne od endpointu są różne: Batch Distill obsługuje do 100 URL-i na jedno zadanie, a Batch Extract przyjmuje do 50 URL-i ze wspólnym schematem. Sprawdź aktualną dokumentację API, zanim zaplanujesz obciążenie produkcyjne.

Jeśli dopiero zaczynasz z tym tematem, nasze własne wyjaśnienie czym właściwie jest web scraping będzie dobrym punktem startowym, a przewodnik po scrapowaniu bez kodowania opisuje tę samą sprawę z perspektywy osób nietechnicznych w Twoim zespole. Dla szerszego porównania narzędzi z tej kategorii przygotowaliśmy też zestawienie najlepszych AI web scraperów, które warto znać.

Krótka ściąga: cURL do pobierania plików

ZadanieKomenda
Podstawowe pobraniecurl -LO <url>
Własna nazwa plikucurl -L -o myfile.zip <url>
Wznawianie pobieraniacurl -C - -LO <url>
Cicho, ale z pokazaniem błędówcurl -sSL -O <url>
Pobieranie równoległecurl --parallel --parallel-max 5 -O <url1> -O <url2>
Uwierzytelnianie tokenem Bearercurl -H "Authorization: Bearer <token>" -LO <url>
Sprawdzona komenda do skryptówcurl -LO --retry 5 --retry-delay 3 --max-time 600 --fail <url>
Przekazanie do narzędzia do rozpakowaniacurl -sL <url> | tar xz

Podsumowanie i najważniejsze wnioski

Pobieranie pliku przez curl zaczyna się banalnie — curl -O i właściwie gotowe — ale prawdziwa umiejętność leży w warstwach pod spodem: wiedzieć, kiedy dodać -L, kiedy wznowić zamiast zaczynać od nowa, jaki wzorzec uwierzytelniania naprawdę pasuje do Twojego workflow i co zrobić, gdy zamiast oczekiwanego pliku pojawi się 403 albo pusta powłoka HTML. Każde z tych podejść kiedyś mnie uratowało, zwykle tuż po tym, jak boleśnie przekonałem się, dlaczego było ważne.

curl nadal pozostaje moim domyślnym narzędziem do prostego pobierania plików i skryptowalnej pracy HTTP — jest szybki, dostępny praktycznie wszędzie i świetnie komponuje się z resztą potoku shellowego. Ale gdy trafiasz na stronę renderowaną przez JavaScript albo ścianę antybotów, to nie jest problem, który rozwiążesz kolejną flagą cURL; to znak, że potrzebujesz innej warstwy, i właśnie wtedy API takie jak Thunderbit przejmuje zadanie bez wyciągania Cię z terminala.

Dodaj tę ściągę do zakładek, przetestuj komendę z ponawianiem i wznawianiem przy następnym niestabilnym pobieraniu, a jeśli trafisz na mur, po którym curl zwraca już tylko śmieci, będziesz wiedzieć, jak wygląda następny krok — na stronie z cennikiem Thunderbit znajdziesz aktualny podział kredytów, jeśli chcesz sprawdzić, ile kosztuje taki przeskok, a nasz kanał YouTube zawiera walkthrough, jeśli wolisz oglądać niż czytać.

FAQ o pobieraniu plików za pomocą cURL

Jak pobrać plik przez cURL i zapisać go pod konkretną nazwą?

Użyj -o i podaj wybraną nazwę pliku: curl -L -o twojanazwa.ext <url>. Dodaj -L, żeby przekierowania nie zepsuły pobierania.

Jak wznowić nieudane pobieranie cURL?

Uruchom curl -C - -LO <url>. Działa to tylko wtedy, gdy serwer obsługuje zapytania zakresowe — najpierw sprawdź curl -I <url> i szukaj w odpowiedzi Accept-Ranges: bytes.

Czy cURL może pobierać pliki wymagające logowania?

Tak, na cztery główne sposoby: basic auth (-u user:pass), token Bearer (-H "Authorization: Bearer <token>"), sesje oparte na cookies (-b cookies.txt) albo plik .netrc w środowiskach skryptowych. Pełny opis i zastosowania znajdziesz w sekcji o uwierzytelnianiu powyżej.

Jaka jest różnica między cURL a wget przy pobieraniu plików?

cURL obsługuje więcej protokołów i zwykle lepiej sprawdza się w skryptach, potokach oraz przy precyzyjnym pobieraniu pojedynczych plików lub małych partii. wget jest stworzony do rekurencyjnego crawlowania i mirroringu całych katalogów stron, więc lepiej nadaje się do masowego pobierania statycznych zasobów.

Dlaczego cURL pobiera stronę HTML zamiast właściwego pliku?

Najczęściej są dwie przyczyny: zapomniałeś flagi -L i serwer przekierował Cię gdzie indziej albo strona wymaga JavaScriptu do wyrenderowania właściwej treści — a curl po prostu nie wykonuje JS. W drugim przypadku potrzebujesz narzędzia z możliwością renderowania, a nie kolejnych flag cURL.

Dowiedz się więcej

Ke
Ke
CTO w Thunderbit | Starszy data scientist i ekspert ML Dzięki prawie dziesięciu latom doświadczenia w uczeniu maszynowym i data science, Ke Shen jest absolwentem Columbia University i byłym starszym data scientistą w Walmart Labs. Dysponując dogłębną, uznaną przez branżowych ekspertów wiedzą w zakresie Python, R, Java i statystyki, dzieli się sprawdzonymi w boju spostrzeżeniami na temat wdrażania złożonych algorytmów AI — od teorii po architekturę gotową do produkcji.
Topics
pobieranie plików cURLautomatyzacja w linii komendniezawodny transfer plików
Spis treści
Thunderbit · Agent AI do danych z internetu

Wyciągaj dane z dowolnej strony w 1 klik

Zaufało nam ponad 250 000 użytkowników
dostępny darmowy plan
Od strony do arkusza kalkulacyjnego
Opisz, czego potrzebujesz — Agent AI Thunderbit zbierze to i wyeksportuje do Excela, Google Sheets, Airtable lub Notion. Start jest darmowy.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week