Soru Webden veri alma

ptcsite

Altın Üye
Katılım
8 Nisan 2016
Mesajlar
123
Excel Vers. ve Dili
M.OFFICE 2016 TR 64 Bit
Altın Üyelik Bitiş Tarihi
26-12-2027
XML:
Public Sub fintables()

Dim XMLreq As New MSXML2.XMLHTTP60
Dim HTMLdoc As New MSHTML.HTMLDocument
Dim baglan As String
Dim a As Integer

baglan = "https://fintables.com/son-bilancolar"

        XMLreq.Open "get", baglan, False
        XMLreq.send

            If XMLreq.Status <> 200 Then

            On Error Resume Next
            MsgBox "Sayfa Bulunamıyor", vbOKOnly

            End If

        HTMLdoc.body.innerHTML = XMLreq.responseText

        For a = 2 To 250
        
    Sayfa1.Cells(a, 1) = HTMLdoc.getElementsByClassName("text-shared-brand-solid-02 font-bold text-sm").Item(a - 2).innetText
        On Error GoTo son:
    Sayfa1.Cells(a, 2) = HTMLdoc.getElementsByClassName("truncate text-foreground-03 text-xs")(a - 2).innerText

        Next
son:

End Sub
Fintables sitesinden yeni açıklanan bilanço isimleri excele çekmeye çalışıyorum ama;
Sayfa1.Cells(a, 1) = HTMLdoc.getElementsByClassName("text-shared-brand-solid-02 font-bold text-sm").Item(a - 2).innetText

yukarıdaki kodda object tanım hatası veriyor. çözemedim nedne olduğunu. Yardımcı olurmusunuz. Excell dosyası da mevcut
 

Ekli dosyalar

CengizYurek

Altın Üye
Katılım
11 Ocak 2017
Mesajlar
46
Excel Vers. ve Dili
2019-TR
Altın Üyelik Bitiş Tarihi
01-01-2026
Site bir api yardımıyla son bilançolar kısmını oluşturuyor. Aşağıdaki linki sayfada bulunan apiyle kullanabiliyor.
Kod:
api.fintables.com/screener/?period=2023/12&filter=published_at||!kapanis||!gunluk_getiri||!piyasa_degeri||!net_kar||!yillik_net_kar_degisimi||!fk||!pddd||
Kodunu Debug.Print ile denedim. Immediate'de baktığımda maalesef HTML kodlarının sadece site tarafından belirlenen bir kısmı geliyor. Bir nevi iframe gibi çalışıyor. Dolayısıyla senin çekmek istediğin class adı yukarda verdiğim linkte bulunduğu için son-bilancolar sayfasından çekilemiyor. Ne yaptıysam ilerleyemedim.
 

ptcsite

Altın Üye
Katılım
8 Nisan 2016
Mesajlar
123
Excel Vers. ve Dili
M.OFFICE 2016 TR 64 Bit
Altın Üyelik Bitiş Tarihi
26-12-2027
Cengiz bey ilginiz alakanız için çok teşekkür ederim bu bilgi bana yeterli...

Birde şu linke bakarmısınız bu da mı öyle?
 

CengizYurek

Altın Üye
Katılım
11 Ocak 2017
Mesajlar
46
Excel Vers. ve Dili
2019-TR
Altın Üyelik Bitiş Tarihi
01-01-2026
Cengiz bey ilginiz alakanız için çok teşekkür ederim bu bilgi bana yeterli...

Birde şu linke bakarmısınız bu da mı öyle?
Durum aynı.
Kodları almamız engelleniyor. POST yöntemiyle denedim ancak aşağıdaki kodları alabildim sadece.

Kod:
{{memberVm.disclosures.length - $index}}
{{d.publishDate}}
{{d.stockCodes}}
{{d.kapTitle}}
{{d.disclosureClass}} ÖDA
{{d.subject}}
{{d.summary}}
{{d.relatedStocks}}
{{d.year}}
{{d.ruleTypeTerm}}
 

ptcsite

Altın Üye
Katılım
8 Nisan 2016
Mesajlar
123
Excel Vers. ve Dili
M.OFFICE 2016 TR 64 Bit
Altın Üyelik Bitiş Tarihi
26-12-2027
Son bir soru cengiz bey başka bir yöntem ile almaya çalışacağım:
XML:
Option Explicit
Public Sub deneme()

Dim XMLreq As New MSXML2.XMLHTTP60
Dim HTMLdoc As New MSHTML.HTMLDocument
Dim acik_url As New MSHTML.HTMLDocument
Dim baglan, baglanti, baglanti2, FR As String
Dim a, i As Integer


baglan = "https://www.kap.org.tr/tr/Bildirim/" & 1243379

        XMLreq.Open "get", baglan, False
        XMLreq.send

            If XMLreq.Status <> 200 Then

            On Error Resume Next
            MsgBox "Veriler Toplandı", vbOKOnly
            GoTo son:
            End If

        HTMLdoc.body.innerHTML = XMLreq.responseText

    baglanti = HTMLdoc.getElementsByClassName("type-medium bi-sky-black")(1).innerText
    baglanti2 = HTMLdoc.getElementsByClassName("type-medium bi-sky-black")(2).innerText
    Sayfa1.Cells(1, 1) = Left(Right(baglanti, Application.WorksheetFunction.Find(" ", baglanti, 1) + 2), 4)
    Sayfa1.Cells(1, 2) = Left(baglanti2, 2)
    FR = "FR"
If Sayfa1.Cells(1, 1) = Format(Now, "yyyy") And Sayfa1.Cells(1, 2) = FR Then
    Sayfa1.Cells(1, 3) = HTMLdoc.getElementsByClassName("type-medium bi-dim-gray")(0).innerText
    Else
    GoTo son:

End If

'Buraya for döngüsü yapılacak bağlan i ye göre değişken olarak link kontrolü yapılacak
son:

End Sub
Kodumuz basit bir şekilde yaptım ama bunda if döngüsündeki eşitliği tanımadığından makro sonlanıyor.
Sorun: if döngüsünde verileri tanımıyor .. Yani A1 hücresine 2024 yazdırıyorum B1 hücresine FR yazdırıyorum... Eğer bu hücreler eşitse şunu yap diyorum ama eşit olarak algılamıyor halbuki eşitler...

makro dosyasını ekledim...

Not: Sorunu çözdüm
XML:
If Sayfa1.Cells(1, 1).Text= Format(Now, "yyyy") And Sayfa1.Cells(1, 2) = FR Then
yapınca oldu
 

Ekli dosyalar

Son düzenleme:

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Aslında, resimde belirttiğim URL'e doğru dürüst POST edebilsem, veriler alınacak ama .... ben de yapamadım.

Screenshot.png


.
 

ptcsite

Altın Üye
Katılım
8 Nisan 2016
Mesajlar
123
Excel Vers. ve Dili
M.OFFICE 2016 TR 64 Bit
Altın Üyelik Bitiş Tarihi
26-12-2027
selenium kullanmadan bunu yapabilen herhalde her siteden veriyi rahat çeker :)
 

CengizYurek

Altın Üye
Katılım
11 Ocak 2017
Mesajlar
46
Excel Vers. ve Dili
2019-TR
Altın Üyelik Bitiş Tarihi
01-01-2026
Son bir soru cengiz bey başka bir yöntem ile almaya çalışacağım:
XML:
Option Explicit
Public Sub deneme()

Dim XMLreq As New MSXML2.XMLHTTP60
Dim HTMLdoc As New MSHTML.HTMLDocument
Dim acik_url As New MSHTML.HTMLDocument
Dim baglan, baglanti, baglanti2, FR As String
Dim a, i As Integer


baglan = "https://www.kap.org.tr/tr/Bildirim/" & 1243379

        XMLreq.Open "get", baglan, False
        XMLreq.send

            If XMLreq.Status <> 200 Then

            On Error Resume Next
            MsgBox "Veriler Toplandı", vbOKOnly
            GoTo son:
            End If

        HTMLdoc.body.innerHTML = XMLreq.responseText

    baglanti = HTMLdoc.getElementsByClassName("type-medium bi-sky-black")(1).innerText
    baglanti2 = HTMLdoc.getElementsByClassName("type-medium bi-sky-black")(2).innerText
    Sayfa1.Cells(1, 1) = Left(Right(baglanti, Application.WorksheetFunction.Find(" ", baglanti, 1) + 2), 4)
    Sayfa1.Cells(1, 2) = Left(baglanti2, 2)
    FR = "FR"
If Sayfa1.Cells(1, 1) = Format(Now, "yyyy") And Sayfa1.Cells(1, 2) = FR Then
    Sayfa1.Cells(1, 3) = HTMLdoc.getElementsByClassName("type-medium bi-dim-gray")(0).innerText
    Else
    GoTo son:

End If

'Buraya for döngüsü yapılacak bağlan i ye göre değişken olarak link kontrolü yapılacak
son:

End Sub
Kodumuz basit bir şekilde yaptım ama bunda if döngüsündeki eşitliği tanımadığından makro sonlanıyor.
Sorun: if döngüsünde verileri tanımıyor .. Yani A1 hücresine 2024 yazdırıyorum B1 hücresine FR yazdırıyorum... Eğer bu hücreler eşitse şunu yap diyorum ama eşit olarak algılamıyor halbuki eşitler...

makro dosyasını ekledim...
Normalde herşey çalışıyor sıkıntı yok. Fakat POST etmemizi engelliyor site. Biz excel'de değişkeni döndürürken sitenin güvenlik duvarına takılıyoruz. Genelde webmaster arkadaşlarımız bunu aşmak için sayfa içine sayfayı gerekirse javascript kullanarak iframe gibi ama html kullanmadan yapıyorlar.

Size bir fikir verebilir diye şöyle bir tavsiye de bulunabilirim.
Veri çekmek istediğiniz sayfayı farklı kaydet ile masaüstüne indirin. Sonra excel ile o sayfadan istediğin veriyi çekmeyi deneyin. Biraz otomatik biraz manuel olacak ancak sanırım işe yarayacak tek yöntem bu gibi.
 
Katılım
1 Haziran 2024
Mesajlar
8
Excel Vers. ve Dili
yok
"
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
import random
from collections import deque

# User-Agent listesi
user_agents = [
# Windows Masaüstü User Agent'ler
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.2535.67",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edge/44.18363.8131",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:115.0) Gecko/20100101 Firefox/115.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 OPR/110.0.0.0",
"Mozilla/5.0 (Windows NT 10.0; WOW64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 OPR/110.0.0.0",

# Mac OS X Masaüstü User Agent'ler
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.2535.67",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:115.0) Gecko/20100101 Firefox/115.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 OPR/110.0.0.0",

# Linux Masaüstü User Agent'ler
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux i686; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (X11; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0",
"Mozilla/5.0 (X11; Linux i686; rv:115.0) Gecko/20100101 Firefox/115.0",
"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:115.0) Gecko/20100101 Firefox/115.0",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:115.0) Gecko/20100101 Firefox/115.0",
"Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:115.0) Gecko/20100101 Firefox/115.0",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 OPR/110.0.0.0",

# iPhone User Agent'ler
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/125.0.6422.80 Mobile/15E148 Safari/604.1",
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 EdgiOS/125.2535.60 Mobile/15E148 Safari/605.1.15",
"Mozilla/5.0 (iPhone; CPU iPhone OS 14_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/126.0 Mobile/15E148 Safari/605.1.15",
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Mobile/15E148 Safari/604.1",

# iPod User Agent'ler
"Mozilla/5.0 (iPod; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/125.0.6422.80 Mobile/15E148 Safari/604.1",
"Mozilla/5.0 (iPod touch; CPU iPhone OS 14_5 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) FxiOS/126.0 Mobile/15E148 Safari/605.1.15",
"Mozilla/5.0 (iPod touch; CPU iPhone 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Mobile/15E148 Safari/604.1",

# iPad User Agent'ler
"Mozilla/5.0 (iPad; CPU OS 14_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/126.0 Mobile/15E148 Safari/605.1.15",
"Mozilla/5.0 (iPad; CPU OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Mobile/15E148 Safari/604.1",

# Android Mobil User Agent'ler
"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 10; HD1913) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 EdgA/124.0.2478.104",
"Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 EdgA/124.0.2478.104",
"Mozilla/5.0 (Linux; Android 10; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 EdgA/124.0.2478.104",
"Mozilla/5.0 (Linux; Android 10; ONEPLUS A6003) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 EdgA/124.0.2478.104",
"Mozilla/5.0 (Windows Mobile 10; Android 10.0; Microsoft; Lumia 950XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 Edge/40.15254.603",

# Android Tablet User Agent'ler
"Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-T510 Build/QQ3A.200805.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.0.0 Safari/537.36 OPR/110.0.0.0",
"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Safari/537.36 OPR/110.0.0.0"
]

def get_random_headers():
return {
"User-Agent": random.choice(user_agents)
}

# İlk URL'den hisse listesi çekme
url = "https://www.isyatirim.com.tr/tr-tr/analiz/hisse/Sayfalar/sirket-karti.aspx?hisse=ACSEL"
r = requests.get(url, headers=get_random_headers())
s = BeautifulSoup(r.text, "html.parser")
s1 = s.find("select", id="ddlAddCompare")
if s1:
c1 = s1.findChild("optgroup").findAll("option")
hisseler = deque([a.string for a in c1])
else:
print("Hisse listesi alınamadı.")
hisseler = deque()

all_data_combined = []
failed_hisses = []

def get_data_for_hisse(hisse):
print(f"{hisse} işlemi başladı.")
all_data = []

url1 = f"https://www.isyatirim.com.tr/tr-tr/analiz/hisse/Sayfalar/sirket-karti.aspx?hisse={hisse}"
try:
r1 = requests.get(url1, headers=get_random_headers(), timeout=10)
except requests.exceptions.RequestException as e:
print(f"Hisse: {hisse}, İlk istek hatası: {e}")
return False

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"]

tarihler = [i.string.rsplit("/") for i in cocuklar]
yıllar = [t[0] for t in tarihler]
donemler = [t[1] for t in tarihler]

for k in range(len(tarihler)):
parametreler_try = (
("companyCode", hisse),
("exchange", "TRY"),
("financialGroup", grup),
("year1", yıllar[k]),
("period1", donemler[k]),
("year2", yıllar[k]),
("period2", donemler[k]),
("year3", yıllar[k]),
("period3", donemler[k]),
("year4", yıllar[k]),
("period4", donemler[k])
)

parametreler_usd = (
("companyCode", hisse),
("exchange", "USD"),
("financialGroup", grup),
("year1", yıllar[k]),
("period1", donemler[k]),
("year2", yıllar[k]),
("period2", donemler[k]),
("year3", yıllar[k]),
("period3", donemler[k]),
("year4", yıllar[k]),
("period4", donemler[k])
)

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

try:
r2_try = requests.get(url2, headers=get_random_headers(), params=parametreler_try, timeout=10)
r2_usd = requests.get(url2, headers=get_random_headers(), params=parametreler_usd, timeout=10)
except requests.exceptions.RequestException as e:
print(f"Hisse: {hisse}, İstek hatası: {e}")
return False

if r2_try.status_code == 200 and r2_usd.status_code == 200:
veri_try = r2_try.json()
veri_usd = r2_usd.json()

if veri_try.get("value") and veri_usd.get("value"):
try:
df_try = pd.DataFrame.from_dict(veri_try["value"])
df_usd = pd.DataFrame.from_dict(veri_usd["value"])

df_usd = df_usd.rename(columns={"value1": "valueUSD"})
veri = pd.merge(df_try, df_usd[["itemCode", "valueUSD"]], on="itemCode", how="left")

veri = veri.rename(columns={"value1": "valueTRY"})
veri["year"] = yıllar[k]
veri["period"] = donemler[k]
veri["companyCode"] = hisse

all_data.append(veri)
except KeyError:
print(f"Hisse: {hisse}, Dönem: {yıllar[k]}/{donemler[k]} - 'value' anahtarı bulunamadı.")
else:
print(f"Hisse: {hisse}, Dönem: {yıllar[k]}/{donemler[k]} - 'value' anahtarı boş, veri atlandı.")
else:
print(f"Hisse: {hisse}, Dönem: {yıllar[k]}/{donemler[k]} - İstek başarısız oldu.")
return False

time.sleep(1) # İstekler arasına bekleme süresi ekleyin

except AttributeError:
print(f"{hisse} için gerekli HTML elementleri bulunamadı.")
return True

if all_data:
all_data_df = pd.concat(all_data, ignore_index=True)
all_data_combined.append(all_data_df)
return True

def process_hisseler(hisseler, max_retries=100):#5 normali
for attempt in range(max_retries):
if not hisseler:
break

print(f"Deneme {attempt + 1}/{max_retries} başladı.")
with ThreadPoolExecutor(max_workers=30) as executor: #30 normali
futures = {executor.submit(get_data_for_hisse, hisse): hisse for hisse in hisseler}

failed_hisses.clear()
for future in as_completed(futures):
hisse = futures[future]
try:
success = future.result()
if not success:
print(f"Hisse: {hisse} işlemi başarısız oldu.")
failed_hisses.append(hisse)
except Exception as e:
print(f"Hisse: {hisse} işlemi sırasında bir hata oluştu: {e}")
failed_hisses.append(hisse)

hisseler = failed_hisses.copy()
time.sleep(1) # Denemeler arasında bekleme süresi ekleyin

if hisseler:
start_time = time.time() # Başlangıç zamanını kaydet

process_hisseler(hisseler)

# Tüm verileri tek bir dosyada birleştir ve kaydet
if all_data_combined:
final_data_df = pd.concat(all_data_combined, ignore_index=True)
final_data_df = final_data_df[["itemCode", "itemDescTr", "itemDescEng", "valueTRY", "valueUSD", "year", "period", "companyCode"]]
final_data_df.to_csv("all_hisse_data.csv", index=False)
print("Tüm veriler 'all_hisse_data.csv' dosyasına kaydedildi.")

# Başarısız olan hisseleri yazdır
if failed_hisses:
print("\nVerisi alınamayan hisseler:")
for hisse in failed_hisses:
print(hisse)

end_time = time.time() # Bitiş zamanını kaydet
elapsed_time = end_time - start_time # Geçen süreyi hesapla
elapsed_minutes = elapsed_time / 60 # Geçen süreyi dakika cinsine çevir
print(f"İşlem {elapsed_minutes:.2f} dakikada tamamlandı.")
else:
print("Hisse listesi bulunamadı veya boş.")
" buyrun hocam bu örnekte tüm şirketlerin tüm bilançolarını çekebiliyoruz. Hata alınması durumunda hisseyi hata alınanlar listesine ekliyor ve ilk sırayı bitirdiğinde hatalı olan hisseleri tekrar taramaya başlıyor. Her bir tarama için rastgele user agent atandığından maksimum 3-4 üncü denemesinde tüm hisseleri eksiksiz aktarıyor. hem lira hem dolar olarak fiyatlar excel doyasına aktarılmaktadır. İşlem yaklaşık 1 saat sürmektedir. Umarım işinize yarar
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Süre = 1 saniye civarında...

Kod:
Sub Test()
    Dim objHTTP As Object, strURL As String, strJSonData As String
           
    Set objHTTP = CreateObject("MSXML2.XMLHTTP")
   
    strURL = "https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/StockInfo/CompanyInfoAjax.aspx/GetSermayeArttirimlari"
   
    objHTTP.Open "POST", strURL, False
   
    strJSonData = "{""hisseKodu"":""ACSEL"",""endeksKodu"":""09"",""hisseTanimKodu"":"""",""sektorKodu"":"""",""yil"":0,""zaman"":""HEPSI""}"
   
    objHTTP.setRequestHeader "Host", "www.isyatirim.com.tr"
    objHTTP.setRequestHeader "Origin", "https://www.isyatirim.com.tr"
    objHTTP.setRequestHeader "Referer", "https://www.isyatirim.com.tr/tr-tr/analiz/hisse/Sayfalar/sirket-karti.aspx?hisse=ACSEL"
    objHTTP.setRequestHeader "Content-Type", "application/json; charset=utf-8"
   
    objHTTP.send strJSonData
   
    MsgBox objHTTP.responseText
   
    Set objHTTP = Nothing
End Sub

.
 
Katılım
1 Haziran 2024
Mesajlar
8
Excel Vers. ve Dili
yok
Süre = 1 saniye civarında...

Kod:
Sub Test()
    Dim objHTTP As Object, strURL As String, strJSonData As String
          
    Set objHTTP = CreateObject("MSXML2.XMLHTTP")
  
    strURL = "https://www.isyatirim.com.tr/_layouts/15/IsYatirim.Website/StockInfo/CompanyInfoAjax.aspx/GetSermayeArttirimlari"
  
    objHTTP.Open "POST", strURL, False
  
    strJSonData = "{""hisseKodu"":""ACSEL"",""endeksKodu"":""09"",""hisseTanimKodu"":"""",""sektorKodu"":"""",""yil"":0,""zaman"":""HEPSI""}"
  
    objHTTP.setRequestHeader "Host", "www.isyatirim.com.tr"
    objHTTP.setRequestHeader "Origin", "https://www.isyatirim.com.tr"
    objHTTP.setRequestHeader "Referer", "https://www.isyatirim.com.tr/tr-tr/analiz/hisse/Sayfalar/sirket-karti.aspx?hisse=ACSEL"
    objHTTP.setRequestHeader "Content-Type", "application/json; charset=utf-8"
  
    objHTTP.send strJSonData
  
    MsgBox objHTTP.responseText
  
    Set objHTTP = Nothing
End Sub

.
knk konu sermaye artırımı değil bilançolar bu birincisi. İkincisi ise bu sadece tek bir hisseyi tarar. Hisse kodu kısmına tüm hisseleri yazsan dahi http hatası alacaksın 100. hisseden sonra. Bu şu sebepten olmakta web siteleri ddos saldırılarını engellemek için tarayıcı ve ip adreslerine istek sınırı koyuyor. Tüm hisselerin tüm bilançolarını çeken bir makro yazabilirsen bekliyorum burada.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Konunun birinci mesajında bahsedilen linkte "https://fintables.com/son-bilancolar" yaklaşık 560 adet şirket var. Buradaki verilerin tümü yine aşağıdaki script ile yaklaşık 1 saniyede alınıp, butona basıldığında Excel'e aktarılıyor.

HTML:
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
    <link rel='stylesheet' href= 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css'>
    <script src="https://cdn.sheetjs.com/xlsx-0.19.0/package/dist/xlsx.full.min.js"></script>
    <script>
        function exportExcel(){
            var wb = XLSX.utils.book_new();
            var ws = XLSX.utils.table_to_sheet(document.getElementById("dataBilanco"));
            var wscols = [
                        {wch:12},
                        {wch:15},
                        {wch:12},
                        {wch:15},
                        {wch:20},               
                ];
            ws['!cols'] = wscols;
            //  Excel'e yazdir.....
            XLSX.utils.book_append_sheet(wb, ws, "FinTables");
            XLSX.writeFile(wb, "SonBilancolar.xlsx", {compression: true});
            }
    </script>
</head>
<body>
    <br><br>
    <input type="button" value="&#xf1c3 Excel'e aktar" id="FinTables_to_Excel" onClick="exportExcel()"  class="button_style fa fa-file-excel-o"/>
    <br><br>
    <table class="table table-bordered">
        <tbody id="dataBilanco"></tbody>
    </table>   
  <script>
    getData();
    async function getData(){
      const response= await fetch("https://api.fintables.com/screener/?period=null&filter=published_at||!period||!net_kar||!yillik_net_kar_degisimi||")
      const JSonData= await response.json();
      var length= JSonData.data.length;
      var temp="";
      temp="<table id='tableBilancolar'>"
      for(j=0;j<JSonData.header.length;j++)
        {
          temp+="<th>"+JSonData.header[j]+"</th>";
        }
      for(i=0;i<length;i++)        
        {
          temp+="<tr>";
          temp+="<td>"+JSonData.data[i][0]+"</td>";
          temp+="<td>"+JSonData.data[i][1]+"</td>";
          temp+="<td>"+JSonData.data[i][2]+"</td>";
          temp+="<td>"+JSonData.data[i][3]+"</td>";
          temp+="<td>"+JSonData.data[i][4]+"</td>";       
        }
        temp+="</table>"
      document.getElementById("dataBilanco").innerHTML=temp;
    }
  </script>
</body>
</html>


Söz konusu dosya da ektedir....



Not: "knk" (muhtemelen 'kanka' demek) diye hitap etmezsen sevinirim.... o kadar samimi değiliz.

.
 

Ekli dosyalar

Son düzenleme:
Katılım
1 Haziran 2024
Mesajlar
8
Excel Vers. ve Dili
yok
Konunun birinci mesajında bahsedilen linkte "https://fintables.com/son-bilancolar" yaklaşık 560 adet şirket var. Buradaki verilerin tümü yine aşağıdaki script ile yaklaşık 1 saniyede alınıp, butona basıldığında Excel'e aktarılıyor.

HTML:
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
    <link rel='stylesheet' href= 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css'>
    <script src="https://cdn.sheetjs.com/xlsx-0.19.0/package/dist/xlsx.full.min.js"></script>
    <script>
        function exportExcel(){
            var wb = XLSX.utils.book_new();
            var ws = XLSX.utils.table_to_sheet(document.getElementById("dataBilanco"));
            var wscols = [
                        {wch:12},
                        {wch:15},
                        {wch:12},
                        {wch:15},
                        {wch:20},              
                ];
            ws['!cols'] = wscols;
            //  Excel'e yazdir.....
            XLSX.utils.book_append_sheet(wb, ws, "FinTables");
            XLSX.writeFile(wb, "SonBilancolar.xlsx", {compression: true});
            }
    </script>
</head>
<body>
    <br><br>
    <input type="button" value="&#xf1c3 Excel'e aktar" id="FinTables_to_Excel" onClick="exportExcel()"  class="button_style fa fa-file-excel-o"/>
    <br><br>
    <table class="table table-bordered">
        <tbody id="dataBilanco"></tbody>
    </table>  
  <script>
    getData();
    async function getData(){
      const response= await fetch("https://api.fintables.com/screener/?period=null&filter=published_at||!period||!net_kar||!yillik_net_kar_degisimi||")
      const JSonData= await response.json();
      var length= JSonData.data.length;
      var temp="";
      temp="<table id='tableBilancolar'>"
      for(j=0;j<JSonData.header.length;j++)
        {
          temp+="<th>"+JSonData.header[j]+"</th>";
        }
      for(i=0;i<length;i++)       
        {
          temp+="<tr>";
          temp+="<td>"+JSonData.data[i][0]+"</td>";
          temp+="<td>"+JSonData.data[i][1]+"</td>";
          temp+="<td>"+JSonData.data[i][2]+"</td>";
          temp+="<td>"+JSonData.data[i][3]+"</td>";
          temp+="<td>"+JSonData.data[i][4]+"</td>";      
        }
        temp+="</table>"
      document.getElementById("dataBilanco").innerHTML=temp;
    }
  </script>
</body>
</html>


Söz konusu dosya da ektedir....



Not: "knk" (muhtemelen 'kanka' demek) diye hitap etmezsen sevinirim.... o kadar samimi değiliz.

.
Öncelikle sadece son bilançoları çekiyorsun siteden tüm bilançolar dediğimi hatırlatırım. Ayriyeten de bu sayfada "Nakit ve Nakit Benzerleri, Finansal Yatırımlar,Ticari Alacaklar,Finans Sektörü Faaliyetlerinden Alacaklar,Stoklar vb" gibi detay verileri yok. "https://1drv.ms/x/c/96a0352712898133/Ef1uKHia3chHu8Id19LYj3cBaGEUaAwROp-z6m1jCNEv9w?e=zaaPR2" buna bakarak ne demek istediğimi anlarsın. Okuma yazma çok önemli.

NOT: Tüm mesajlarımda "tüm şirketler ve tüm bilançoları" kelimeleri geçtiğini rahatça görebilirsin. Başarısızlığında başarılar
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi

netzone

Altın Üye
Katılım
10 Mayıs 2006
Mesajlar
791
Excel Vers. ve Dili
🅾🅵🅵🅸🅲🅴
⎝365 64 Bit 𝙏𝙍⎠
🆆🅸🅽🅳🅾🆆🆂
⎝11 64 Bit 𝙏𝙍⎠
Altın Üyelik Bitiş Tarihi
12-09-2027
... Okuma yazma çok önemli.
...
@yusufakman1919, gerçekten dediğiniz gibi "okuma yazma çok önemli". Açılan konu şubat ayında olup istenenin sadece son paylaşılmış bilanço verisi olduğunu okumadığınızı ve de haklıymışçasına diretip tanımadığınız kişilerin bilgisini kendi bilginizin altında görüp saygısızlık ettiğiniz için sizi kınıyorum.
 
Katılım
1 Haziran 2024
Mesajlar
8
Excel Vers. ve Dili
yok
@yusufakman1919, gerçekten dediğiniz gibi "okuma yazma çok önemli". Açılan konu şubat ayında olup istenenin sadece son paylaşılmış bilanço verisi olduğunu okumadığınızı ve de haklıymışçasına diretip tanımadığınız kişilerin bilgisini kendi bilginizin altında görüp saygısızlık ettiğiniz için sizi kınıyorum.
Ben mi bilgisini benim bilgimin altında görüyorum? Kendi gelip benim emeğime laf ediyor farkında mısın? Kodu yazdığım mesaja da bi git bak oku istersen ne yazmışım oraya. Efendi bir şekilde tüm şirketlerin tüm bilançolarını çektiğini söylemişim kodun değil mi? Gelip benim emeğime saygısızlık edip laf yapamaz.
 
Üst