import concurrent.futures | |
import requests | |
def download_single(url): | |
headers = { | |
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' | |
} | |
response = requests.get(url, headers=headers, timeout=5) | |
if response.status_code == 200: | |
return response.content | |
else: | |
raise Exception("Failed to download URL") | |
def download_urls(urls, threads=1): | |
with concurrent.futures.ThreadPoolExecutor(max_workers=threads) as executor: | |
futures = [] | |
for url in urls: | |
future = executor.submit(download_single, url) | |
futures.append(future) | |
results = [] | |
i = 0 | |
for future in concurrent.futures.as_completed(futures): | |
try: | |
result = future.result() | |
results.append(result) | |
i += 1 | |
yield f"{i}/{len(urls)}", results | |
except Exception: | |
pass | |
yield "Done", results | |