tr-acikveri
English summary. tr-acikveri is one Python client for Turkish public open-data
portals that run CKAN (Istanbul İBB, İzmir, Konya, Gaziantep, Manisa, Trabzon and
others): search datasets across many portals, inspect metadata, list resources by
format, and download them politely with caching, rate limiting, retries and resume.
It reads the CSV files these portals actually publish (Windows-1254 or UTF-8 with BOM,
; delimiters, decimal commas) and GeoJSON, ships a Turkish CLI, and reminds you that
every dataset's licence belongs to the publishing portal.
Türkiye'deki açık veri portalları için tek istemci.
Belediyelerin ve kurumların açık veri portallarının çoğu
CKAN üzerinde çalışır ve aynı CKAN Action API'sini sunar.
tr-acikveri bu portalları tek bir arayüzün arkasına koyar:
- Bir veya birden çok portalda veri seti arama (portallar paralel sorgulanır, hata veren portal aramayı durdurmaz).
- Kurum, etiket, veri seti bilgisi ve biçime göre kaynak listeleme (CSV, GeoJSON, SHP, XLSX, KML ...; portalların tutarsız biçim adları normalleştirilir).
- Kibar indirme:
tr-acikveri/<sürüm>User-Agent'ı, sunucu başına hız sınırı, zaman aşımı,Retry-Afterdikkate alan yeniden deneme, diskte önbellek ve yarıda kalan indirmeyi kaldığı yerden sürdürme (HTTPRange). - Türkçe dosyalar: cp1254 / UTF-8 BOM kodlama tespiti,
;ayraç tespiti,1.234,56gibi sayıların okunması, eskicrsalanlı GeoJSON (ör. EPSG:5254). - İsteğe bağlı pandas / geopandas dönüşümleri ve Türkçe komut satırı (
ara,bilgi,indir,portallar,kurumlar,etiketler).
Yalnızca Python standart kütüphanesiyle çalışır; Python 3.9 ve üstü gerekir.
Lisans uyarısı. Bu paket MIT lisanslıdır, ancak indirdiğiniz verilerin lisansı her portala ve veriyi yayımlayan kuruma aittir (İBB Açık Veri Lisansı, İzmir BB Açık Veri Lisansı, CC BY 4.0, CC BY-NC ...). Paket size veriler üzerinde hiçbir hak vermez. Her veri setinin lisansını (
bilgikomutu veyaDataset.license_title) okuyun, koşullarına uyun ve kaynak gösterin. Ticari olmayan (NC) lisanslara özellikle dikkat edin.
Kurulum
pip install tr-acikveri # yalnızca standart kütüphane
pip install "tr-acikveri[pandas]" # + DataFrame dönüşümü
pip install "tr-acikveri[excel]" # + XLSX/XLS okuma (pandas + openpyxl)
pip install "tr-acikveri[geo]" # + GeoDataFrame (geopandas)
pip install "tr-acikveri[certifi]" # + Mozilla CA paketi (bkz. "TLS sertifikaları")
Hızlı başlangıç (komut satırı)
tr-acikveri portallar # CKAN portalları
tr-acikveri portallar --hepsi # CKAN olmayanlar dahil
tr-acikveri ara otopark -p ibb -p izmir -f csv -n 5
tr-acikveri bilgi ibb ispark-otopark-bilgileri
tr-acikveri indir konya otopark-bilgileri -f csv -o veri/
tr-acikveri kurumlar izmir --json
Örnek çıktı (kısaltılmış, 2026-11-09):
[konya] otopark-bilgileri
Otopark Bilgileri (CSV) · Destek Hizmetleri Dairesi Başkanlığı
[izmir] otopark-ucretleri
Otopark Ücretleri (CSV, XLSX) · İZELMAN A.Ş.
Toplam eşleşme 3 (izmir: 2; konya: 1); gösterilen 3.
Ortak seçenekler: --onbellek KLASÖR, --onbellek-suresi SN, --onbelleksiz,
--zaman-asimi SN, --aralik SN (aynı sunucuya iki istek arası, varsayılan 1 sn),
--yeniden-deneme N, --iletisim E-POSTA (User-Agent'a eklenir), --json.
-p portal anahtarı, şehir adı (İzmir, istanbul) veya herhangi bir CKAN adresi
olabilir. Yönlendirilen çıktı (ör. > sonuc.json) her zaman UTF-8 yazılır.
Hızlı başlangıç (Python)
from tr_acikveri import AcikVeri
av = AcikVeri(contact="ad.soyad@kurum.edu.tr") # iletişim adresi önerilir
sonuc = av.search("otopark", portals=["ibb", "izmir", "konya"], formats=["csv"], rows=5)
for ds in sonuc:
print(ds.portal, ds.name, ds.formats, ds.license_title)
print(sonuc.counts, sonuc.errors)
ds = av.dataset("konya", "otopark-bilgileri")
kaynak = ds.resources_by_format(["csv"])[0]
tablo = av.read_csv(kaynak) # indirir (önbellek) ve okur
print(tablo.encoding, tablo.delimiter, tablo.columns)
kapasite = tablo.numeric("bolgekapasite") # "1.250" -> 1250.0
df = av.to_dataframe(kaynak, numeric=True) # [pandas]
parklar = av.search("park", portals=["trabzon"], formats=["geojson"]).datasets[0]
geo_kaynak = parklar.resources_by_format(["geojson"])[0]
geo = av.read_geojson(geo_kaynak) # FeatureCollection dict
gdf = av.to_geodataframe(geo_kaynak) # [geo]
Tek portal için alt düzey istemci:
from tr_acikveri import CkanClient
ibb = CkanClient("ibb")
sayi, sayfa = ibb.search("bisiklet", formats=["geojson"], sort="metadata_modified desc")
for ds in ibb.iter_search("hava kalitesi", limit=200):
...
kayitlar = ibb.datastore_search(resource_id, limit=100, filters={"ilce": "Kadıköy"})
Portal kaydı
Her kayıt 2026-11-09 tarihinde <adres>/api/3/action/status_show adresine yapılan tek
bir salt okunur GET isteğiyle doğrulandı; lisans notları portalın license_list
ve package_search yanıtlarından alındı. Veri seti sayıları aynı tarihe aittir.
| Anahtar | Portal | Adres | Veri seti | Lisans (portalın bildirdiği) |
|---|---|---|---|---|
ibb |
İstanbul BB | https://data.ibb.gov.tr | 565 | İBB Açık Veri Lisansı |
izmir |
İzmir BB | https://acikveri.bizizmir.com | 251 | İzmir BB Açık Veri Lisansı; bazıları CC BY / belirtilmemiş |
konya |
Konya BB | https://acikveri.konya.bel.tr | 233 | CC BY 4.0 |
gaziantep |
Gaziantep | https://acikveri.gaziantep.bel.tr | 252 | Gaziantep Açık Veri Lisansı |
balikesir |
Balıkesir BB | https://acikveri.balikesir.bel.tr | 252 | Balıkesir Açık Veri Lisansı |
denizli |
Denizli | https://acikveri.denizli.bel.tr | 39 | Denizli Açık Veri Lisansı |
trabzon |
Trabzon BB | https://acikveri.trabzon.bel.tr | 206 | Trabzon Açık Veri Lisansı |
manisa |
Manisa BB | https://acikveri.manisa.bel.tr | 1389 | Manisa BB Açık Veri Lisansı (mbb-odl-1.0) |
canakkale |
Çanakkale | https://acikveri.canakkale.bel.tr | 123 | Çanakkale Açık Veri Lisansı |
bursa-yesil |
Bursa Açık Yeşil | https://acikyesil.bursa.bel.tr | 49 | kurum lisansı (yalnızca yeşil alan verisi) |
kadikoy |
Kadıköy (ilçe) | https://acikveri.kadikoy.bel.tr | 161 | karışık: CC BY, CC BY-NC, CC BY-ND |
tuzla |
Tuzla (ilçe) | https://veri.tuzla.bel.tr | 91 | CC BY |
nilufer |
Nilüfer (ilçe) | https://acikveri.nilufer.bel.tr | 65 | çoğunda belirtilmemiş; bazıları CC BY / CC BY-NC |
Desteklenmeyen (CKAN API'si yok veya kontrol sırasında erişilemedi) ve
portallar --hepsi ile listelenenler: Ankara (seffaf.ankara.bel.tr), Kocaeli
(veri.kocaeli.bel.tr), Kayseri, Küçükçekmece, Sağlık Bakanlığı (özel yazılım);
Antalya, Sakarya ve ULASAV (ulasav.csb.gov.tr; erişilemedi, API türü doğrulanamadı).
Gaziantep, Denizli, Trabzon, Çanakkale, Balıkesir ve Bursa Açık Yeşil portalları
ulasav-license kimlikli ortak CKAN şablonunu kullanır; lisans metni her portalın
/license sayfasındadır.
Kayıtta olmayan bir CKAN portalı adresle kullanılabilir veya kaydedilebilir:
from tr_acikveri import Portal, register_portal, CkanClient
CkanClient("https://acikveri.ornek.bel.tr").search("imar")
register_portal(Portal("ornek", "Örnek Belediyesi", "https://acikveri.ornek.bel.tr",
city="Örnek", license_note="CC BY 4.0"))
Portallar değişir: adres taşınabilir, API kapanabilir. Kayıttaki bilgiler kontrol tarihindeki durumu yansıtır.
API özeti
| Nesne | Açıklama |
|---|---|
AcikVeri(portals=None, cache_dir=None, cache_ttl=86400, contact=None, timeout=30, min_interval=1.0, retries=3, max_workers=4) |
Çok portallı istemci |
.search(query, portals, formats, rows, organization, tags, sort) → SearchResult |
datasets, counts, errors, total |
.dataset(portal, ad) → Dataset; .resources(portal, ad, formats) → [Resource] |
Meta veri ve kaynaklar |
.organizations(portal), .tags(portal, query) |
Kurumlar, etiketler |
.download(resource, dest=None, overwrite, resume, max_bytes, progress) → Path |
Önbelleğe veya hedefe indirme; .meta.json kaynak bilgisi |
.download_dataset(portal, ad, formats, dest_dir) |
Veri setinin tüm dosyaları |
.read_csv, .read_geojson, .load, .to_dataframe, .to_geodataframe |
Okuma |
CkanClient(portal) |
search, iter_search, dataset, resource, organizations, tags, licenses, datastore_search, action |
list_portals, get_portal, register_portal, Portal |
Portal kaydı |
read_csv, CsvTable, detect_encoding, sniff_delimiter, parse_number, read_geojson, geojson_crs |
Dosya okuyucular |
HttpClient, RetryPolicy, RateLimiter, Cache |
Taşıma katmanı |
AcikVeriError → HttpError, TransportError, CkanError → NotFoundError, UnsupportedPortalError, PortalNotFoundError, FormatError, MissingDependencyError |
Hatalar |
Yöntem ve kaynaklar
- CKAN Action API v3 — yalnızca okuma eylemleri (
status_show,package_search,package_show,resource_show,organization_list,tag_list,license_list,datastore_search), hepsiGETile. Kaynak: CKAN API belgeleri, https://docs.ckan.org/en/2.9/api/.package_searchiçinrowsen fazla 1000'e sınırlanır (CKAN'ınckan.search.rows_maxvarsayılanı). - Biçim filtresi —
res_formatSolr'da birebir eşleşen bir alan olduğundan, portallarda görülen yazımların tamamı (CSV,csv,.csv,GeoJSON,.shp,Excel...) sunucuya gönderilir; sonuç ayrıca istemci tarafında normalleştirilmiş biçimle süzülür. - HTTP —
Retry-After(saniye veya HTTP tarihi) veRange/Content-Rangeile sürdürme: RFC 9110 §10.2.3 ve §14. Yeniden deneme 408/425/429/5xx ve ağ hatalarında, üstel bekleme (+%10 rastgele) ile yapılır. Hız sınırı sunucu (host) başınadır ve iş parçacıkları arasında paylaşılır. - Kodlama — sıra: UTF-8 BOM → UTF-16 BOM → katı UTF-8 → Windows-1254 (cp1254,
Türkçe Windows kod sayfası) → ISO-8859-9. Ayraç, ilk 50 satırda en tutarlı sütun
sayısını veren adaydır (
;,,, sekme,|; eşitlikte;). - Sayılar —
parse_numberTürkçe yazımı (ondalık virgül, binlik nokta) varsayar; yalnızca nokta içeren ve binlik gruplamaya uymayan değerler (12.5) ondalık okunur.%,TL,₺ve boşluklar yok sayılır. - GeoJSON — RFC 7946 (WGS 84,
EPSG:4326). 2008 GeoJSON belirtimindekicrsalanı varsa (urn:ogc:def:crs:EPSG::5254gibi)geojson_crsbu kodu döndürür veto_geodataframeonu kullanır.
TLS sertifikaları
Sertifika doğrulaması her zaman açıktır. Bazı portallar (kontrol tarihinde
data.ibb.gov.tr) Windows'un yalnızca gerektiğinde indirdiği bir kök sertifikaya
zincirlenir; Python bu durumda CERTIFICATE_VERIFY_FAILED hatası verir.
certifi kuruluysa (pip install "tr-acikveri[certifi]") paket otomatik olarak
Mozilla CA paketini kullanır. Alternatifler: SSL_CERT_FILE ortam değişkeni,
HttpClient(ca_file=...) veya HttpClient(ssl_context=...).
Önbellek
Varsayılan klasör TR_ACIKVERI_CACHE ortam değişkeni, yoksa Windows'ta
%LOCALAPPDATA%\tr-acikveri, diğer sistemlerde ~/.cache/tr-acikveri'dir.
API yanıtları api/ altında (varsayılan 1 gün), indirilen dosyalar
files/<portal>/<kaynak kimliği>/ altında tutulur. Her dosyanın yanında kaynak
adresi, portal, veri seti, indirme zamanı ve HTTP doğrulayıcılarını içeren bir
.meta.json bulunur. İndirilen verileri bir git deposuna eklemeyin.
Sınırlamalar
- Yalnızca CKAN portalları desteklenir; özel yazılımlı portallar (Ankara, Kocaeli, Kayseri, Sağlık Bakanlığı ...) kayıtta yalnızca bilgi amaçlıdır.
- Portal listesi, veri seti sayıları ve lisans notları 2026-11-09 tarihli kontrollere dayanır; değişebilir. Bağlayıcı olan, veri setinin portaldaki lisansıdır.
- Kodlama tespiti sezgiseldir: UTF-8 olarak geçerli olan cp1254 dosyaları (çok nadir)
UTF-8 sayılır; gerekirse
encoding="cp1254"verin. API/HTMLtüründeki kaynaklar dosya değildir ve varsayılan olarak indirilmez.- Çok portallı aramada
rowsportal başına uygulanır; sonuçlar portallar arasında yeniden sıralanmaz. - Önbellekteki dosya, sunucuda güncellense bile
overwrite=True(CLI:--yeniden) verilmedikçe yeniden indirilmez.
Geliştirme
pip install -e ".[dev,pandas]"
pytest --cov=tr_acikveri
ruff check . && ruff format --check src tests && mypy src
Testler gerçek ağa hiç çıkmaz: tests/mockserver.py iki CKAN portalını, hatalı
portalları (500, HTML), 429/503 yanıtlarını, bağlantısı yarıda kopan indirmeleri ve
Range desteği olmayan sunucuları taklit eden yerel bir HTTP sunucusudur.
Lisans
MIT © 2026 Yusuf Eminoğlu. Bkz. LICENSE. Bu lisans yalnızca yazılımı kapsar; portallardan alınan veriler kendi lisanslarına tabidir.
Academic citation
@software{eminoglu_tr_acikveri,
author = {Eminoğlu, Yusuf},
title = {tr-acikveri},
year = {2026},
version = {0.1.1},
url = {https://github.com/YusufEminoglu/tr_acikveri_sdk}
}
Ayrıca bkz. CITATION.cff.
Metadata
Release files for tr-acikveri 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| tr_acikveri-0.1.1.tar.gz | 63.9 kB | With provenance | Details for tr_acikveri-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| tr_acikveri-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for tr_acikveri-0.1.1-py3-none-any.whl |
Total release size: 107.4 kB
Release files / tr_acikveri-0.1.1.tar.gz
| Download URL | tr_acikveri-0.1.1.tar.gz |
|---|---|
| Size | 63.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cdcbe62133cd7df54d0808dbe01d5f8ac494dd0ec5b05f011659beee3eeae257
|
|
BLAKE2b-256 checksum How to use checksums |
795c250ff726a3226999f549a57254c1f046cca175a3c24ac2c2df6267c7ac96
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logRelease files / tr_acikveri-0.1.1-py3-none-any.whl
| Download URL | tr_acikveri-0.1.1-py3-none-any.whl |
|---|---|
| Size | 43.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2b019e52fd8be3a040777de67152503282f986fa16bd9342595ada91da3f938f
|
|
BLAKE2b-256 checksum How to use checksums |
f371f0dc9bf92e6a9a780c40df95937eba74b1eea6dc3ee7b9319da4c4280ebf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logSecurity for tr-acikveri 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for tr_acikveri-0.1.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.