Investor dan analis saat ini menggunakan informasi Google Finance karena informasi tersebut terkini dan akurat. Google Finance tampaknya menjadi tempat yang paling disukai untuk mendapatkan data keuangan terkini dari semua jenis, terutama untuk saham bersama dengan indeks dan tren pasar karena memberikan lebih banyak detail tentang metrik keuangan perusahaan. Python adalah bahasa terbaik untuk web scraping. Postingan ini akan membantu Anda mempelajari cara mengumpulkan data dari Google Finance sehingga Anda dapat memiliki semua alat analisis keuangan yang diperlukan.
Sebelum memulai, pastikan Anda telah menginstal Python di sistem Anda. Anda juga akan membutuhkan pustaka: request untuk membuat permintaan HTTP dan lxml untuk mengurai konten HTML halaman web. Untuk menginstal pustaka yang diperlukan, gunakan perintah berikut pada baris perintah:
pip install requests
pip install lxml
Selanjutnya, kita akan menjelajahi proses langkah demi langkah untuk mengekstrak data dari Google Finance:
Untuk
Ekspresi XPath ini akan menjadi panduan kita untuk menavigasi dan mengekstrak data yang relevan dari struktur HTML halaman Google Finance.
Judul:
Harga:
Tanggal:
Saat menyiapkan scraper, sangat penting untuk fokus pada beberapa aspek penting untuk memastikan pengumpulan data yang efisien dan aman.
Untuk mengambil konten HTML dari situs web Google Finance, kita akan menggunakan pustaka permintaan. Langkah ini memulai proses dengan memuat halaman web yang ingin kita ambil datanya.
Sangat penting untuk menggunakan header yang tepat saat melakukan web scraping, terutama header User-Agent. Penggunaan header sangat penting dalam mensimulasikan permintaan browser asli yang akan mencegah situs mengidentifikasi dan menghentikan skrip otomatis Anda. Header memastikan bahwa server merespons dengan benar dengan memberikan informasi yang relevan tentang permintaan tersebut. Jika tidak ada header yang tepat, permintaan dapat ditolak atau server dapat mengembalikan konten yang sama sekali berbeda atau mengirimkan konten dalam porsi yang dapat membatasi aktivitas web scraping. Oleh karena itu, mengatur header dengan tepat membantu dalam mempertahankan akses ke situs web dan memastikan scraper mengambil data yang benar.
import requests
# Tentukan tajuk untuk meniru kunjungan peramban dan menghindari pemblokiran oleh server
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', # Jangan Lacak header permintaan
'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',
}
# Tentukan URL halaman Google Finance untuk BNP Paribas (ticker BNP) di bursa Euronext Paris (EPA)
url = "https://www.google.com/finance/quote/BNP:EPA?hl=en"
# Buat permintaan HTTP GET ke URL dengan header yang ditentukan
response = requests.get(url, headers=headers)
Saat mengikis Google Finance atau situs web apa pun dalam skala besar, sangat penting untuk menggunakan proxy. Berikut alasannya:
# Menentukan pengaturan proxy
proxies = {
'http': 'http://your_proxy_address:port',
'https': 'https://your_proxy_address:port',
}
# Buat permintaan HTTP GET ke URL dengan header dan proxy yang ditentukan
response = requests.get(url, headers=headers, proxies=proxies)
Setelah kita mendapatkan konten HTML, kita perlu menguraikannya menggunakan pustaka lxml. Hal ini akan memungkinkan kita untuk menavigasi struktur HTML dan mengekstrak data yang kita butuhkan:
Fungsi fromstring dari lxml.html diimpor untuk mem-parsing konten HTML menjadi sebuah objek Element. Metode fromstring mem-parsing response.text, HTML mentah dari halaman web yang diambil sebelumnya, dan mengembalikan objek Element yang disimpan dalam variabel parser, yang merepresentasikan akar dari pohon HTML yang diurai.
from lxml.html import fromstring
# Mengurai konten HTML dari respons menggunakan metode fromstring dari lxml
parser = fromstring(response.text)
Sekarang, mari kita mengekstrak data tertentu menggunakan ekspresi XPath dari pohon HTML yang telah diurai:
Judul mengambil judul instrumen keuangan dari HTML yang diuraikan. Harga mengambil harga saham saat ini. Tanggal mengambil tanggal. Kamus finance_data berisi judul, harga, dan tanggal yang diekstrak. Kamus ini ditambahkan ke dalam sebuah daftar.
# Daftar untuk menyimpan data keluaran
finance_data_list = []
# Mengekstrak judul instrumen keuangan
title = parser.xpath('//div[@class="zzDege"]/text()')[0]
# Mengekstrak harga saham saat ini
price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]
# Mengekstrak tanggal
date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]
# Membuat kamus untuk menyimpan data yang diekstrak
finance_data = {
'title': title,
'price': price,
'date': date
}
# menambahkan data ke daftar_data_keuangan
finance_data_list.append(finance_data)
Untuk menangani data yang dikikis, Anda mungkin ingin memprosesnya lebih lanjut atau menyimpannya dalam format terstruktur seperti JSON:
Variabel output_file menentukan nama file JSON di mana data akan disimpan (finance_data.json). Open(output_file, 'w') membuka file dalam mode tulis, dan json.dump(finance_data_list, f, indent=4) menulis finance_data_list ke dalam file dengan indentasi 4 spasi agar mudah dibaca.
# Menyimpan daftar_data_keuangan ke file JSON
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
json.dump(finance_data_list, f, indent=4)
Saat mengikis data dari situs web, penting untuk menangani pengecualian permintaan untuk memastikan keandalan dan ketangguhan skrip pengikisan Anda. Permintaan ini dapat gagal karena berbagai alasan seperti masalah jaringan, kesalahan server, atau waktu habis. Pustaka permintaan di Python menyediakan cara untuk menangani jenis pengecualian ini secara efektif seperti yang ditunjukkan di bawah ini:
try:
# Mengirim permintaan GET ke URL
response = requests.get(url)
# Naikkan HTTPError untuk respons yang buruk (kode status 4xx atau 5xx)
response.raise_for_status()
except requests.exceptions.HTTPError as e:
# Menangani kesalahan HTTP (seperti 404, 500, dll.)
print(f"HTTP error occurred: {e}")
except requests.exceptions.RequestException as e:
# Menangani pengecualian lain yang mungkin terjadi selama permintaan
print(f"An error occurred: {e}")
Blok coba membungkus kode yang mungkin menimbulkan pengecualian. Requests.get(url) mengirimkan permintaan GET. Response.raise_for_status() memeriksa kode status respons dan memunculkan HTTPError untuk kode yang gagal. Kecuali request.exceptions.HTTPError sebagai e: menangkap pengecualian HTTPError dan mencetak pesan kesalahan. Kecuali requests.exceptions.RequestException sebagai e: menangkap pengecualian lain (misalnya, kesalahan jaringan, batas waktu) dan mencetak pesan kesalahan.
Sekarang, mari kita integrasikan semuanya untuk membuat fungsi scraper yang mengambil, mengurai, dan mengekstrak data dari beberapa 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()
# Daftar URL yang akan dikikis
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"
]
# Tentukan tajuk untuk meniru kunjungan browser
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',
}
# Tentukan titik akhir proxy
proxies = {
'http': 'http://your_proxy_address:port',
'https': 'https://your_proxy_address:port',
}
# Daftar untuk menyimpan data yang dikikis
finance_data_list = []
# Lakukan perulangan pada setiap URL dan kikis data
for url in urls:
try:
# Mengirim permintaan GET ke URL
response = requests.get(url, headers=headers, proxies=proxies, verify=False)
# Naikkan HTTPError untuk respons yang buruk (kode status 4xx atau 5xx)
response.raise_for_status()
# Mengurai konten HTML dari respons menggunakan metode fromstring dari lxml
parser = fromstring(response.text)
# Mengekstrak judul, harga, dan tanggal
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]
# Menyimpan data yang diekstrak dalam kamus
finance_data = {
'title': title,
'price': price,
'date': date
}
# Tambahkan kamus ke dalam daftar
finance_data_list.append(finance_data)
except requests.exceptions.HTTPError as e:
# Menangani kesalahan HTTP (seperti 404, 500, dll.)
print(f"HTTP error occurred for URL {url}: {e}")
except requests.exceptions.RequestException as e:
# Menangani pengecualian lain yang mungkin terjadi selama permintaan
print(f"An error occurred for URL {url}: {e}")
# Menyimpan daftar_data_keuangan ke file 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}")
Keluaran:
Panduan ini menawarkan tutorial komprehensif tentang mengikis data dari Google Finance menggunakan Python, di samping pustaka yang kuat seperti `lxml` dan `request`. Panduan ini memberikan dasar untuk membuat alat canggih untuk mengorek data keuangan, yang dapat digunakan untuk melakukan analisis pasar yang mendalam, memantau aktivitas pesaing, atau mendukung keputusan investasi yang tepat.
Komentar: 0