Ten przewodnik pokazuje, jak skrobać dane z Yahoo Finance za pomocą Pythona, wykorzystując biblioteki requests i lxml. Yahoo Finance oferuje obszerne dane finansowe, takie jak ceny akcji i trendy rynkowe, które są kluczowe dla analizy rynku w czasie rzeczywistym, modelowania finansowego i tworzenia zautomatyzowanych strategii inwestycyjnych.
Procedura obejmuje wysyłanie żądań HTTP w celu pobrania zawartości strony internetowej, analizowanie otrzymanego kodu HTML i wyodrębnianie określonych danych za pomocą wyrażeń XPath. Takie podejście umożliwia wydajną i ukierunkowaną ekstrakcję danych, umożliwiając użytkownikom dynamiczny dostęp i wykorzystanie informacji finansowych.
Będziemy używać następujących bibliotek Pythona:
Przed rozpoczęciem upewnij się, że masz zainstalowane te biblioteki:
pip install requests
pip install lxml
Poniżej przeanalizujemy proces parsowania krok po kroku, wraz z przykładami kodu dla jasności i łatwości zrozumienia.
Pierwszym krokiem w web scrapingu jest wysłanie żądania HTTP do docelowego adresu URL. W tym celu użyjemy biblioteki requests. Kluczowe jest dołączenie odpowiednich nagłówków do żądania, aby naśladować prawdziwą przeglądarkę, co pomaga w ominięciu podstawowych zabezpieczeń przed botami.
import requests
from lxml import html
# Docelowy adres URL
url = "https://finance.yahoo.com/quote/AMZN/"
# Nagłówki naśladujące prawdziwą przeglądarkę
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',
}
# Wysyłanie żądania HTTP
response = requests.get(url, headers=headers)
Po otrzymaniu zawartości HTML, następnym krokiem jest wyodrębnienie pożądanych danych za pomocą XPath. XPath to potężny język zapytań do wybierania węzłów z dokumentu XML, który doskonale nadaje się do analizowania treści HTML.
Tytuł i cena:
Więcej szczegółów:
Poniżej znajdują się wyrażenia XPath, których użyjemy do wyodrębnienia różnych danych finansowych:
# Parsowanie zawartości HTML
parser = html.fromstring(response.content)
# Wyodrębnianie danych przy użyciu XPath
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]
# Drukowanie wyodrębnionych danych
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}")
Strony takie jak Yahoo Finance często stosują środki zapobiegające botom, aby zapobiec automatycznemu skrobaniu. Aby uniknąć zablokowania, można korzystać z serwerów proxy i obracać nagłówki.
Serwer proxy działa jako pośrednik między komputerem użytkownika a docelową witryną internetową. Pomaga on zamaskować adres IP użytkownika, utrudniając witrynom wykrycie scrapingu.
# Przykład użycia serwera proxy z modelem autoryzacji IP
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
response = requests.get(url, headers=headers, proxies=proxies)
Obracanie nagłówków User-Agent to kolejny skuteczny sposób na uniknięcie wykrycia. Możesz użyć listy typowych ciągów User-Agent i losowo wybrać jeden dla każdego żądania.
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",
# Dodaj więcej ciągów User-Agent tutaj
]
headers["user-agent"]: random.choice(user_agents)
response = requests.get(url, headers=headers)
Na koniec możesz zapisać zeskrobane dane w pliku CSV do późniejszego wykorzystania. Jest to szczególnie przydatne w przypadku przechowywania dużych zbiorów danych lub analizowania danych w trybie offline.
import csv
# Dane do zapisania
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]
]
# Zapisz do pliku CSV
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")
Poniżej znajduje się kompletny skrypt Pythona, który integruje wszystkie kroki, które omówiliśmy. Obejmuje to wysyłanie żądań z nagłówkami, korzystanie z serwerów proxy, wyodrębnianie danych za pomocą XPath i zapisywanie danych do pliku CSV.
import requests
from lxml import html
import random
import csv
# Przykładowy adres URL do zeskrobania
url = "https://finance.yahoo.com/quote/AMZN/"
# Lista ciągów User-Agent dla obracających się nagłówków
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",
# Add more User-Agent strings here
]
# Nagłówki naśladujące prawdziwą przeglądarkę
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),
}
# Przykład użycia proxy
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
# Wyślij żądanie HTTP z nagłówkami i opcjonalnymi serwerami proxy
response = requests.get(url, headers=headers, proxies=proxies)
# Sprawdź, czy żądanie się powiodło
if response.status_code == 200:
# Parsowanie zawartości HTML
parser = html.fromstring(response.content)
# Wyodrębnianie danych przy użyciu XPath
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]
# Drukowanie wyodrębnionych danych
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}")
# Zapisywanie danych w pliku CSV
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}")
Skrobanie danych Yahoo Finance za pomocą Pythona to potężny sposób na zautomatyzowanie gromadzenia danych finansowych. Korzystając z bibliotek requests i lxml, wraz z odpowiednimi nagłówkami, serwerami proxy i środkami zapobiegającymi botom, można skutecznie skrobać i przechowywać dane giełdowe do analizy. Niniejszy przewodnik obejmuje podstawy, ale należy pamiętać o przestrzeganiu wytycznych prawnych i etycznych podczas skrobania stron internetowych.
Komentarze: 0