e-vca / data /ckan.py
rapsoj's picture
Modlarised app
a6ec964 verified
Raw
History Blame Contribute Delete
2.18 kB
import os
import requests
def download_resource_ckan(iso3_code, dataset_prefix="cod-ab", download_dir="downloads"):
iso3 = iso3_code.lower()
dataset_id = f"{dataset_prefix}-{iso3}"
api_url = f"https://data.humdata.org/api/3/action/package_show?id={dataset_id}"
headers = {'User-Agent': 'Mozilla/5.0'}
# Match logic
if dataset_prefix == "cod-ps":
keyword_match = lambda name: name.startswith(f"{iso3}_admpop_adm") and name.endswith(".csv")
else:
keyword_match = lambda name: "_SHP.zip" in name
try:
response = requests.get(api_url, headers=headers)
if response.status_code != 200:
print(f"[{iso3.upper()}] Dataset not found (HTTP {response.status_code}): {dataset_id}")
return []
data = response.json()
if not data.get("success") or "result" not in data:
print(f"[{iso3.upper()}] API returned malformed response.")
return []
# Find and download all matching resources
os.makedirs(download_dir, exist_ok=True)
downloaded_files = []
for resource in data["result"].get("resources", []):
name = resource.get("name", "")
if keyword_match(name):
url = resource.get("url")
if not url:
continue
filepath = os.path.join(download_dir, name)
try:
with requests.get(url, stream=True) as r:
r.raise_for_status()
with open(filepath, 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
print(f"[{iso3.upper()}] Downloaded: {filepath}")
downloaded_files.append(filepath)
except Exception as e:
print(f"[{iso3.upper()}] Failed to download {name}: {e}")
if not downloaded_files:
print(f"[{iso3.upper()}] No matching files found in dataset '{dataset_id}'.")
return downloaded_files
except Exception as e:
print(f"[{iso3.upper()}] Error: {e}")
return []