Beranda BlogPengikisan web Bagaimana menyisir pasar Forex dengan sup yang indah

Bagaimana menyisir pasar Forex dengan sup yang indah

oleh Kadek

Forex, juga dikenal sebagai perdagangan valuta asing, adalah pasar internasional di mana orang memperdagangkan berbagai mata uang secara elektronik over-the-counter (OTC) - dengan kekhasan bahwa tidak ada pasar sentral.

Ini seperti menukar uang saat Anda pergi berlibur, kecuali (di pasar valuta asing) orang membeli dan menjual mata uang untuk mendapatkan keuntungan dari perubahan nilai.

Orang-orang dari seluruh dunia memperdagangkan mata uang 24 jam sehari, lima hari seminggu, menjadikannya salah satu pasar keuangan terbesar di dunia. Dan seperti keputusan keuangan lainnya, data yang tepat akan membantu Anda melakukan investasi yang akurat dan menguntungkan.

Pasar Forex rentan terhadap fluktuasi yang kuat. Oleh karena itu, memprediksi potensi pergerakan naik atau turun memberi Anda keuntungan yang tidak adil dan mencapai hasil yang diinginkan.

Pada artikel ini, kami akan mengekstrak data mata uang dari Yahoo Finance menggunakan Permintaan Python dan Sup Cantik dan mengekspornya ke file CSV menggunakan Pandas.

TL;DR tentang Mengikis Data Forex dengan Sup Cantik (BS4)

Bagi mereka yang berpengalaman, basis kode lengkap ada di sini:

import requests
from bs4 import BeautifulSoup
import pandas as pd

forex_data = ()

payload = {
   'api_key': 'YOUR_API_KEY',
   'country_code': 'us',
   'url': 'https://finance.yahoo.com/currencies'
}

response = requests.get('https://api.scraperapi.com', params=payload)
soup = BeautifulSoup(response.content, 'html.parser')

table = soup.find('tbody')
all_currencies = table.select('tr')
for currency in all_currencies:
   name =  currency.find('td', attrs={'aria-label': 'Name'}).text
   last_price = currency.select_one('td(aria-label="Last Price")').text
   change = currency.find('td', attrs={'aria-label': 'Change'}).text
   percentage = currency.select_one('td(aria-label="% Change") > fin-streamer > span').text
   forex_data.append({
       'Currency': name,
       'Last Price': last_price,
       'Change': change,
       '% Change': percentage
   })

df = pd.DataFrame(forex_data)
df.to_csv('forex.csv', index=False)

Untuk mempelajari bagaimana kami membangunnya dan proses pemikiran di baliknya, silakan baca terus.

1. Memahami Struktur HTML Yahoo Finance

Sebelum kita mulai coding, pertama-tama mari kita lihat halaman mata uang Yahoo untuk memahami apa yang sedang kita hadapi.

Memahami Struktur HTML Yahoo FinanceMemahami Struktur HTML Yahoo Finance

Mata uang yang tersedia di situs tampak ditampilkan dalam format tabel, setidaknya secara visual.

Pada titik ini kita perlu memeriksa dua hal:

  1. Pastikan kita dapat mengakses data ini dari file HTML mentah - dengan kata lain, konten tersebut tidak dimasukkan melalui AJAX.
  2. Pastikan HTML juga terstruktur sebagai tabel.

Untuk melakukan nomor satu, salin salah satu nama mata uang dan klik kanan pada halaman > Lihat Sumber Halaman.

Memahami Struktur HTML Yahoo FinanceMemahami Struktur HTML Yahoo Finance

Sekarang mari kita cari teks yang kita salin. Jika muncul di kode sumber, kita dapat mengekstrak datanya dengan permintaan sederhana.

Memahami Struktur HTML Yahoo FinanceMemahami Struktur HTML Yahoo Finance

Bagus, kami menemukannya! Pemeriksaan ini penting karena jika konten dimasukkan melalui JavaScript, kita harus mengambil pendekatan berbeda. Misalnya, kita dapat menargetkan "API tersembunyi" yang menjadi sumber data halaman, seperti yang kita lakukan saat menyalin tabel dinamis ini, atau kita juga dapat menggunakan browser tanpa kepala seperti Selenium atau Puppeteer (opsi Node.js).

Setelah pemeriksaan kedua, Anda akan terkejut melihat betapa seringnya situs menampilkan tabel tanpa tabel tradisional table > thead > tbody > tr > td Jadi jika Anda menemukan tabel seperti ini, selalu periksa kode HTML di browser sebelum merayakannya.

Memahami Struktur HTML Yahoo FinanceMemahami Struktur HTML Yahoo Finance

Berita bagus lainnya! Memiliki data dalam tabel yang terstruktur dengan baik membuat seluruh proses menjadi lebih mudah dan kami bahkan dapat mengekstrak seluruh tabel menggunakan Pandas. Namun, dalam tutorial ini kita akan menggunakan BS4 untuk mengurai tabel dan hanya menggunakan Pandas untuk mengekspor hasilnya.

Ini berlanjut. Setiap tag tr mewakili baris dalam tabel - yang dapat Anda lihat secara visual dengan mengarahkan kursor ke baris tersebut.

Memahami Struktur HTML Yahoo FinanceMemahami Struktur HTML Yahoo Finance

Setiap sel diwakili oleh tag td…

Memahami Struktur HTML Yahoo FinanceMemahami Struktur HTML Yahoo Finance

...dan semua baris ada di dalam tag tbody.

Memahami Struktur HTML Yahoo FinanceMemahami Struktur HTML Yahoo Finance

Mengetahui hal itu. Rencana yang baik adalah menargetkan isi dan kemudian menyimpan semua baris dalam sebuah variabel. Kemudian kita dapat mengulangi daftar baris dan mengekstrak nama, harga terakhir, perubahan dan persentase perubahan setiap mata uang.

Sekarang kita sudah punya rencana permainan, mari kita program scraper kita!

2. Memulai proyek ekstraksi data Forex

Pertama, mari buat direktori baru untuk proyek dan file Python kita. Kami menamainya forex_scraper.py – sangat orisinal, bukan?

Selanjutnya kita mengimpor semua dependensi yang diperlukan:

import requests
from bs4 import BeautifulSoup
import pandas as pd

Sekarang dependensi kita sudah siap, saatnya mengirimkan inisial kita get() Pertanyaan. Meskipun Yahoo Finance memiliki banyak data publik, bukan berarti mereka tidak akan mencoba memblokir skrip Anda. Mengirimkan permintaan Anda langsung dari komputer Anda dapat mengakibatkan IP Anda diblokir sementara atau bahkan permanen.

Untuk menghindari masalah ini, kami menggunakan ScraperAPI untuk melewati mekanisme anti-scraping yang ditemukan dan memastikan bahwa kami menerima respons yang berhasil dari server. Jangan khawatir tentang harga saat ini karena paket gratis menawarkan Anda 5.000 kredit API untuk 7 hari pertama dan 1.000 kredit API per bulan.

Cukup buat akun ScraperAPI gratis dan salin kunci API Anda. Kami kemudian meneruskan kunci dan URL tujuan kami melalui payload yang ditambahkan sebagai parameter ke titik akhir ScraperAPI:

payload = {
   'api_key': 'YOUR_API_KEY',
   'country_code': 'us',
   'url': 'https://finance.yahoo.com/currencies'
}

response = requests.get('https://api.scraperapi.com', params=payload)

Kami juga menggunakan country_code Parameter untuk memberi tahu ScraperAPI agar selalu menggunakan proxy AS saat mengirimkan permintaan kami.

Untuk memastikan tingkat keberhasilan 99,99 %, ScraperAPI memanfaatkan pembelajaran mesin dan analisis statistik bertahun-tahun untuk memilih kombinasi IP dan header terbaik serta menangani kerumitan tambahan apa pun.

Karena tidak ada lagi yang perlu kami tambahkan, kami mengirimkan permintaan dan print() kode status untuk memeriksa apakah berfungsi dengan:

print(response.status_code)

Setelah menjalankan skrip, Anda akan melihat angka 200 di terminal Anda.

3. Akses data dari sel pertama

Jika Anda mengikuti ini, pada titik ini skrip akan mengembalikan semua kode HTML mentah - Anda dapat melihatnya jika Anda mengeluarkan (respons) alih-alih status_code - jadi kita perlu menguraikannya dengan Beautiful Soup untuk mengubahnya menjadi pohon kode yang diuraikan yang memungkinkan kita melintasi node yang berbeda dan mengekstrak data.

soup = BeautifulSoup(response.content, 'html.parser'

Sekarang semua node berada dalam objek sup yang bisa kita gunakan .find() Dan .select() Metode untuk menargetkan elemen tertentu. Sekarang, sesuai rencana, kita pilih badan meja yang akan dibungkus di antara keduanya

tag.

table = soup.find('tbody')

.find() mengembalikan elemen pertama yang ditemukan, dan karena hanya ada satu elemen tbody, elemen tersebut berfungsi dengan baik untuk kita.

Dalam hal baris, kami ingin skrip kami mengembalikan daftar semuanya tr Elemen dan bukan hanya yang pertama, jadi kami akan menggunakannya .select() – yang mengembalikan daftar semua elemen yang cocok dengan kriteria yang kita lewati – dalam variabel tabel kita.

all_currencies = table.select('tr')

Catatan: kita juga bisa menggunakannya .find_all() metode, tapi kami ingin menunjukkan cara menggunakan keduanya.

Sekarang setelah kita memiliki daftar baris, kita dapat mengulang setiap sel dan mengekstrak data darinya. Itu berarti setiap sel adalah satu td Elemen, jadi bagaimana kita bisa memberi tahu scraper kita dari sel mana data akan diambil?

Jika Anda memahami strukturnya dengan benar, semuanya

memiliki serangkaian

tags. So we can imagine each row like this:

Zugriff auf Daten aus der ersten ZelleZugriff auf Daten aus der ersten Zelle

Jedes Rechteck ist ein td elemen, dan daftarnya dimulai dari 0. Secara teori, Anda dapat menargetkan semua tag td dalam baris dan kemudian memilih setiap kolom berdasarkan posisinya dalam indeks.

Untungnya, jika dilihat lebih dekat elemen-elemennya akan menunjukkan cara yang lebih mudah. Semua elemen dalam baris mempunyai a aria-label Atribut dengan nilai yang sangat deskriptif.

Akses data dari sel pertamaAkses data dari sel pertama

Misalnya, pasangan mata uang memiliki nilai “Nama” dan harga terakhir di bawahnya memiliki nilai “Harga Terakhir”. Untuk mengalamatkan nama setiap mata uang, kita dapat membuat loop seperti ini:

for currency in all_currencies:
   name =  currency.find('td', attrs={'aria-label': 'Name'}).text
   print(name)

Anda akan menerima daftar 24 mata uang yang tercetak di terminal Anda, yang berarti skrip kami berfungsi sejauh ini!

4. Tambahkan semua data ke array

Menyelaraskan titik data yang tersisa mengikuti proses yang sangat mirip, namun dengan beberapa perubahan kecil.

Berbeda dengan nama mata uang, teks sel Harga Terakhir berada dalam elemen yang berbeda - tampak aneh - di dalam mata uang td.

Tambahkan semua data ke arrayTambahkan semua data ke array

Saat menggunakan .find() metode, ia mengembalikan elemen tetapi kami tidak dapat mengekstrak data dengannya .text. Sebaliknya kami menggunakan itu select_one() Metode yang menggunakan sintaks yang sedikit berbeda untuk menargetkan satu elemen dan berhasil:

   last_price = currency.select_one('td(aria-label="Last Price")').text

Untuk kolom Ubah, kami menggunakan metode yang sama seperti untuk Nama:

   change = currency.find('td', attrs={'aria-label': 'Change'}).text

Terakhir, kami harus sedikit lebih kreatif dengan persentase perubahan untuk mencapai tujuan span Elemen yang didalamnya disediakan teks tanpa harus banyak menulis .find() Metode:

   percentage = currency.select_one('td(aria-label="% Change") > fin-streamer > span').text

Catatan: Perhatikan perbedaan antara find() Dan select() Metode karena ini adalah alat utama Anda untuk mengekstrak data dengan mudah menggunakan pemilih CSS.

Karena semua data diambil oleh parser kami, kami menambahkan array kosong sebelum payload...

... dan menggunakannya .append() Metode untuk memformat dan menyimpan semua data di forex_data:

   forex_data.append({
       'Currency': name,
       'Last Price': last_price,
       'Change': change,
       '% Change': percentage
   })

Cuplikan terakhir ini dimasukkan ke dalam loop for setelah elemen terakhir diekstraksi. Pada dasarnya, skrip kami mengekstrak setiap elemen dan kemudian menambahkannya ke array, dengan setiap elemen memiliki nama dan keseluruhannya membentuk satu elemen.

Inilah yang kita dapatkan setelah mencetak array:

(
   {
      "Currency":"EUR/USD",
      "Last Price":"1.1031",
      "Change":"-0.0018",
      "% Change":"-0.17%"
   },

   {
      "Currency":"USD/JPY",
      "Last Price":"133.9490",
      "Change":"+0.3320",
      "% Change":"+0.25%"
   },

   {
      "Currency":"USD/GBP",
      "Last Price":"1.2495",
      "Change":"+0.0030",
      "% Change":"+0.24%"
   },

   {
      "Currency":"USD/AUD",
      "Last Price":"0.6630",
      "Change":"+0.0024",
      "% Change":"+0.36%"
   },

   {
      "Currency":"USD/NZD",
      "Last Price":"0.6148",
      "Change":"+0.0029",
      "% Change":"+0.48%"
   },

   {
      "Currency":"EUR/JPY",
      "Last Price":"147.6980",
      "Change":"+0.2040",
      "% Change":"+0.14%"
   },

   {
      "Currency":"GBP/JPY",
      "Last Price":"167.3310",
      "Change":"+0.7770",
      "% Change":"+0.47%"
   },

   {
      "Currency":"EUR/GBP",
      "Last Price":"0.8826",
      "Change":"-0.0027",
      "% Change":"-0.31%"
   },

   {
      "Currency":"EUR/CAD",
      "Last Price":"1.4996",
      "Change":"-0.0051",
      "% Change":"-0.34%"
   },

   {
      "Currency":"EUR/SEK",
      "Last Price":"11.3484",
      "Change":"-0.0526",
      "% Change":"-0.46%"
   },

   {
      "Currency":"EUR/CHF",
      "Last Price":"0.9858",
      "Change":"+0.0024",
      "% Change":"+0.24%"
   },

   {
      "Currency":"EUR/HUF",
      "Last Price":"373.0700",
      "Change":"-0.7500",
      "% Change":"-0.20%"
   },

   {
      "Currency":"EUR/JPY",
      "Last Price":"147.6980",
      "Change":"+0.2040",
      "% Change":"+0.14%"
   },

   {
      "Currency":"USD/CNY",
      "Last Price":"6.9215",
      "Change":"-0.0041",
      "% Change":"-0.06%"
   },

   {
      "Currency":"USD/HKD",
      "Last Price":"7.8495",
      "Change":"+0.0009",
      "% Change":"+0.01%"
   },

   {
      "Currency":"USD/SGD",
      "Last Price":"1.3348",
      "Change":"-0.0005",
      "% Change":"-0.03%"
   },

   {
      "Currency":"USD/INR",
      "Last Price":"81.6850",
      "Change":"-0.0350",
      "% Change":"-0.04%"
   },

   {
      "Currency":"USD/MXN",
      "Last Price":"18.0482",
      "Change":"-0.0895",
      "% Change":"-0.49%"
   },

   {
      "Currency":"USD/PHP",
      "Last Price":"55.7100",
      "Change":"+0.0500",
      "% Change":"+0.09%"
   },

   {
      "Currency":"USD/IDR",
      "Last Price":"14,699.0000",
      "Change":"-130.0000",
      "% Change":"-0.88%"
   },

   {
      "Currency":"USD/THB",
      "Last Price":"34.0600",
      "Change":"+0.1450",
      "% Change":"+0.43%"
   },

   {
      "Currency":"USD/MYR",
      "Last Price":"4.4600",
      "Change":"+0.0050",
      "% Change":"+0.11%"
   },

   {
      "Currency":"USD/ZAR",
      "Last Price":"18.2845",
      "Change":"-0.1103",
      "% Change":"-0.60%"
   },

   {
      "Currency":"USD/RUB",
      "Last Price":"80.5300",
      "Change":"-1.5710",
      "% Change":"-1.91%"
   }

)

Catatan: Kami menggunakan pemformat JSON untuk mengatur hasilnya secara visual, karena tidak akan terlihat seperti ini ketika dicetak di terminal Anda. Namun, itu tergantung pada organisasi nama:nilai.

5. Mengekspor data keuangan Forex yang di-crack ke file CSV

Di sinilah inisiatif kami untuk menyimpan data dalam sebuah array akan membuahkan hasil! Karena kita sudah memiliki order dan semua informasi di forex_data, kita cukup membuat dataframe menggunakan Pandas:

df = pd.DataFrame(forex_data)

Nama-nama tersebut akan menjadi kolom dan setiap titik data akan berada di bawah yang telah ditentukan.

Untuk sentuhan terakhir kami menggunakan .to_csv() Metode untuk membuat file di direktori proyek kami:

df.to_csv('forex.csv', index=False)

Jika Anda mengikuti, proyek Anda akan terlihat seperti ini:

import requests
from bs4 import BeautifulSoup
import pandas as pd

forex_data = ()

payload = {
   'api_key': 'YOUR_API_KEY',
   'country_code': 'us',
   'url': 'https://finance.yahoo.com/currencies'
}

response = requests.get('https://api.scraperapi.com', params=payload)
soup = BeautifulSoup(response.content, 'html.parser')

table = soup.find('tbody')
all_currencies = table.select('tr')
for currency in all_currencies:
   name =  currency.find('td', attrs={'aria-label': 'Name'}).text
   last_price = currency.select_one('td(aria-label="Last Price")').text
   change = currency.find('td', attrs={'aria-label': 'Change'}).text
   percentage = currency.select_one('td(aria-label="% Change") > fin-streamer > span').text
   forex_data.append({
       'Currency': name,
       'Last Price': last_price,
       'Change': change,
       '% Change': percentage
   })

df = pd.DataFrame(forex_data)
df.to_csv('forex.csv', index=False)

Setelah menjalankan skrip ini, Anda akan menemukan file CSV berikut:

Ekspor data ke file CSVEkspor data ke file CSV

Kumpulkan data keuangan Forex secara otomatis dengan ScraperAPI

Selamat, Anda telah membuat scraper Forex pertama Anda! Kami harap Anda menikmati tutorial web scraping ini sama seperti kami menikmati menulisnya. Tentu saja ini baru permulaan.

Jika Anda memperhatikan kedua kali kami menunjukkan hasilnya, nilainya berbeda untuk setiap pasangan mata uang. Itu karena Yahoo Finance terus memperbarui harga di situsnya, sehingga Anda akan mendapatkan nilai yang sedikit berbeda setiap kali Anda memintanya.

Dengan kata lain, langkah selanjutnya dalam perjalanan ini adalah menyiapkan penjadwal web scraping untuk menjalankan skrip secara otomatis beberapa kali sehari atau seminggu. Ini memungkinkan Anda untuk mulai membuat data historis yang dapat Anda masukkan ke dalam algoritma perdagangan Anda.

Solusi pengikisan web Anda tidak menawarkan fungsionalitas pengikisan otomatis? Lihat ScraperAPI. Dengan solusi DataPipeline kami, Anda dapat mengumpulkan hingga 10.000 URL tepat waktu dan menerima pemberitahuan saat tugas selesai. Daftar ScraperAPI di sini untuk mencobanya.

DataPipeline ScraperAPI untuk menggores data ForexDataPipeline ScraperAPI untuk menggores data Forex

Selain itu, Anda juga dapat membandingkan informasi ini dengan mengevaluasi sumber data Forex lainnya seperti TradingView. Ingat: semakin banyak data yang Anda miliki, semakin baik prediksi yang dapat Anda buat. Jadi mulailah berkreasi sekarang.

Sampai jumpa lagi, selamat menggores!

Pos terkait

Tinggalkan Komentar