Jeśli kiedykolwiek pracowałeś z API lub serwerami, pewnie znasz już cURL. To narzędzie to prawdziwy kombajn do wysyłania żądań HTTP i nie tylko. Ale co zrobić, gdy musisz wysłać setki, a nawet tysiące zapytań? W tym artykule pokażę Ci, jak wykorzystać cURL do masowego wysyłania zapytań – szybko, sprawnie i bez bólu głowy. Gotowy? Zaczynamy!
Czym jest cURL?
Zanim przejdziemy do konkretów, krótka definicja. cURL (Client URL) to darmowe narzędzie dostępne w większości systemów operacyjnych. Pozwala na wysyłanie zapytań HTTP (i innych protokołów, np. FTP) w terminalu lub w kodzie. Możesz go użyć do pobierania danych, wysyłania formularzy, testowania endpointów API, a nawet do skrobania stron.
Dlaczego warto wysyłać wiele zapytań?
Wyobraź sobie, że:
- Musisz przetestować API, wysyłając setki żądań do różnych endpointów.
- Chcesz pobrać dane z wielu źródeł jednocześnie.
- Potrzebujesz wykonać masową aktualizację danych.
W takich sytuacjach ręczne wpisywanie komend cURL byłoby koszmarem. Na szczęście są sposoby, żeby to zautomatyzować.
Jak wysyłać wiele zapytań jednocześnie?
Oto kilka metod na zautomatyzowanie masowych zapytań z użyciem cURL. Każda z nich jest dostosowana do różnych potrzeb i poziomów zaawansowania.
1. Użycie skryptów bash
Najprostszym sposobem na wysyłanie wielu zapytań jest napisanie skryptu w bashu. Oto przykład:
Skrypt do wysyłania zapytań do wielu adresów URL
#!/bin/bash # Plik z listą adresów URL URL_FILE="urls.txt" # Iteracja przez każdą linię w pliku while IFS= read -r url; do echo "Wysyłam zapytanie do: $url" curl -X GET "$url" -o "output_$(basename $url).html" done < "$URL_FILE"
Co robi ten skrypt?
- Pobiera listę adresów URL z pliku
urls.txt
. - Wysyła zapytanie GET do każdego adresu.
- Zapisuje odpowiedzi w osobnych plikach (
output_<nazwa_pliku>.html
).
Jak uruchomić?
- Stwórz plik
urls.txt
i wklej adresy URL, jeden na linię. - Zapisz powyższy kod w pliku
send_requests.sh
. - W terminalu nadaj plikowi uprawnienia do uruchamiania:bashSkopiuj kod
chmod +x send_requests.sh
- Uruchom skrypt:bashSkopiuj kod
./send_requests.sh
2. Równoległe wysyłanie zapytań z GNU Parallel
Jeśli chcesz zaoszczędzić czas, możesz wysyłać zapytania równolegle. W tym celu świetnie sprawdzi się narzędzie GNU Parallel.
Skrypt z użyciem GNU Parallel
#!/bin/bash # Plik z listą adresów URL URL_FILE="urls.txt" # Komenda równoległego wysyłania zapytań cat "$URL_FILE" | parallel -j 10 curl -X GET {} -o "output_{/}.html"
Co tu się dzieje?
parallel -j 10
– Wysyła maksymalnie 10 zapytań jednocześnie.{}
– Reprezentuje adres URL z pliku.{/}
– Wyciąga tylko nazwę pliku z URL-a (przydatne do zapisu odpowiedzi).
3. Wielowątkowość w Pythonie
Jeśli bash to dla Ciebie za mało, możesz użyć Pythona. Oto przykład z wykorzystaniem modułu requests
i concurrent.futures
.
Kod w Pythonie
import requests from concurrent.futures import ThreadPoolExecutor # Lista URLi do zapytań urls = [ "https://example.com", "https://jsonplaceholder.typicode.com/posts", "https://jsonplaceholder.typicode.com/comments" ] # Funkcja wysyłająca zapytanie def fetch_url(url): try: print(f"Wysyłam zapytanie do: {url}") response = requests.get(url) filename = f"output_{url.split('//')[1].replace('/', '_')}.html" with open(filename, 'w') as f: f.write(response.text) print(f"Zapisano odpowiedź w: {filename}") except Exception as e: print(f"Błąd przy zapytaniu do {url}: {e}") # Równoległe wysyłanie zapytań with ThreadPoolExecutor(max_workers=5) as executor: executor.map(fetch_url, urls)
Jak uruchomić?
- Zainstaluj moduł
requests
(jeśli jeszcze go nie masz):bashSkopiuj kodpip install requests
- Zapisz powyższy kod w pliku
send_requests.py
. - Uruchom skrypt:bashSkopiuj kod
python send_requests.py
4. cURL w trybie batch z pliku
cURL ma wbudowaną opcję do obsługi plików batchowych.
Przykład pliku batchowego
Stwórz plik commands.txt
z zawartością:
curl -X GET "https://example.com" -o "output_example.html" curl -X GET "https://jsonplaceholder.typicode.com/posts" -o "output_posts.json" curl -X GET "https://jsonplaceholder.typicode.com/comments" -o "output_comments.json"
Następnie uruchom:
bash commands.txt
To proste rozwiązanie dla mniej skomplikowanych scenariuszy.
Jak radzić sobie z zakłopotaniem (error handling)?
Nie wszystko pójdzie gładko, zwłaszcza przy masowych zapytaniach. Oto kilka wskazówek:
- Sprawdzaj status kodu odpowiedzi.
Dodaj flagę-w '%{http_code}'
w cURL, żeby zobaczyć kod odpowiedzi. - Loguj błędy.
W bashu możesz przekierować błędy do pliku:bashSkopiuj kodcurl -X GET "https://example.com" 2>> errors.log
- Używaj retry.
W cURL możesz ustawić automatyczne ponawianie zapytań:bashSkopiuj kodcurl --retry 5 --retry-delay 2 -X GET "https://example.com"
Jak uniknąć wybuchowości (limitów API)?
Jeśli Twoje zapytania są blokowane, bo przekraczasz limity API, zastosuj:
- Ograniczenie liczby zapytań na sekundę.
W bashu możesz dodać opóźnienie:bashSkopiuj kodsleep 1
- Uwierzytelnianie.
Większość API wymaga klucza dostępowego. Dodaj go w nagłówkach:bashSkopiuj kodcurl -H "Authorization: Bearer YOUR_TOKEN" "https://api.example.com"
- Równoważenie obciążenia.
Rozdziel zapytania na różne godziny lub serwery.
Jak widzisz, cURL to niesamowite narzędzie, które świetnie nadaje się do wysyłania wielu zapytań. Niezależnie od tego, czy wybierzesz prosty skrypt bash, GNU Parallel, czy Pythona, ważne jest, żeby dobrać odpowiednią metodę do swojego przypadku. I pamiętaj – zawsze testuj swoje rozwiązania na małej próbce, zanim odpalisz masówkę!