Şirket Bilançolarını toplu indirme – Python Güncellemesi

Geçen hafta Powershell üzerinde yaptığım “Şirket Bilançolarını toplu indirme” güncellemesine rağmen aldığım mail ve DM’ler sonucu inat edip python kodunu yazmaya karar verdim. Eleştrilerden biri Toplu Şirket olmayışı, tek tek şirket girildiği idi. Bir diğer eleştri ise fixed yıllar olduğu için değişiklik yapılamadığıydı. Her nekadar bunları baştan belirtsem de, haftasonu üzerine biraz düşünüp, kabaca anahatlarını çizdiği python temelli uygulamayı bugün yazdım ve umarım herkes çektiğim kaynak kapanana kadar rahatça kullanabilir.

Önce çalışan “kanıt” fotoğraflarını paylaşayım ki, çalışmıyor/çalıştıramadık/script bozuk gibi mailler ve yorumlar gelmesin.

Çalıştırdığınızda aşağıdaki gibi bir ekran görüyor olacaksınız. Bu ekranda hisse senetlerinizi, yıl bazında çekilen dönemlerini, request sonuç dönüş kodunu, ne kadar sürede requestin tamamlandığını ve sonrasında excele aktarılan verilerin temel hallerini göreceksiniz. Unutmayalım ki bu sadece bilgi ekranı, belki sonuçları teyit etmek için de kullanabilirsiniz. Boş ekran görmekten iyidir.

Büyütmek için Resmin üzerine tıklayın

 

Bu ekran çalışmasını sonlandırdıktan sonra aynı dizinde bir excel dosyası göreceksiniz. Excel dosyası ismi, çoklu çalıştırma sonucu dosyaların karışmaması için zaman damgası ile başlıyor.

Büyütmek için Resmin üzerine tıklayın

 

Bu excel dosyasını açtığınızda uygulama içine girdiğiniz Hisse senetlerinizi istediğiniz dönemlerin verilerine göre aşağıdaki göreceksiniz. Verisi olmayan dönemleri boş olarak göreceksiniz.

Büyütmek için Resmin üzerine tıklayın

Peki hisse senetlerini ve dönemleri nasıl set edeceğiz. O da gayet kolay. Kod içinde 17 ve 18. satırlarda aşağıdaki gibi bir alan bulunuyor, orayı istediğiniz gibi düzenleyebilirsiniz.

Büyütmek için Resmin üzerine tıklayın

Scriptin sorunsuz çalışması için kurmamız gereken modüller şöyle; Requests, urllib3, xlsxwriter ve tqdm. PIP ile isimlerini kullanarak kurabilirsiniz.

PIP install request

gibi…

Modüllerin açıklama, kullanım ve kurulum yardımı için Python’ın sitesini kullanabilirsiniz.

request : https://pypi.org/project/requests/

urllib3 : https://pypi.org/project/urllib3/

xlsxwriter : https://pypi.org/project/XlsxWriter/

tdqm : https://pypi.org/project/tqdm/

Son olarak özellikle UVY için kafa yoran arkadaşlarıma destek olmak amacıyla bu kodu hazırladığımı ve sonuçları ile ilgili her türlü sorumluluk reddimi peşinen yazmış, belirtmiş olayım. Ek olarak veriyi çekip düzenlediğim kaynak adres var oldukça kodun çalışacağını, kaynak kapandığında uygulamanın da ömrünü tamamlamış olacağını da söylemek isterim. Kod için çok özenmediğimi, çalışan ve sonuç üreten bir  uygulama olmasının yeterli olacağını düşünerek yazdığımı da lütfen göz önünde tutunuz.

Fikir vermesi açısından daha önce yazdığım şu iki yazıyı da okumanızı rica edeceğim;

Şirket Bilançolarını toplu indirme – 2022 Güncellemesi

Şirket Bilançolarını toplu halde indirelim

 

ve finalde de kodu paylaşayım. Umarım yatırımlarınızda güzel fikirler verebilecek çalışmalarda kullanırsınız;

# -*- coding: utf-8 -*-

"""
@author: Hakan Müştak @2022 #hmustak
@mail: hakan[@]mustak.org
@web: mustak.org
@social: twitter.com/hmustak
"""

import requests, time, urllib3, xlsxwriter
from datetime import datetime
from tqdm import tqdm

# AYAR YAPMANIZ GEREKEN ALAN BURASI ----------------------------
hisseler = ["EREGL", "TOASO", "BRISA", "VESBE", "TTRAK", "FROTO"]
yillar = [2022, 2021, 2020, 2019, 2018]
# --------------------------------------------------------------

# İhtiyaç duyulan değişkeni dizi ve sabitler
yillar.sort(reverse=True)
request_link = 'https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo'
request_parametreler = []
request_gelen_json = dict()
start_zaman = time.time()
zaman_hassasiyet = 3  # digit
bekleme = 3
checksum = 147
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# ---------------------------------------------------------------------------------------------------------------------
# Fonksiyonlar
# ---------------------------------------------------------------------------------------------------------------------

# ---------------------------------------------------------------------------------------------------------------------

# Dönem Kontrolü
if yillar[-1] <= 2016:
    print("2017 öncesi değerlerde sorun olduğu için scriptin kullanımı uygun değil...")
    yillar = [2022, 2021, 2020, 2019, 2018, 2017]
    yillar.sort(reverse=True)

# Excel Workbook'u oluşturalım
now = datetime.now()
dosya_ismi = "{d}_Toplu_Hisse_Sonuclari.xlsx".format(d=now.strftime("%Y-%m-%d-%H-%M-%S"))
workbook = xlsxwriter.Workbook(dosya_ismi)

# Hisselerin isminde sheetler oluşturuyoruz
for i in hisseler:
    worksheet = workbook.add_worksheet(i)


# Request modülü için parametrelerin hazırlanması
def parametre_hazirlama():
    for h in hisseler:
        for y in yillar:
            if (y >= 2014):
                request_parametreler.append({"companyCode": h, "exchange": "TRY", "financialGroup": "XI_29", "year1": y, "period1": "12", "year2": y, "period2": "9", "year3": y, "period3": "6", "year4": y, "period4": "3"})
            else:
                pass


# ---------------------------------------------------------------------------------------------------------------------
# Request'lerin uygulanması ve json nesnesinin oluşturulmasıt
def req_olusturulmasi():
    for p in tqdm(request_parametreler, desc="Parametreler olusturuluyor", colour="blue", bar_format="{desc:<30.30}{percentage:3.0f}%|{bar:20}{r_bar}", unit=" link"):
        req_talebi = requests.get(request_link, verify=False, params=p)  # hata versiği için doğrulamayı kapattım
        indikator = "{hisse}-{yil}".format(hisse=p["companyCode"], yil=p["year1"])  # Ekranda da gösterelim ki, hareket olsun, tabi önce hazırlayalım
        request_gelen_json[indikator] = req_talebi.json()  # Talebi işleyelim
        time.sleep(bekleme)  # Hataya izin vermemek adınaveriyi  biraz gecikmeli almakta fayda var


# ---------------------------------------------------------------------------------------------------------------------
# Request'le gelen verileri yazalım
def geleni_goster():
    now = datetime.now()  # Excele zaman damgasını basmak için
    col = 3  # dinamik yazmanın başlayacağı kolon
    hisse_kontrol = ""  # hissenin değiştiğini anlamak için kullandığım değişken
    for key in tqdm(request_gelen_json, desc="Excel dosyası oluşturuluyor", colour="#00ff00", bar_format="{desc:<30.30}{percentage:3.0f}%|{bar:20}{r_bar}", unit=" rec"):
        hisse = key.split("-")
        # Çözümleme BAŞLIK
        row = 2
        if hisse_kontrol != hisse[0]: col = 3  # hisse değişti ise kolonu 3'e sıfırla

        # exceli şekillendirmeye başlıyoruz
        worksheet = workbook.get_worksheet_by_name(hisse[0])
        worksheet.write(0, 1, now.strftime("%d/%m/%Y %H:%M:%S"))
        worksheet.write(0, 7, "Hakan Müştak tarafından kodlanmıştır : www.mustak.org")

        worksheet.write(1, 1, "HİSSE")
        worksheet.write(1, 2, "KOD")
        worksheet.write(1, 3, "KALEM")

        # Verileri döndürüp excele yazan döngü
        for i in request_gelen_json[key]["value"]:
            # ilk 3 kolonun verisi
            worksheet.write(row, 1, hisse[0])
            worksheet.write(row, 2, i["itemCode"])
            worksheet.write(row, 3, i["itemDescTr"])

            # tarih ve dönemi içeren satır
            worksheet.write(1, col + 1, "{y}/12".format(y=hisse[1]))
            worksheet.write(1, col + 2, "{y}/9".format(y=hisse[1]))
            worksheet.write(1, col + 3, "{y}/6".format(y=hisse[1]))
            worksheet.write(1, col + 4, "{y}/3".format(y=hisse[1]))

            # AutoFit olmadığı için kendi fitini kendin yap
            worksheet.set_column(row, col + 1, 12.5)
            worksheet.set_column(row, col + 2, 12.5)
            worksheet.set_column(row, col + 3, 12.5)
            worksheet.set_column(row, col + 4, 12.5)

            # kıymetli verileri yazıyoruz
            worksheet.write(row, col + 1, i["value1"])
            worksheet.write(row, col + 2, i["value2"])
            worksheet.write(row, col + 3, i["value3"])
            worksheet.write(row, col + 4, i["value4"])

            row += 1
        time.sleep(bekleme)
        hisse_kontrol = hisse[0]
        col += 4  # yıl dönümlerini ayarlıyoruz


# ---------------------------------------------------------------------------------------------------------------------
# Fonksiyonların çağrılması
# ---------------------------------------------------------------------------------------------------------------------
parametre_hazirlama()
req_olusturulmasi()
geleni_goster()
# ---------------------------------------------------------------------------------------------------------------------
# Exceli kapatalım
workbook.close()
print("## Toplam çalışma süresi : {z} sn ##".format(z=round(time.time() - start_zaman, zaman_hassasiyet)))

 

Gözü yormamak adına aldığım “minik” bir fikir sonrası yaptığım ufak değişiklikle çalışma zamanı ekranını şöyle görmelisiniz;

Büyütmek için Resmin üzerine tıklayın

 

Hakan Müştak
@2022

 


3 yorum

  1. ismail dedi ki:

    OLAĞAN ÜSTÜ MÜKEMMEL. 💡
    ELLERİNİZE EMEKLERİNİZE SAĞLIK HAKAN HOCAM.
    İYİ Kİ VARSINIZ.
    ŞANS HER ZAMAN YANINIZDA OLSUN.
    SEVGİLER.

  2. alper dedi ki:

    Elinize saglik.Deneyecegim

ismail için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

question razz sad evil exclaim smile redface biggrin surprised eek confused cool lol mad twisted rolleyes wink idea arrow neutral cry mrgreen

*

Captcha Kontrolü * Zaman aşımı, sayfayı tekrar yükleyin


Top