Pythonda requests modülü parametreler ile istek hatası

Daha önce excel’de ağda çalışan iş programını vba kullanarak yapmıştım amacım doğrultusunda arayıp bulup çalıştırmıştım.

Şimdi de python öğrenmek için aklımda bir proje var ve onun için araştırma yapıyorum videolar izliyorum. proje şu, şirketlerin üç ayda bir yayınlanan bilançolarını internetten çekip veri tabanına aktarmak. User form tasarlayarak bilançodan gelen verileri çekmek ve grafik oluşturmak istiyorum.

İlk iş olarak bilançoları çekmek için gerekli videoyu buldum adım adım gerekenleri yaptım.

Siteye ilk bağlantı yapıyorum sorun olmuyor, daha sonraki isteklerde requests işlemi parametrelerle yapılıyor ama bağlanamıyorum. Parametre yerine gerekli url’ye normal istek gönderiyorum ve başarılı yani istek site tarafından engellenmiyor.

aldığım hata

return complexjson.loads(self.text, **kwargs)

olup düzeltmek için en yapmam gerekli? Teşekkürler.

İlk olarak bu tarz uygulamalarla ilgilenen kişilerin size yardımcı olabilmesi için kodunuzu, veri çekmeye çalıştığınız site adreslerini paylaşmanız gerekiyor.

Kod paylaşmak için kodları yazacağım yeri bulamadım. Nereden kod paylaşabilirim?

1 Beğeni

Mesajı yazdığın yere kodları yapıştır, yapıştırdığın kodları seç
_20240121_221944
butonuna bas

Aşağıdaki gibi oluyor

print("kod");

import pandas as pd
import requests
from bs4 import BeautifulSoup

hisseler=[]

user_agent = '........'
headers = {'User-Agent': user_agent}
url="https://www.isyatirim.com.tr/tr-tr/analiz/hisse/Sayfalar/sirket-karti.aspx?hisse=ACSEL"
r = requests.get(url, headers=headers)
s=BeautifulSoup(r.text,"html.parser")
s1=s.find("select",id="ddlAddCompare")
c1=s1.findChild("optgroup").findAll("option")

for a in c1:
    hisseler.append(a.string)

for i in hisseler:
    hisse=i
    tarihler=[]
    yillar=[]
    donemler=[]
    user_agent = '........'
    headers = {'User-Agent': user_agent}
    url1= "https://www.isyatirim.com.tr/tr-tr/analiz/hisse/Sayfalar/sirket-karti.aspx?hisse="+hisse
    r1=requests.get(url1, headers=headers)
    soup=BeautifulSoup(r1.text,"html.parser")
    secim = soup.find("select", id="ddlMaliTabloFirst")
    secim2 = soup.find("select", id="ddlMaliTabloGroup")
    
try:
        cocuklar = secim.findChildren("option")
        grup = secim2.find("option")["value"]
       
        for i in cocuklar:
            tarihler.append(i.string.rsplit("/"))

        for j in tarihler:
            yillar.append(j[0])
            donemler.append(j[1])

        if len(tarihler)>=4:
            parametreler =(
                ("companyCode", hisse),
                ("exchange", "TRY"),
                ("financialGroup", grup),
                ("year1", yillar[0]),
                ("period1", donemler[0]),
                ("year2", yillar[1]),
                ("period2", donemler[1]),
                ("year3", yillar[2]),
                ("period3", donemler[2]),
                ("year4", yillar[3]),
                ("period4", donemler[3]))
            user_agent = '........'
            headers = {'User-Agent': user_agent}
            url2 = "https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/Malitablo"
            r2 = requests.get(url2, headers=headers, params=parametreler).json()["value"]
            veri = pd.DataFrame.from_dict(r2)
            veri.drop(columns=["itemCode", "itemDescEng"], inplace=True)

        else:
            continue

    except AttributeError:
        continue

    del tarihler[0:4] 
    tumveri = [veri] 

    for _ in range(0,int(len(tarihler)+1)):

        if len (tarihler)==len(yillar):
            del tarihler[0:4]
        else:
            yillar=[]
            donemler=[]

            for j in tarihler:
                yillar.append(j[0])
                donemler.append(j[1])

            if len (tarihler)>=4:
                parametreler2 = (
                    ("companyCode", hisse),
                    ("exchange", "TRY"),
                    ("financialGroup", grup),
                    ("year1", yillar[0]),
                    ("period1", donemler[0]),
                    ("year2", yillar[1]),
                    ("period2", donemler[1]),
                    ("year3", yillar[2]),
                    ("period3", donemler[2]),
                    ("year4", yillar[3]),
                    ("period4", donemler[3]))

                user_agent = '........'
                headers = {'User-Agent': user_agent}
                r3 = requests.get(url2, headers=headers, params=parametreler2).json()["value"]
                veri2 = pd.DataFrame.from_dict(r3) 

                try:

                    veri2.drop(columns=["itemCode", "itemDescTr","itemDescEng"], inplace=True)
                    tumveri.append(veri2) 

                except KeyError:

                    continue
        veri3=pd.concat(tumveri,axis=1)
        baslik = ["Bilanço"]

        for i in cocuklar:
             baslik.append(i.string)
        baslikfark=len(baslik)-len(veri3.columns)

        if baslikfark !=0:
            del baslik[-baslikfark:]

        veri3.set_axis(baslik, axis=1, inplace=True)
        veri3[baslik[1:]] = veri3[baslik[1:]].astype(float)
        veri3.fillna(0, inplace=True)
        veri3.to_excel("C:/Users/Pc/Desktop/bilancolar/{}.xlsx".format(hisse), index=False)

Merhaba,

Paylaştığınız kodda hatalar var.

Bkz: Soru Sorarken Sıkça Düşülen Hatalar #6

Kodlarla iş bankasına 3 adet istek gönderiliyor.

İlk istek (r) iş bankası sayfasındaki borsadaki şirketlerin kodları ve bu hisse isimli listede tutuluyor.

url="https://www.isyatirim.com.tr/tr-tr/analiz/hisse/Sayfalar/sirket-karti.aspx?hisse=ACSEL"
r = requests.get(url, headers=headers)

İkinci istek (r1) hisse listesinin içinde sırayla gelen bilgiye göre ilgili şirkete ait bilançolarının tarihler, yıllar ve dönem bilgilerine ulaşıyoruz.

for i in hisseler:
    hisse=i
    tarihler=[]
    yillar=[]
    donemler=[]
    user_agent = '....'
    headers = {'User-Agent': user_agent}
    url1= "https://www.isyatirim.com.tr/tr-tr/analiz/hisse/Sayfalar/sirket-karti.aspx?hisse="+hisse
    r1=requests.get(url1, headers=headers)
    soup=BeautifulSoup(r1.text,"html.parser")
    secim = soup.find("select", id="ddlMaliTabloFirst")
    secim2 = soup.find("select", id="ddlMaliTabloGroup")

Üçüncü istek (r2) olup r1 ile aldığımız hisse, tarih, yıllar ve dönemler bilgileriyle parametre oluşturup istek gönderildi.

        if len(tarihler)>=4:
            parametreler =(
                ("companyCode", hisse),
                ("exchange", "TRY"),
                ("financialGroup", grup),
                ("year1", yillar[0]),
                ("period1", donemler[0]),
                ("year2", yillar[1]),
                ("period2", donemler[1]),
                ("year3", yillar[2]),
                ("period3", donemler[2]),
                ("year4", yillar[3]),
                ("period4", donemler[3]))
            user_agent = '.......'
            headers = {'User-Agent': user_agent}
            url2 = "https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/Malitablo"
            r2 = requests.get(url2, headers=headers, params=parametreler).json()["value"]
            veri = pd.DataFrame.from_dict(r2)
            veri.drop(columns=["itemCode", "itemDescEng"], inplace=True)

r2 isteğini parametreler ile kontrol ettiğimde cevap olarak

<Response [404]>

alıyorum.

fakat r2 isteğini parametre oluşturmadan herhangi bir hisseye ait denediğimde ise

user_agent = '.......'
headers = {'User-Agent': user_agent}
url2 = (https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/MaliTablo?companyCode=AEFES&exchange=TRY&financialGroup=XI_29&year1=2022&period1=9&year2=2023&period2=6&year3=2023&period3=3&year4=2022&period4=12&_=1705906782613)
r2 = requests.get(url2, headers=headers)

cevap olarak siteye erişim olduğu bilgisi geliyor.

<Response [200]>

Kod parametreler ile çalışmaya devam ettiğinde ise aşağıdaki hata geliyor. User agent kullanıyorum, siteye iletişime ait engel koymamış fakat parametreler ile isteğim olmuyor. göremediğim ne var? Eksik bildiğim ne var?

Traceback (most recent call last):
  File "C:\Users\VGB\AppData\Roaming\Python\Python312\site-packages\requests\models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python312\Lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python312\Lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python312\Lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\VGB\PycharmProjects\yeni\pythonProject\yen.py", line 82, in <module>
    r2 = requests.get(url2, headers=headers, params=parametreler).json()["value"]
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\VGB\AppData\Roaming\Python\Python312\site-packages\requests\models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Merhaba,

Linki yanlış yazıyorsunuz gibi geldi bana:

url2 = "https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/Common/Data.aspx/Malitablo"

Buradaki adreste Malitablo yazmışsınız. Bu linki alıp browser’a yazarsanız, linkin hatalı olduğunu görürsünüz.

İstek gönderdiğiniz diğer kodda Malitablo ifadesi MaliTablo olarak yazılmış. Bu şekilde düzeltirseniz sorununuz çözülür diye tahmin ediyorum.

1 Beğeni

Çok teşekkür ederim yardımınız için. Düzeldi.