Panduan ini mendemonstrasikan cara mengikis data dari Yahoo Finance menggunakan Python, dengan menggunakan pustaka request dan lxml. Yahoo Finance menawarkan data keuangan yang luas seperti harga saham dan tren pasar, yang sangat penting untuk analisis pasar secara real-time, pemodelan keuangan, dan menyusun strategi investasi otomatis.
Prosedur ini melibatkan pengiriman permintaan HTTP untuk mengambil konten halaman web, penguraian HTML yang diterima, dan mengekstraksi data tertentu menggunakan ekspresi XPath. Pendekatan ini memungkinkan ekstraksi data yang efisien dan tepat sasaran, sehingga pengguna dapat mengakses dan memanfaatkan informasi keuangan secara dinamis.
Kita akan menggunakan pustaka Python berikut ini:
Sebelum memulai, pastikan Anda telah menginstal pustaka-pustaka ini:
pip install requests
pip install lxml
Di bawah ini, kita akan menjelajahi proses penguraian secara langkah demi langkah, lengkap dengan contoh kode untuk kejelasan dan kemudahan pemahaman.
Langkah pertama dalam web scraping adalah mengirimkan permintaan HTTP ke URL target. Kita akan menggunakan pustaka permintaan untuk melakukan ini. Sangat penting untuk menyertakan header yang tepat dalam permintaan untuk meniru peramban asli, yang membantu dalam melewati langkah-langkah anti-bot dasar.
import requests
from lxml import html
# URL target
url = "https://finance.yahoo.com/quote/AMZN/"
# Header untuk meniru peramban sungguhan
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',
}
# Kirim permintaan HTTP
response = requests.get(url, headers=headers)
Setelah menerima konten HTML, langkah selanjutnya adalah mengekstrak data yang diinginkan dengan menggunakan XPath. XPath adalah bahasa kueri yang kuat untuk memilih node dari dokumen XML, yang sangat cocok untuk mem-parsing konten HTML.
Judul dan harga:
Keterangan lebih lanjut:
Di bawah ini adalah ekspresi XPath yang akan kita gunakan untuk mengekstrak berbagai bagian data keuangan:
# Mengurai konten HTML
parser = html.fromstring(response.content)
# Mengekstrak data menggunakan 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]
# Mencetak data yang diekstrak
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}")
Situs web seperti Yahoo Finance sering kali menggunakan tindakan anti-bot untuk mencegah pengikisan otomatis. Untuk menghindari pemblokiran, Anda dapat menggunakan proxy dan memutar header.
Server proxy bertindak sebagai perantara antara mesin Anda dan situs web target. Server proxy membantu menyamarkan alamat IP Anda, sehingga situs web lebih sulit mendeteksi bahwa Anda sedang melakukan scraping.
# Contoh penggunaan proxy dengan model otorisasi IP
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
response = requests.get(url, headers=headers, proxies=proxies)
Memutar header Agen-Pengguna adalah cara lain yang efektif untuk menghindari deteksi. Anda dapat menggunakan daftar string User-Agent yang umum dan memilih secara acak satu string untuk setiap permintaan.
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",
# Tambahkan lebih banyak string Agen-Pengguna di sini
]
headers["user-agent"]: random.choice(user_agents)
response = requests.get(url, headers=headers)
Terakhir, Anda dapat menyimpan data yang telah dikikis ke dalam file CSV untuk digunakan di lain waktu. Hal ini sangat berguna untuk menyimpan kumpulan data yang besar atau menganalisis data secara offline.
import csv
# Data yang akan disimpan
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]
]
# Simpan ke file 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")
Di bawah ini adalah skrip Python lengkap yang mengintegrasikan semua langkah yang telah kita bahas. Ini termasuk mengirimkan permintaan dengan header, menggunakan proxy, mengekstrak data dengan XPath, dan menyimpan data ke file CSV.
import requests
from lxml import html
import random
import csv
# Contoh URL yang akan dikikis
url = "https://finance.yahoo.com/quote/AMZN/"
# Daftar string Agen-Pengguna untuk tajuk yang berputar
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",
# Tambahkan lebih banyak string Agen-Pengguna di sini
]
# Header untuk meniru peramban sungguhan
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),
}
# Contoh penggunaan proxy
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
# Kirim permintaan HTTP dengan header dan proksi opsional
response = requests.get(url, headers=headers, proxies=proxies)
# Periksa apakah permintaan berhasil
if response.status_code == 200:
# Mengurai konten HTML
parser = html.fromstring(response.content)
# Mengekstrak data menggunakan 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]
# Mencetak data yang diekstrak
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}")
# Menyimpan data ke file 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}")
Mengikis data Yahoo Finance menggunakan Python adalah cara yang ampuh untuk mengotomatiskan pengumpulan data keuangan. Dengan menggunakan pustaka request dan lxml, bersama dengan header, proksi, dan tindakan anti-bot yang tepat, Anda dapat mengikis dan menyimpan data saham secara efisien untuk dianalisis. Panduan ini membahas dasar-dasarnya, tetapi ingatlah untuk mematuhi pedoman hukum dan etika ketika mengikis situs web.
Komentar: 0