Dzisiejsi inwestorzy i analitycy korzystają z informacji Google Finance, ponieważ są one aktualne i dokładne. Google Finance wydaje się być najbardziej preferowanym miejscem do posiadania aktualnych danych finansowych wszelkiego rodzaju, zwłaszcza dla akcji wraz z indeksami i trendami rynkowymi, ponieważ daje więcej szczegółów na temat wskaźników finansowych firm. Python jest najlepszym językiem do skrobania stron internetowych. Ten post pomoże ci dowiedzieć się, jak zbierać dane z Google Finance, abyś mógł mieć wszystkie niezbędne narzędzia do analizy finansowej.
Zanim zaczniesz, upewnij się, że masz zainstalowany Python w swoim systemie. Potrzebne będą również biblioteki: requests do wykonywania żądań HTTP i lxml do analizowania zawartości HTML stron internetowych. Aby zainstalować wymagane biblioteki, użyj następujących poleceń w wierszu poleceń:
pip install requests
pip install lxml
Następnie zbadamy krok po kroku proces wyodrębniania danych z Google Finance:
Aby wyodrębnić dane z Google Finance, musimy zidentyfikować konkretne elementy HTML, które zawierają interesujące nas informacje:
Te wyrażenia XPath posłużą nam jako przewodnik do nawigacji i wyodrębniania odpowiednich danych ze struktury HTML stron Google Finance.
Tytuł:
Cena:
Data:
Podczas konfigurowania scrapera należy skupić się na kilku ważnych aspektach, aby zapewnić wydajne i bezpieczne gromadzenie danych.
Aby pobrać zawartość HTML z witryny Google Finance, użyjemy biblioteki żądań. Ten krok inicjuje proces poprzez załadowanie strony internetowej, z której zamierzamy wyodrębnić dane.
Bardzo ważne jest, aby używać właściwych nagłówków podczas skrobania stron internetowych, w szczególności nagłówka User-Agent. Użycie nagłówków jest niezbędne do symulacji prawdziwego żądania przeglądarki, które uniemożliwi witrynie zidentyfikowanie i zatrzymanie automatycznego skryptu. Upewniają się one, że serwer odpowiada poprawnie, podając odpowiednie informacje o żądaniu. W przypadku braku odpowiednich nagłówków żądanie może zostać odrzucone lub serwer może zwrócić zupełnie inną zawartość lub dostarczyć zawartość w częściach, które mogą ograniczyć aktywność skrobania stron internetowych. Dlatego też odpowiednie ustawienie nagłówków pomaga w utrzymaniu dostępu do strony internetowej i zapewnia, że scraper pobiera prawidłowe dane.
import requests
# Zdefiniuj nagłówki, aby naśladować wizytę w przeglądarce i uniknąć zablokowania przez serwer.
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', # Nagłówek żądania Do Not Track
'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',
}
# Zdefiniuj adres URL strony Google Finance dla BNP Paribas (ticker BNP) na giełdzie Euronext Paris (EPA).
url = "https://www.google.com/finance/quote/BNP:EPA?hl=en"
# Wykonaj żądanie HTTP GET do adresu URL z określonymi nagłówkami
response = requests.get(url, headers=headers)
Podczas skrobania Google Finance lub dowolnej strony internetowej na dużą skalę, kluczowe jest korzystanie z serwerów proxy. Oto dlaczego:
# Definiowanie ustawień serwera proxy
proxies = {
'http': 'http://your_proxy_address:port',
'https': 'https://your_proxy_address:port',
}
# Wykonaj żądanie HTTP GET do adresu URL z określonymi nagłówkami i serwerami proxy
response = requests.get(url, headers=headers, proxies=proxies)
Po pobraniu zawartości HTML, musimy przeanalizować ją za pomocą biblioteki lxml. Pozwoli nam to poruszać się po strukturze HTML i wyodrębnić potrzebne nam dane:
Funkcja fromstring z lxml.html jest importowana w celu przeanalizowania zawartości HTML do obiektu Element. Metoda fromstring analizuje response.text, surowy HTML z pobranej wcześniej strony internetowej i zwraca obiekt Element przechowywany w zmiennej parsera, reprezentujący korzeń przeanalizowanego drzewa HTML.
from lxml.html import fromstring
# Parsowanie zawartości HTML odpowiedzi przy użyciu metody fromstring lxml
parser = fromstring(response.text)
Teraz wyodrębnijmy określone dane za pomocą wyrażeń XPath z przeanalizowanego drzewa HTML:
Tytuł pobiera tytuł instrumentu finansowego z przeanalizowanego kodu HTML. Cena pobiera bieżącą cenę akcji. Data pobiera datę. Słownik finance_data zawiera wyodrębniony tytuł, cenę i datę. Słownik ten jest dołączany do listy.
# Lista do przechowywania danych wyjściowych
finance_data_list = []
# Wyodrębnianie tytułu instrumentu finansowego
title = parser.xpath('//div[@class="zzDege"]/text()')[0]
# Wyodrębnianie bieżącej ceny akcji
price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]
# Wyodrębnianie daty
date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]
# Tworzenie słownika do przechowywania wyodrębnionych danych
finance_data = {
'title': title,
'price': price,
'date': date
}
# dodawanie danych do listy finance_data_list
finance_data_list.append(finance_data)
Aby obsłużyć zeskrobane dane, możesz chcieć je dalej przetwarzać lub przechowywać w ustrukturyzowanym formacie, takim jak JSON:
Zmienna output_file określa nazwę pliku JSON, w którym dane zostaną zapisane (finance_data.json). Open(output_file, 'w') otwiera plik w trybie zapisu, a json.dump(finance_data_list, f, indent=4) zapisuje listę finance_data_list do pliku z wcięciem 4 spacji dla czytelności.
# Zapisz finance_data_list do pliku JSON
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
json.dump(finance_data_list, f, indent=4)
While scraping data from websites, it is important to handle request exceptions in order to ensure the reliability and robustness of your scraping script. These requests can fail for various reasons such as network issues, server errors or timeouts. The requests library in Python provides a way to effectively handle these types of exceptions as shown below:
try:
# Wysyłanie żądania GET do adresu URL
response = requests.get(url)
# Raise an HTTPError for bad responses (4xx or 5xx status codes)
response.raise_for_status()
except requests.exceptions.HTTPError as e:
# Obsługa błędów HTTP (takich jak 404, 500 itp.).
print(f"HTTP error occurred: {e}")
except requests.exceptions.RequestException as e:
# Obsługa wszelkich innych wyjątków, które mogą wystąpić podczas żądania.
print(f"An error occurred: {e}")
Blok try zawiera kod, który może zgłaszać wyjątki. Request.get(url) wysyła żądanie GET. Response.raise_for_status() sprawdza kod statusu odpowiedzi i zgłasza błąd HTTPError w przypadku nieudanych kodów. Wyjątek requests.exceptions.HTTPError as e: wyłapuje wyjątki HTTPError i drukuje komunikat o błędzie. Wyjątek requests.exceptions.RequestException as e: wychwytuje inne wyjątki (np. błędy sieci, przekroczenie limitu czasu) i drukuje komunikat o błędzie.
Teraz zintegrujmy wszystko, aby stworzyć naszą funkcję scrapera, która pobiera, analizuje i wyodrębnia dane z wielu adresów URL Google Finance:
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()
# Lista adresów URL do zeskrobania
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"
]
# Zdefiniuj nagłówki, aby naśladować wizytę w przeglądarce
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',
}
# Definiowanie punktu końcowego proxy
proxies = {
'http': 'http://your_proxy_address:port',
'https': 'https://your_proxy_address:port',
}
# Lista do przechowywania zeskrobanych danych
finance_data_list = []
# Iteruj po każdym adresie URL i zeskrobuj dane
for url in urls:
try:
# Wysyłanie żądania GET do adresu URL
response = requests.get(url, headers=headers, proxies=proxies, verify=False)
# Zgłaszanie błędu HTTPError w przypadku złych odpowiedzi (kody statusu 4xx lub 5xx).
response.raise_for_status()
# Parsowanie zawartości HTML odpowiedzi przy użyciu metody fromstring lxml
parser = fromstring(response.text)
# Wyodrębnianie tytułu, ceny i daty
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]
# Przechowywanie wyodrębnionych danych w słowniku
finance_data = {
'title': title,
'price': price,
'date': date
}
# Append the dictionary noto the list
finance_data_list.append(finance_data)
except requests.exceptions.HTTPError as e:
# Dodanie słownika do listy
print(f"HTTP error occurred for URL {url}: {e}")
except requests.exceptions.RequestException as e:
# Obsługa wszelkich innych wyjątków, które mogą wystąpić podczas żądania.
print(f"An error occurred for URL {url}: {e}")
# Zapisz finance_data_list do pliku JSON
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}")
Wyjście:
Ten przewodnik oferuje kompleksowy samouczek na temat skrobania danych z Google Finance przy użyciu Pythona, wraz z potężnymi bibliotekami, takimi jak `lxml` i `requests`. Stanowi on podstawę do tworzenia zaawansowanych narzędzi do skrobania danych finansowych, które mogą być wykorzystywane do przeprowadzania dogłębnych analiz rynkowych, monitorowania działań konkurencji lub wspierania świadomych decyzji inwestycyjnych.
Komentarze: 0