Bir Scrapping meselesi

BOD 0-1 ARS | Bodo/Glimt - Arsenal | İstatistikler (flashscore.com.tr)

Buradaki maç tarihi, maç sonucu, ilk yarı ve ikinci yarı sonucu, karşılaşma, 1.yarı,2.yarı istatistiklerini python ile çekebilen scrapper arıyorum. Varsa öyle bir delikanlı selam ederim.

2 gündür GPT ile uğraşıyorum, yapamadım. Scrapping gerçekten büyük emekmiş.

Yabana büyük teşekkür ederim.

Yapabilene minnet duyarım.
Bugün 3.günüm.

Biraz baktımda api kullanıyorlarmış gelen veri biraz karmaşık sadece onu düzenliycek bir fonksiyon yazman lazım.

SE÷Karşılaşma¬~SD÷12¬SG÷Topa sahip olma¬SH÷44%¬SI÷56%¬~SD÷34¬SG÷Gol denemeleri¬SH÷6¬SI÷7¬~SD÷13¬SG÷Kaleyi bulan şut¬SH÷1¬SI÷1¬~SD÷14¬SG÷Kaleyi bulmayan şut¬SH÷5¬SI÷5¬~SD÷158¬SG÷Engellenen şutlar¬SH÷0¬SI÷1¬~SD÷15¬SG÷Serbest vuruşlar¬SH÷10¬SI÷8¬~SD÷16¬SG÷Kornerler¬SH÷3¬SI÷5¬~SD÷17¬SG÷Ofsaytlar¬SH÷0¬SI÷2¬~SD÷18¬SG÷Taçlar¬SH÷10¬SI÷15¬~SD÷19¬SG÷Kaleci kurtarışları¬SH÷0¬SI÷1¬~SD÷21¬SG÷Fauller¬SH÷9¬SI÷7¬~SD÷23¬SG÷Sarı Kartlar¬SH÷1¬SI÷3¬~SD÷304¬SG÷Toplam pas¬SH÷520¬SI÷619¬~SD÷342¬SG÷Başarılı pas¬SH÷437¬SI÷544¬~SD÷189¬SG÷Müdahaleler¬SH÷11¬SI÷8¬~SD÷372¬SG÷Ataklar¬SH÷100¬SI÷132¬~SD÷373¬SG÷Tehlikeli ataklar¬SH÷43¬SI÷45¬~SE÷1. yarı¬~SD÷12¬SG÷Topa sahip olma¬SH÷41%¬SI÷59%¬~SD÷34¬SG÷Gol denemeleri¬SH÷1¬SI÷5¬~SD÷13¬SG÷Kaleyi bulan şut¬SH÷0¬SI÷1¬~SD÷14¬SG÷Kaleyi bulmayan şut¬SH÷1¬SI÷3¬~SD÷158¬SG÷Engellenen şutlar¬SH÷0¬SI÷1¬~SD÷15¬SG÷Serbest vuruşlar¬SH÷3¬SI÷4¬~SD÷16¬SG÷Kornerler¬SH÷1¬SI÷4¬~SD÷17¬SG÷Ofsaytlar¬SH÷0¬SI÷1¬~SD÷18¬SG÷Taçlar¬SH÷3¬SI÷9¬~SD÷19¬SG÷Kaleci kurtarışları¬SH÷0¬SI÷0¬~SD÷21¬SG÷Fauller¬SH÷4¬SI÷2¬~SD÷23¬SG÷Sarı Kartlar¬SH÷0¬SI÷1¬~SD÷304¬SG÷Toplam pas¬SH÷236¬SI÷312¬~SD÷342¬SG÷Başarılı pas¬SH÷203¬SI÷282¬~SD÷189¬SG÷Müdahaleler¬SH÷6¬SI÷4¬~SD÷372¬SG÷Ataklar¬SH÷42¬SI÷68¬~SD÷373¬SG÷Tehlikeli ataklar¬SH÷24¬SI÷28¬~SE÷2. yarı¬~SD÷12¬SG÷Topa sahip olma¬SH÷47%¬SI÷53%¬~SD÷34¬SG÷Gol denemeleri¬SH÷5¬SI÷2¬~SD÷13¬SG÷Kaleyi bulan şut¬SH÷1¬SI÷0¬~SD÷14¬SG÷Kaleyi bulmayan şut¬SH÷4¬SI÷2¬~SD÷158¬SG÷Engellenen şutlar¬SH÷0¬SI÷0¬~SD÷15¬SG÷Serbest vuruşlar¬SH÷7¬SI÷4¬~SD÷16¬SG÷Kornerler¬SH÷2¬SI÷1¬~SD÷17¬SG÷Ofsaytlar¬SH÷0¬SI÷1¬~SD÷18¬SG÷Taçlar¬SH÷7¬SI÷6¬~SD÷19¬SG÷Kaleci kurtarışları¬SH÷0¬SI÷1¬~SD÷21¬SG÷Fauller¬SH÷5¬SI÷5¬~SD÷23¬SG÷Sarı Kartlar¬SH÷1¬SI÷2¬~SD÷304¬SG÷Toplam pas¬SH÷284¬SI÷307¬~SD÷342¬SG÷Başarılı pas¬SH÷234¬SI÷262¬~SD÷189¬SG÷Müdahaleler¬SH÷5¬SI÷4¬~SD÷372¬SG÷Ataklar¬SH÷58¬SI÷64¬~SD÷373¬SG÷Tehlikeli ataklar¬SH÷19¬SI÷17¬~A1÷¬~

" https://local-tr.flashscore.ninja/10/x/feed/df_st_1_nDEQkX6B "

Burda 1. ve 2. yarıların istatistikleri ayrı ayrı verilmiş.

Doğrudan erişim yokmuş çerezleride ayarlamak gerekicek sanırım

Öyle delikanlı zor buluruz:

Bir tanesi için örnek çıktı. Verdiğin link, diğer sayfaları da aynı metodla kendin çekebilirsin.

Liste fonksiyonu yazdım bir tane. Tarafların sayısal değerleri ve hangi konuda istatistik olacak şekilde formatladım.

dataların iki dinamik sınıf içinde duruyor.

Bir tanesi: duelParticipant sınıfı içinde;

Diğeri section sınıfı içerisinde;

Hiç karmaşık bir kod yazmadım. Ama chorme yerine firefox kullanıyorum. Mozilla uyumluluğuna güvendiğim için.

Bu nedenle tarayıcıya başlık bilgisi eklmek yada tarayıcıyı non windowed çalıştırmak senin görevin. Basit kodu ıvır zıvırla karıştırmak istemedim.

Sorunun şu: Ve birden çok çözüm yolu var. Ben basiti seçtim.

Bir kere veri kazırken biraz siteye izin ver nefes alsın. Datayı oluşturmak için java script ler kullanılıyor. Bu scriptler tam çalışıp datayı çekmek istersen çuvallarsın. (Ben de çuvalladım.) Scriptlerin çalışması için biraz beklerse datayı çekebilirsin. ( Özelden kodunun bir kısmını görmüş threadlerinden haberim olmuş olmasını sihirbazlık sanmasın kimse.)

Neyse buna dikkat edersen, verdiğin link dışındaki diğer 0,1,2 pagelerinde de datayı sırayla çekebilirsin.

Amma laf salatası yaptım.

Kod:

from selenium import webdriver
from selenium.webdriver.common.by import By

import time

driver = webdriver.Firefox()
driver.get("https://www.flashscore.com.tr/mac/nDEQkX6B/#/mac-ozeti/mac-istatistikleri/1")

time.sleep(5)

dynamic_content = driver.find_element(By.CLASS_NAME, "duelParticipant")

output2= dynamic_content.text
list2 = output2.split()
print(list2)


dynamic_content = driver.find_element(By.CLASS_NAME, "section")

output= dynamic_content.text


def format_data(string):
    stringler = string.split("\n")
    list1 = []
    for i in range(0, len(stringler), 3):
        list1.append(stringler[i:i+3])
    return list1


list1 = format_data(output)
print(list1)


driver.quit()

list1 içerisinde istatistiklerin, list2 içerisinde maç bilgilerin mevcut.

time.sleep(5) opsiyonel, hızlı yükleyeceğine güveniyorsan kaldırabilirsin. Daha doğrusu yorum satırına dönüştür elinde kod nasıl patlar oradan görebilirsin.

Yani ana fikir web scapping yapacaksa site dynamic ise biraz kodumuz frenli çalışmalıymış.

Ha senin kodu gördüm. O threadleri elinde patlatmamak için driver.get() lerden sonra frene nasıl basacağını biliyorsun.

Tabi google, selenium, waiting web page complately load diye aratıp daha şık çözümler de görebilirsin.

Her üç sayfa için yap demezsin herhalde o kısmı halledebilirsin.

Kolay gelsin.

İkinize de çok teşekkürler.
@semtex @Muhammet_Kulaber

Dur daha kodu mıncıklamaya yeni başladım;

Sana bu lazım değil mi?

Vermeyim bari kodu.

Hxffcfgcf ver ya. :smiley:
Ama bunu driver ile yapıyiruz sikıntı orada.

Hangi kod daha hızlı çalışıyor acaba merak ettim :smiley:

Muhammed Kulaber’e 10 sevap points.
Semtex pirimiz. Saygısızlık yok.

1 Beğeni

Anlamadım? Ne tür bir sıkıntıdan bahsediyoruz ve karşılamamız gereken koşul ne?

Biraz açıklar mısın?

Hangisi hızlı derken?

Ne ile neyi karşılaştırıyoruz?

Hocam bende yardımcı olmak amaçlı kod yazdım ama özelden atmıştım. Farklı yöntemler izledik o yüzden sordum

Ben de ondan sordum ne ile neyi ne yönden karşılaştırdık. Alternetif yönetminizin artıları nedir? Görmüş oluruz.

Yukarda bahsettim aslında web sitesi api ile veriyi alıp js ile yayınlıyor bende api ile veriyi çekmeyi ve sonradan ayrıştırmayı daha mantıklı buldum ama bir sorunla karşılaştık gelen veriler içerisinde tarih ve saat bilgisi yok. Onuda başka bir kitaplık aracılığıyla hallettik ama hızı ciddi ölçüde düşürdü

Mantıksız değil, hatta imkan olsa doğrudan verilerin bulunduğu veri tabanından çekmek de hız anlamında mantıklı olabilir.

Bu da gayet normal bir durum, çünkü sayfanın farklı bölgelerini faklı yerlerden dolduruyor.

Kritermizin hız olduğunu başlıkta yada konuda göremiyoruz, özel mesajda ben de hız konusundaki kaygıyı farkettim.

Ama hala sorun şu benim açımdan, bu ciddi hız farkı ne kadarlık bir hız farkı.

Veriyi çekebilmek ve işleyebilmek ayrı bir husus, ama bunu hızlı bir biçimde yapmaktan bahsediyorsak bir beklentimiz de olmalı.

Bu beklentiyi de merak ettim. Bu nedenle sordum. Borsa verisi gibi anlık takip gerektiren bir durum mu var, ki olabilir maç süresince bahis oynamak gibi bir durum varsa ancak hız endişesi anlamlı gelebilir diye düşündüm.

Hız, genel olarak hayatımızın bir parçası. Hızlı olmaya mecburuz, her şeyden önce.
Hız farkına gelince, Muhammet’in önerdiği şekilde veriyi en fazla 2 saniyede işliyorum.

Driver kullanınca hızı ölçtüm 64 saniyeye çıktı, multithread kullandım 30 saniyelere düştü. Ama yine de yeterli olmuyor.

Teşekkür ederim yine de sevgili @semtex

Evet öyle ama gelen verileri incelediğimde hiçbir yerde tarih ve saat bilgisine ulaşamamak beni şaşırttı nerden bu bilgiyi çektiklerini hala merak ediyorum. Js kodlarında saat ve tarih bilgisinin bulunduğu etiketin oluşturulduğu kod satırını buldum ama orada da herhangi bi içerik çekme durumu yoktu.

Tabi ki, ne kadar hızlı o kadar iyi. Ama başlığa bakan biri, veriyi çekemediğinde ilk sorun olarak acaba, sitede bir koruma mı var neden veriyi çekmekte sorun yaşamış demez mi? Nereden bilsin hız kaygısını. Bunu da belirtmekte fayda var diyorum.

Threadden verim almak beklediğim bir durum değildi zaten.

Driver kullanılrken 64 saniye ölçtüğün kısım sayfanın yüklenmesinden itibaren mi yoksa, sorguyu aldığı kısım mı?

Tabi ki araya driver sokmadan request etmek daha fazla hız farkı yaratır, ama bu derecek bir fark var mı ölçmedim ölçeyim bakayım.

Teşekkürlük bir durum yok, zihin jimnastiği yapıyorum, senlik bir durum değil, koşullara göre kurcalamak verim artırmak gibi hususlar ilgi alanım ondan irdeliyorum.

Çok üzerinde düşünmedim, sonuçta maç saati süresince oluşacak istatistik, ama sürekli maç saati güncellemekle doğrudan bağlı değil, aynı frame yada aynı region içinde bile tutmak zorunda değil. Vardır bir yerlerde bakarım ucundan. Görürsem şuradan generate etmiş derim.

İçerik çekmeyi dışarda update eden başka bir script yürüyordur söylediğim gibi bakmak lazım.

2 Beğeni

Driver kullanılrken 64 saniye ölçtüğün kısım sayfanın yüklenmesinden itibaren mi yoksa, sorguyu aldığı kısım mı?

sayfayı yüklemeden itibaren. Kesinlikle driver’dan çok fazla hızlı doğal olarak.

Görürsem şuradan generate etmiş derim.

Görürsen makbule geçer. Ben tüm kaynaklara baktım hiçbir şey görmedim valla.

Burada driver yerien request tabi hızlı olur, ama analiz için bağlantı hızı, sistem hızı gibi değişkenleri de düşünüyordum. Hız konusu saniyeler bazında ciddi fark yaratıyorsa zaten çok da driverın öne geçebileceğini düşünmüyorum.

Görmek için bakmak lazım. Bakarsa başlığa eklerim.

Arada, 2 saniye ile 30 saniye olan bir sorgudan bahsediyorsak driver anlamsız duruyor, ama script erişim yetkisi vermiyorsa driver hala ihtiyaç mıdır diye düşünmek lazım. Tabi her türlü etrafından dolanılabilir.

1 Beğeni

Yüce semtex, chatgpt ile bir türlü şunu halledemedim, find_all ları selectleri kullandım, ama yapamadım. sadece şu kimliklere ulaşmak istiyorum:
https://www.flashscore.com.tr/
Buradaki maçların
<div id="g_1_0ltH1oZ5" title="Karşılaşmanın detayları için tıklayınız!" elementtiming="SpeedCurveFRP" class="event__match event__match--scheduled event__match--twoLine"><div class="eventSubscriber eventSubscriber__star eventSubscriber__star--event"><svg class="star-ico eventStar"><title></title>
buradaki gibi her maç için g_1_0ltH1oZ idsi var, bunları çekmek istiyorum.
mesela:

import requests

url = "https://www.flashscore.com.tr/takim/arsenal/hA1Zm19f/sonuclar/"
response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
source_code = response.text
print(source_code)
start_index = source_code.find('AA÷')
ids = list()
while start_index != -1:
    id_start_index = start_index + 3
    id_end_index = id_start_index + 8
    id_value = source_code[id_start_index:id_end_index]
    ids.append(id_value)
    print(id_value)
    start_index = source_code.find('AA÷', id_end_index)
print(ids)

Burada takım sonuçları kısmı için yapabiliyorum. Ama ne yazık ki canlı olanlar için yapamıyorum. yardım edersen sevinirim. teşekkür ederim.