Günümüz yatırımcıları ve analistleri, güncel ve doğru olduğu için Google Finans bilgilerini kullanıyor. Google Finans, şirketlerin finansal ölçümleri hakkında daha fazla ayrıntı verdiğinden, özellikle endeksler ve piyasa eğilimleri ile birlikte hisse senetleri için her türlü güncel finansal veriye sahip olmak için en çok tercih edilen yer gibi görünüyor. Python, web kazıma için en iyi dildir. Bu yazı, gerekli tüm finansal analiz araçlarına sahip olabilmeniz için Google Finans'tan nasıl veri toplayacağınızı öğrenmenize yardımcı olacaktır.
Başlamadan önce, sisteminizde Python kurulu olduğundan emin olun. Ayrıca şu kütüphanelere de ihtiyacınız olacak: HTTP istekleri yapmak için requests ve web sayfalarının HTML içeriğini ayrıştırmak için lxml. Gerekli kütüphaneleri yüklemek için komut satırında aşağıdaki komutları kullanın:
pip install requests
pip install lxml
Daha sonra, Google Finans'tan veri çekme işlemini adım adım inceleyeceğiz:
Google Finans'tan veri kazımak için, ilgilendiğimiz bilgileri içeren belirli HTML öğelerini tanımlamamız gerekir:
Bu XPath ifadeleri, Google Finans sayfalarının HTML yapısında gezinmek ve ilgili verileri ayıklamak için rehberimiz olarak hizmet edecektir.
Başlık:
Fiyat:
Tarih:
Bir kazıyıcı kurarken, verimli ve güvenli veri toplamayı sağlamak için birkaç önemli hususa odaklanmak çok önemlidir.
Google Finance web sitesinden HTML içeriği almak için requests kütüphanesini kullanacağız. Bu adım, veri ayıklamak istediğimiz web sayfasını yükleyerek işlemi başlatır.
Web kazıma yaparken doğru başlıkları, özellikle de User-Agent başlığını kullanmak gerçekten önemlidir. Başlıkların kullanımı, sitenin otomatik komut dosyanızı tanımlamasını ve durdurmasını önleyecek gerçek bir tarayıcı isteğini simüle etmek için çok önemlidir. İstekle ilgili bilgiler vererek sunucunun doğru yanıt vermesini sağlarlar. Uygun başlıklar olmadığında, istek reddedilebilir veya sunucu tamamen farklı içerik döndürebilir ya da içeriği web kazıma faaliyetini kısıtlayabilecek bölümler halinde sunabilir. Bu nedenle, başlıkların uygun şekilde ayarlanması web sitesine erişimin korunmasına yardımcı olur ve kazıyıcının doğru verileri almasını sağlar.
import requests
# Bir tarayıcı ziyaretini taklit etmek ve sunucu tarafından engellenmekten kaçınmak için üstbilgileri tanımlayın
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1', # Do Not Track istek başlığı
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
'sec-ch-ua-arch': '"x86"',
'sec-ch-ua-bitness': '"64"',
'sec-ch-ua-full-version-list': '"Not/A)Brand";v="8.0.0.0", "Chromium";v="126.0.6478.114", "Google Chrome";v="126.0.6478.114"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-model': '""',
'sec-ch-ua-platform': '"Linux"',
'sec-ch-ua-platform-version': '"6.5.0"',
'sec-ch-ua-wow64': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
}
# Euronext Paris (EPA) borsasındaki BNP Paribas (ticker BNP) için Google Finans sayfasının URL'sini tanımlayın
url = "https://www.google.com/finance/quote/BNP:EPA?hl=en"
# Belirtilen başlıklarla URL'ye HTTP GET isteği yapın
response = requests.get(url, headers=headers)
Google Finans'ı veya herhangi bir web sitesini büyük ölçekte kazırken proxy kullanmak çok önemlidir. İşte nedeni:
# Proxy ayarlarını tanımlama
proxies = {
'http': 'http://your_proxy_address:port',
'https': 'https://your_proxy_address:port',
}
# Belirtilen üstbilgiler ve proxy'lerle URL'ye HTTP GET isteği yapın
response = requests.get(url, headers=headers, proxies=proxies)
HTML içeriğini aldıktan sonra, lxml kütüphanesini kullanarak bunu ayrıştırmamız gerekir. Bu, HTML yapısı içinde gezinmemizi ve ihtiyacımız olan verileri çıkarmamızı sağlayacaktır:
HTML içeriğini bir Element nesnesine ayrıştırmak için lxml.html'den fromstring işlevi içe aktarılır. fromstring yöntemi, daha önce alınan web sayfasındaki ham HTML olan response.text'i ayrıştırır ve ayrıştırılan HTML ağacının kökünü temsil eden ayrıştırıcı değişkeninde saklanan bir Element nesnesi döndürür.
from lxml.html import fromstring
# lxml'nin fromstring yöntemini kullanarak yanıtın HTML içeriğini ayrıştırın
parser = fromstring(response.text)
Şimdi, ayrıştırılmış HTML ağacından XPath ifadelerini kullanarak belirli verileri ayıklayalım:
Başlık, ayrıştırılan HTML'den finansal aracın başlığını alır. Fiyat, geçerli hisse senedi fiyatını alır. Tarih, tarihi alır. finance_data sözlüğü çıkarılan başlığı, fiyatı ve tarihi içerir. Bu sözlük bir listeye eklenir.
# Çıktı verilerini saklamak için liste
finance_data_list = []
# Finansal aracın başlığının çıkarılması
title = parser.xpath('//div[@class="zzDege"]/text()')[0]
# Hisse senedinin güncel fiyatının çıkarılması
price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]
# Tarihin çıkarılması
date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]
# Çıkarılan verileri saklamak için bir sözlük oluşturma
finance_data = {
'title': title,
'price': price,
'date': date
}
# finance_data_list'e veri ekleme
finance_data_list.append(finance_data)
Kazınan verileri işlemek için, daha fazla işlemek veya JSON gibi yapılandırılmış bir formatta saklamak isteyebilirsiniz:
output_file değişkeni verilerin kaydedileceği JSON dosyasının adını belirtir (finance_data.json). open(output_file, 'w') dosyayı yazma modunda açar ve json.dump(finance_data_list, f, indent=4) okunabilirlik için finance_data_listesini 4 aralıklı girintiyle dosyaya yazar.
# finance_data_listesini bir JSON dosyasına kaydetme
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
json.dump(finance_data_list, f, indent=4)
Web sitelerinden veri kazırken, kazıma kodunuzun güvenilirliğini ve sağlamlığını sağlamak için istek istisnalarını ele almak önemlidir. Bu istekler ağ sorunları, sunucu hataları veya zaman aşımları gibi çeşitli nedenlerle başarısız olabilir. Python'daki requests kütüphanesi, aşağıda gösterildiği gibi bu tür istisnaları etkili bir şekilde ele almak için bir yol sağlar:
try:
# URL'ye bir GET isteği gönderme
response = requests.get(url)
# Kötü yanıtlar için bir HTTPError yükseltin (4xx veya 5xx durum kodları)
response.raise_for_status()
except requests.exceptions.HTTPError as e:
# HTTP hatalarını işleme (404, 500 vb. gibi)
print(f"HTTP error occurred: {e}")
except requests.exceptions.RequestException as e:
# İstek sırasında oluşabilecek diğer istisnaları ele alın
print(f"An error occurred: {e}")
Try bloğu, istisna oluşturabilecek kodu sarar. requests.get(url) bir GET isteği gönderir. response.raise_for_status(), yanıt durum kodunu kontrol eder ve başarısız kodlar için bir HTTPError yükseltir. except requests.exceptions.HTTPError as e: HTTPError istisnalarını yakalar ve hata mesajını yazdırır. except requests.exceptions.RequestException as e: diğer istisnaları (örneğin, ağ hataları, zaman aşımları) yakalar ve hata mesajını yazdırır.
Şimdi, birden fazla Google Finance URL'sinden veri getiren, ayrıştıran ve ayıklayan kazıyıcı işlevimizi oluşturmak için her şeyi entegre edelim:
import requests
from lxml.html import fromstring
import json
import urllib3
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()
# Kazınacak URL'lerin listesi
urls = [
"https://www.google.com/finance/quote/BNP:EPA?hl=en",
"https://www.google.com/finance/quote/SPY:NYSEARCA?hl=en",
"https://www.google.com/finance/quote/SENSEX:INDEXBOM?hl=en"
]
# Bir tarayıcı ziyaretini taklit etmek için başlıkları tanımlayın
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
'sec-ch-ua-arch': '"x86"',
'sec-ch-ua-bitness': '"64"',
'sec-ch-ua-full-version-list': '"Not/A)Brand";v="8.0.0.0", "Chromium";v="126.0.6478.114", "Google Chrome";v="126.0.6478.114"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-model': '""',
'sec-ch-ua-platform': '"Linux"',
'sec-ch-ua-platform-version': '"6.5.0"',
'sec-ch-ua-wow64': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
}
# Proxy uç noktasını tanımlama
proxies = {
'http': 'http://your_proxy_address:port',
'https': 'https://your_proxy_address:port',
}
# Kazınmış verileri depolamak için liste
finance_data_list = []
# Her URL'yi yineleyin ve verileri kazıyın
for url in urls:
try:
# URL'ye bir GET isteği gönderme
response = requests.get(url, headers=headers, proxies=proxies, verify=False)
# Kötü yanıtlar için bir HTTPError yükseltin (4xx veya 5xx durum kodları)
response.raise_for_status()
# lxml'nin fromstring yöntemini kullanarak yanıtın HTML içeriğini ayrıştırın
parser = fromstring(response.text)
# Başlık, fiyat ve tarihin çıkarılması
title = parser.xpath('//div[@class="zzDege"]/text()')[0]
price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]
date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]
# Çıkarılan verileri bir sözlükte saklama
finance_data = {
'title': title,
'price': price,
'date': date
}
# Sözlük notunu listeye ekle
finance_data_list.append(finance_data)
except requests.exceptions.HTTPError as e:
# HTTP hatalarını işleme (404, 500 vb. gibi)
print(f"HTTP error occurred for URL {url}: {e}")
except requests.exceptions.RequestException as e:
# İstek sırasında oluşabilecek diğer istisnaları ele alın
print(f"An error occurred for URL {url}: {e}")
# finance_data_listesini bir JSON dosyasına kaydetme
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
json.dump(finance_data_list, f, indent=4)
print(f"Scraped data saved to {output_file}")
Çıktı:
Bu kılavuz, `lxml` ve `requests` gibi güçlü kütüphanelerin yanı sıra Python kullanarak Google Finans'tan veri kazıma konusunda kapsamlı bir eğitim sunmaktadır. Derinlemesine piyasa analizi yapmak, rakip faaliyetlerini izlemek veya bilinçli yatırım kararlarını desteklemek için kullanılabilecek finansal veri kazıma için sofistike araçlar oluşturmak için zemin hazırlar.
Yorumlar: 0