How to parse data to Excel from curl output with Python

Çağatay Uslu
3 min readFeb 1, 2021

--

…and how to schedule this job with crontab

Ara ara işim için ihtiyacım olan ve güncellenen bir veri seti var, İstanbul Ticaret Odası bu veriyi https://bilgibankasi.ito.org.tr/en/ linki üzerinden sunuyor. İstanbul’da kurulumu yapılan şirketlerin datası üzerinde belirli ve sınırlı filtrelerle arama yapabiliyorsunuz. Yeni kurulan ve var olan şirketlerin public verilerine bu şekilde ulaşarak biraz da veriyi analiz edebilme becerisiyle ihtiyacınıza yönelik hedeflemelerde bulunabilirsiniz. Mesela bir tanesi ve hatta bir fikir olarak, şirketlerin adres ve sektörel verilerine göre bir topoloji ve tahmin algoritması oluşturarak, İstanbul’da konuma göre açık hava reklam panosu reklam hedeflemesi yapabilir, bunu adres verisi ile harita üzerinde görselleştirebilirsiniz.. and so on..

Bizim ihtiyacımız olan şey ise bu veriyi kullanılabilir bir formata dönüştürüp süreci otomatize etmek fakat İTO bu verileri websitesi üzerinden sunuyor. Veriyi excele dökebilseydik, istediğimiz gibi kullanabilseydik ne güzel olurdu değil mi? Sorunlarımızdan ilki sunulan verinin analiz edilebilir olmaması… Bir diğeriyse websitesinin front end filtreleri içinde zaman aralığı olarak bir aydan öteye gidemememiz.. Fakat backend üzerinde herhangi bir filtre bulunmuyor. Üçüncüsü ise, zaman aralığı filtresini uyguladığımızda dönen veri şirketlerin ham ve detaysız bilgisi.. Detaylı bilgilere ulaşmak için tek tek her bir şirket için request atmamız gerekebilir.. Dördüncü sorun ise, bu süreci otomatize etmezsek her veriye ihtiyacımız olduğunda bunu manuel yapıyor olmamız..

Bu sorunları çözmek için ve süreci otomatize etmek için bu yazıda birlikte sırasıyla şunları yapacağız;

  • curl kullanarak İTO API’sinden ham şirket verisini çekeceğiz,
  • bu veriyi json dosyasına yazdırıp ham verisi bulunan şirketler için tek tek request atacağız, bu kez detaylı olarak oluşturduğumuz veriyi tekrar json’a yazdıracağız,
  • json verisini excel’e dökeceğiz,
  • bu süreci otomatize edip cron job yardımıyla her ayın sonunda yapmasını sağlayacağız,
  • oluşturduğumuz excel’i aws s3 üzerinde store edeceğiz,
  • ve bir link oluşturup bu indirme linkinin otomatik mail atılmasını sağlayacağız

Bu sürecin ismi hiç bilinmeyen ama bir DevOps kavramı olan Continuous Molla! Kısaca CM. ahah :)

Let’s begin..

curl ile verinin çekilip json’a yazdırılması

Öncelikle curl komutunu bir başka public api kullanırken de kendiniz yazmanıza gerek yok, tarayıcınızda bulunan network tab’inden request’i curl olarak kopyalabilirsiniz.. Dolayısıyla kopyalanmış request;

Son satırdaki tarih aralığını değiştirerek websitesindeki gibi bir aylık sınırla değil, istediğimiz aralıkta veriyi çekebiliriz.. Bu request’i shell ile kullanmamız gerekeceği için değerleri shell variables ile değiştirip script’e argument pass edeceğiz. JSON dosyasına yazdırmak için komutun sonuna -o output.json ekledik.

JSON’daki objelerden tek tek request gönderilmesi

Bunu yapabilmek için requests kütüphanesini kullanarak, tüm şirket ham objeleri üzerine iterasyon yapacağız.. (Bu yazıya iterasyon ve request’ler için yaptığım optimizasyonlar eklenmedi.) En temel düzeydeki for iterasyonu aşağıdaki gibi olacaktır. output.json dosyasına bakarak kod satırlarını daha net yorumlayabilirsiniz. Big-O yok, komple yok..

Detaylı output’un excel’e dökülmesi

openpyxl kütüphanesini kullanarak kolonlarımızı belirliyoruz. Ardından başka bir iterasyon ile tüm şirket objelerinin detaylı verisini excel’e yazdırıyoruz. Bu adım bir önceki adımdan çok çok daha kısa sürecektir.

Sheet’imiz hazır, isterseniz yukarıda bahsettiğim gibi hedeflemeleri yapmaya başlayabilirsiniz..

Süreci otomatize etmek için crontab kullanımı

Cron nedir? Cron, Yunanca zaman anlamına gelen chronos‘tan gelir. Tekrarlanan tek seferlik görevleri planlama kavramını ifade ederken sıkça kullanılır. Araç olarak bir çok araç vardır diye düşünüyorum. Fakat biz bu işi muhtemelen bir sunucu aracılığıyla yapacağımız için bir unix aracı olan crontab’i kullanacağız. Sunucumuzun centos veya ubuntu olduğunu varsayarsak, ikisinin de paket yöneticilerinden kolayca kurabilirsiniz. (yum-apt) Kurulumu tamamladıktan sonra unutulmaması gereken crontab’in her user için ayrı schedule’unun bulunmasıdır. Mesela psql üzerinde bir tek seferlik ama tekrarlanabilir görev oluşturma niyetindeyseniz, postgres user’ına geçmeniz faydalı.

Crontab’in görevler için baktığı dosyayı editlemek için crontab -e komutunu kullanabiliriz. Ardından tekrarlanacak görev için bir zamanlama ve o an hangi görevin yapılacağını belirlememiz gerekir. Aşağıdaki cron schedule’u her gün gece yarısı çalışır. Detay: https://crontab.guru/#0_0_*_*_*

0 0 * * * ~/cron_script.sh

Peki bu script ne yapacak? Öncelikle komut satırı curl aracı yarıdımıyla belirli aralıktaki ham şirket verisini komple çekip bir JSON objesine atacak ardından bu ham veri üzerinde python worker’ımızı çalıştıracağız.

Burada görüldüğü gibi script’e arg pass ediyoruz ve o tarihten itibaren son bir ayın verisini almasını sağlıyoruz. Cron job’ı her ayın sonunda çalışacak şekilde düzenliyoruz.

Bu yazıya devam ettiğim sırada İTO API’sine IP limit ekledi :) Dolayısıyla tek IP ile tekrar tekrar request almak imkansız hale geldi. Bunu da farklı IP’ler kullanarak aşabiliriz çünkü şimdilik IP komple banlanmıyor. Bir IP havuzundan circulate ederek curl interface’ini sürekli değiştirebiliriz.

Devamı yani, IP limitini aşmak, süreci otomatize edip excel dosyasını s3'te store edip, takıma mail göndermek görevlerini talebe göre bir sonraki yazıda yapacağız..

Şimdilik hoşçakalın..

--

--

Çağatay Uslu
Çağatay Uslu

No responses yet