Bu kılavuz, Python kullanarak Yahoo Finance'den verilerin requests ve lxml kütüphaneleri kullanılarak nasıl kazınacağını göstermektedir. Yahoo Finance, gerçek zamanlı piyasa analizi, finansal modelleme ve otomatik yatırım stratejileri oluşturmak için çok önemli olan hisse senedi fiyatları ve piyasa trendleri gibi kapsamlı finansal veriler sunar.
Prosedür, web sayfası içeriğini almak için HTTP istekleri göndermeyi, alınan HTML'yi ayrıştırmayı ve XPath ifadelerini kullanarak belirli verileri çıkarmayı gerektirir. Bu yaklaşım, verimli ve hedefe yönelik veri çıkarımı sağlayarak kullanıcıların finansal bilgilere dinamik olarak erişmesine ve bunları kullanmasına olanak tanır.
Aşağıdaki Python kütüphanelerini kullanacağız:
Başlamadan önce bu kütüphaneleri yüklediğinizden emin olun:
pip install requests
pip install lxml
Aşağıda, ayrıştırma sürecini adım adım inceleyeceğiz, netlik ve anlama kolaylığı için kod örnekleriyle tamamlayacağız.
Web kazıma işleminin ilk adımı hedef URL'ye bir HTTP isteği göndermektir. Bunu yapmak için requests kütüphanesini kullanacağız. Gerçek bir tarayıcıyı taklit etmek için isteğe uygun başlıklar eklemek çok önemlidir, bu da temel anti-bot önlemlerini atlamaya yardımcı olur.
import requests
from lxml import html
# Hedef URL
url = "https://finance.yahoo.com/quote/AMZN/"
# Gerçek bir tarayıcıyı taklit etmek için başlıklar
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="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'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/127.0.0.0 Safari/537.36',
}
# HTTP isteğini gönderme
response = requests.get(url, headers=headers)
HTML içeriğini aldıktan sonra, bir sonraki adım XPath kullanarak istenen verileri çıkarmaktır. XPath, HTML içeriğini ayrıştırmak için mükemmel olan bir XML belgesinden düğümleri seçmeye yarayan güçlü bir sorgu dilidir.
Başlık ve fiyat:
Daha fazla detay:
Aşağıda, farklı finansal veri parçalarını ayıklamak için kullanacağımız XPath ifadeleri yer almaktadır:
# HTML içeriğini ayrıştırma
parser = html.fromstring(response.content)
# XPath kullanarak veri ayıklama
title = ' '.join(parser.xpath('//h1[@class="yf-3a2v0c"]/text()'))
live_price = parser.xpath('//fin-streamer[@class="livePrice yf-mgkamr"]/span/text()')[0]
date_time = parser.xpath('//div[@slot="marketTimeNotice"]/span/text()')[0]
open_price = parser.xpath('//ul[@class="yf-tx3nkj"]/li[2]/span[2]/fin-streamer/text()')[0]
previous_close = parser.xpath('//ul[@class="yf-tx3nkj"]/li[1]/span[2]/fin-streamer/text()')[0]
days_range = parser.xpath('//ul[@class="yf-tx3nkj"]/li[5]/span[2]/fin-streamer/text()')[0]
week_52_range = parser.xpath('//ul[@class="yf-tx3nkj"]/li[6]/span[2]/fin-streamer/text()')[0]
volume = parser.xpath('//ul[@class="yf-tx3nkj"]/li[7]/span[2]/fin-streamer/text()')[0]
avg_volume = parser.xpath('//ul[@class="yf-tx3nkj"]/li[8]/span[2]/fin-streamer/text()')[0]
# Çıkarılan verileri yazdırma
print(f"Title: {title}")
print(f"Live Price: {live_price}")
print(f"Date & Time: {date_time}")
print(f"Open Price: {open_price}")
print(f"Previous Close: {previous_close}")
print(f"Day's Range: {days_range}")
print(f"52 Week Range: {week_52_range}")
print(f"Volume: {volume}")
print(f"Avg. Volume: {avg_volume}")
Yahoo Finance gibi web siteleri otomatik kazımayı önlemek için genellikle anti-bot önlemleri kullanır. Engellenmekten kaçınmak için proxy'ler kullanabilir ve başlıkları döndürebilirsiniz.
Proxy sunucusu, makineniz ile hedef web sitesi arasında bir aracı görevi görür. IP adresinizi maskelemenize yardımcı olarak web sitelerinin kazıma yaptığınızı tespit etmesini zorlaştırır.
# IP yetkilendirme modeli ile proxy kullanma örneği
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
response = requests.get(url, headers=headers, proxies=proxies)
User-Agent başlığını döndürmek, tespit edilmekten kaçınmanın bir başka etkili yoludur. Yaygın User-Agent dizelerinin bir listesini kullanabilir ve her istek için rastgele bir tane seçebilirsiniz.
import random
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0",
# Buraya daha fazla User-Agent dizesi ekleyin
]
headers["user-agent"]: random.choice(user_agents)
response = requests.get(url, headers=headers)
Son olarak, kazınan verileri daha sonra kullanmak üzere bir CSV dosyasına kaydedebilirsiniz. Bu, özellikle büyük veri kümelerini depolamak veya verileri çevrimdışı analiz etmek için kullanışlıdır.
import csv
# Kaydedilecek veriler
data = [
["URL", "Title", "Live Price", "Date & Time", "Open Price", "Previous Close", "Day's Range", "52 Week Range", "Volume", "Avg. Volume"],
[url, title, live_price, date_time, open_price, previous_close, days_range, week_52_range, volume, avg_volume]
]
# CSV dosyasına kaydet
with open("yahoo_finance_data.csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerows(data)
print("Data saved to yahoo_finance_data.csv")
Aşağıda, tartıştığımız tüm adımları entegre eden eksiksiz Python betiği bulunmaktadır. Bu, başlıklarla istek göndermeyi, proxy'leri kullanmayı, XPath ile veri çıkarmayı ve verileri bir CSV dosyasına kaydetmeyi içerir.
import requests
from lxml import html
import random
import csv
# Kazımak için örnek URL
url = "https://finance.yahoo.com/quote/AMZN/"
# Dönen üstbilgiler için User-Agent dizelerinin listesi
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0",
# Buraya daha fazla User-Agent dizesi ekleyin
]
# Gerçek bir tarayıcıyı taklit etmek için başlıklar
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="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'User-agent': random.choice(user_agents),
}
# Proxy kullanımına örnek
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
# HTTP isteğini üstbilgiler ve isteğe bağlı proxy'ler ile gönderme
response = requests.get(url, headers=headers, proxies=proxies)
# İsteğin başarılı olup olmadığını kontrol edin
if response.status_code == 200:
# HTML içeriğini ayrıştırma
parser = html.fromstring(response.content)
# XPath kullanarak veri ayıklama
title = ' '.join(parser.xpath('//h1[@class="yf-3a2v0c"]/text()'))
live_price = parser.xpath('//fin-streamer[@class="livePrice yf-mgkamr"]/span/text()')[0]
date_time = parser.xpath('//div[@slot="marketTimeNotice"]/span/text()')[0]
open_price = parser.xpath('//ul[@class="yf-tx3nkj"]/li[2]/span[2]/fin-streamer/text()')[0]
previous_close = parser.xpath('//ul[@class="yf-tx3nkj"]/li[1]/span[2]/fin-streamer/text()')[0]
days_range = parser.xpath('//ul[@class="yf-tx3nkj"]/li[5]/span[2]/fin-streamer/text()')[0]
week_52_range = parser.xpath('//ul[@class="yf-tx3nkj"]/li[6]/span[2]/fin-streamer/text()')[0]
volume = parser.xpath('//ul[@class="yf-tx3nkj"]/li[7]/span[2]/fin-streamer/text()')[0]
avg_volume = parser.xpath('//ul[@class="yf-tx3nkj"]/li[8]/span[2]/fin-streamer/text()')[0]
# Çıkarılan verileri yazdırma
print(f"Title: {title}")
print(f"Live Price: {live_price}")
print(f"Date & Time: {date_time}")
print(f"Open Price: {open_price}")
print(f"Previous Close: {previous_close}")
print(f"Day's Range: {days_range}")
print(f"52 Week Range: {week_52_range}")
print(f"Volume: {volume}")
print(f"Avg. Volume: {avg_volume}")
# Verileri bir CSV dosyasına kaydedin
data = [
["URL", "Title", "Live Price", "Date & Time", "Open Price", "Previous Close", "Day's Range", "52 Week Range", "Volume", "Avg. Volume"],
[url, title, live_price, date_time, open_price, previous_close, days_range, week_52_range, volume, avg_volume]
]
with open("yahoo_finance_data.csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerows(data)
print("Data saved to yahoo_finance_data.csv")
else:
print(f"Failed to retrieve data. Status code: {response.status_code}")
Python kullanarak Yahoo Finance verilerini kazımak, finansal verilerin toplanmasını otomatikleştirmenin güçlü bir yoludur. Uygun başlıklar, proxy'ler ve anti-bot önlemleri ile birlikte requests ve lxml kütüphanelerini kullanarak, analiz için hisse senedi verilerini verimli bir şekilde kazıyabilir ve saklayabilirsiniz. Bu kılavuz temel bilgileri kapsamaktadır, ancak web sitelerini kazırken yasal ve etik kurallara uymayı unutmayın.
Yorumlar: 0