Python ile Google finans verileri nasıl kazınır?

Yorumlar: 0

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.

Gerekli kütüphanelerin yüklenmesi

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:

Adım 1: HTML Yapısını Anlama

Google Finans'tan veri kazımak için, ilgilendiğimiz bilgileri içeren belirli HTML öğelerini tanımlamamız gerekir:

  • Başlık: şurada bulunur //div[@class="zzDege"]/text()
  • Fiyat: şurada bulunur //div[@class="YMlKec fxKbKc"]/text()
  • Tarih: şu adreste //div[@class="ygUjEc"]/text()

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:

1.png

Fiyat:

2.png

Tarih:

3.png

Adım 2: Kazıyıcı işlevini ayarlama

Bir kazıyıcı kurarken, verimli ve güvenli veri toplamayı sağlamak için birkaç önemli hususa odaklanmak çok önemlidir.

HTTP isteği oluşturma

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.

Kazıma işleminde doğru başlıkları kullanmanın önemi

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)

Proxy kullanmanın önemi

Google Finans'ı veya herhangi bir web sitesini büyük ölçekte kazırken proxy kullanmak çok önemlidir. İşte nedeni:

  • IP yasaklarından kaçının: Google Finans gibi web siteleri genellikle kısa sürede çok fazla istekte bulunan IP adreslerinin erişimini engeller veya kısıtlar. Proxy'ler isteklerin birden fazla IP adresine dağıtılmasına yardımcı olarak tespit edilme ve yasaklanma olasılığını azaltır.
  • Gelişmiş gizlilik: proxy kullanmak bir anonimlik katmanı ekleyerek veri kazırken kimliğinizi ve niyetinizi korur.
# 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'yi lxml ile ayrıştırma

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)

XPath ile veri ayıklama

Ş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)

Veri işleme ve depolama

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)

İstek istisnalarını işleme

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.

Tamamlanmış kod

Ş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ı:

4.png

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 yorumlar