- Deskripsi Data dan DBMS
- Spesifikasi Program
- Cara Menggunakan
- Struktur JSON
- Struktur Basis Data
- Screenshot
- Referensi
- Penulis
- Lain-Lain
Pada permainan Counter Strike: Global Offensive (CS:GO), terdapat statistik tim dan pemain profesional selama mereka bertanding. Salah satu situs web yang mencatat statistik para pemain dan tim CS:GO adalah HLTV. Pada projek ini, penulis melakukan scraping situs web HLTV untuk mengambil statistik tersebut. Data statistik milik tim yang diambil, antara lain nama, negara asal, peringkat, pelatih, jumlah kemenangan, jumlah seri, jumlah kekalahan, jumlah kill, jumlah death, dan kill-death ratio. Sedangkan data statistik milik pemain yang diambil meliputi nickname, nama asli, negara asal, tim, rating, deaths per round, KAST (persentase pemain mendapatkan kill, assists, bertahan, atau traded), impact, damage per round rata-rata, kils per round, jumlah kill, persentase headshot, kill-death ratio, jumlah map yang sudah dimainkan.
Penulis memilih PostgreSQL sebagai DBMS untuk menyimpan data hasil scraping tersebut. Hal ini karena PostgreSQL merupakan DBMS relasional open-source yang memiliki reputasi yang baik serta cukup kaya dengan fitur. Selain itu, DBMS ini dapat di-deploy pada cloud platform, yaitu Heroku.
Program data scraping pada projek ini menggunakan bahasa Python dengan pustaka HTML parser yang umum dipakai untuk melakukan data scraping, yaitu Beautiful Soup. Di sisi lain, API dibuat menggunakan bahasa Go dengan framework Fiber. Selain itu, API menggunakan GORM sebagai pustaka Object-Relational Mapping (ORM).
- Pastikan Python3 dan PostgreSQL ter-install pada PC Anda. Jika tidak, silakan unduh Python3 di sini dan PostgreSQL di sini
- Buka command prompt lalu pindah ke direktori
src
di dalam folderData Scraping
- Jalankan perintah di bawah ini untuk mengunduh pustaka yang dibutuhkan
pip install -r requirements.txt
- Jalankan perintah di bawah ini untuk menjalankan
main.py
dan memulai scrape
py main.py
- Pilih indeks tim yang akan di-scrape sesuai batas indeks yang tertera. Tunggu hingga program selesai melakukan scraping data. File JSON akan terbuat dalam folder
data
- Untuk menyimpan data hasil scraping ke dalam basis data, jalankan perintah di bawah ini untuk menjalankan
store.py
py store.py
- Pilih opsi pertama jika ingin membuat file
config.ini
untuk konfigurasi basis data, sedangkan pilih opsi kedua fileconfig.ini
sudah tersedia dan ingin memasukkan data JSON ke dalam basis data tersebut
- Pastikan Go ter-install pada PC Anda. Jika tidak, silakan unduh Go di sini
- Buatlah file .env di dalam folder
api
untuk menyimpan konfigurasi basis data yang sudah diisi data sebelumnya dengan contoh sebagai berikut:
DB_HOST= your_host
DB_NAME= your_name
DB_USER= your_user
DB_PASSWORD= your_password
DB_PORT= your_port
- Bukalah command prompt lalu pindah ke direktori
api
- Jalankan perintah di bawah ini untuk menjalankan server melalui file
main.go
go run main.go
- Bukalah browser Anda dan pergi ke alamat
http://localhost:8000
. Jika halaman tersebut menampilkan teks "Selamat datang!", server berhasil berjalan - Untuk mengakses data tambahkan path berikut:
/player
untuk mengakses semua data pemain/player/:playerId
untuk mengakses data pemain berdasarkan id-nya, contohnya/player/1
utnuk mengakses pemain dengan id 1/team
untuk mengakses semua data tim/team/:teamId
untuk mengakses data tim berdasarkan id-nya, contohnya/team/1
untuk mengakses tim dengan id 1
Gunakan Postman dengan metode GET untuk mendapatkan tampilan yang lebih bagus. API dan basis data juga telah di-deploy pada platform Heroku dan dapat diakses di sini
Data yang di-scrape akan disimpan dalam format JSON. Data pemain dan tim akan disimpan dalam dua buah file JSON berbeda. Berikut ini adalah struktur JSON untuk data pemain:
{ "players": [ { "nickname": string, "realname": string, "country": string, "age": integer, "team": string, "rating": float, "dpr": float, "kast": float, "impact": float, "adr": float, "kpr": float, "kills": integer, "hsPercentage": float, "deaths": float, "kdRatio": float, "mapsPlayed": integer }, .. ] }
Berikut ini adalah struktur JSON untuk data tim:
{ "teams": [ { "name": string, "country": string, "rank": integer, "coach": string, "wins": integer, "draws": integer, "losses": integer, "kills": integer, "deaths": integer, "kdRatio": float }, .. ] }
Pada basis data, terdapat empat tabel, yaitu Team, Player, TeamStats, dan PlayerStats dengan rincian di bawah ini. Kolom yang dicetak tebal merupakan primary key.
Kolom | Tipe Data |
---|---|
team_id | INT |
name | VARCHAR |
country | VARCHAR |
rank | INT |
coach | VARCHAR |
Kolom | Tipe Data |
---|---|
player_id | INT |
nickname | VARCHAR |
realname | VARCHAR |
rank | INT |
country | VARCHAR |
age | INT |
team_id | INT |
Kolom | Tipe Data |
---|---|
teamstats_id | INT |
win_count | INT |
draw_count | INT |
lose_count | INT |
kill_count | INT |
death_count | NUMERIC(3,2) |
kd_ratio | INT |
team_id | INT |
Kolom | Tipe Data |
---|---|
playerstats_id | INT |
rating | NUMERIC(3,2) |
dpr | NUMERIC(3,2) |
kast | NUMERIC(4,3) |
impact | NUMERIC(3,2) |
adr | NUMERIC(3,1) |
kpr | NUMERIC(3,2) |
kill_count | INT |
hs_percentage | NUMERIC(4,3) |
death_count | INT |
kd_ratio | NUMERIC(3,2) |
map_count | INT |
player_id | INT |
TeamStats(team_id) -> Team(team_id)
PlayerStats(player_id) -> Player(player_id)
Player(team_id) -> Team(team_id)
Berikut beberapa screenshot program data scraping
- Beautiful Soup
- Psycopg2
- Fiber
- GORM
- https://blog.finxter.com/creating-reading-updating-a-config-file-with-python/
- https://dev.to/percoguru/getting-started-with-apis-in-golang-feat-fiber-and-gorm-2n34
Mohamad Daffa Argakoesoemah
13520118
Teknik Informatika, Institut Teknologi Bandung
Pada tabel Player, terdapat beberapa nickname pemain mengandung huruf selain alfabet latin. Oleh karena itu, jika Anda ingin melakukan query melalui psql (PostgreSQL terminal), ubahlah encoding pada psql dengan menjalankan perintah di bawah ini pada Command Prompt sebelum masuk ke dalam psql.
SET PGCLIENTENCODING=utf-8
chcp 65001
Selanjutnya, bukalah psql melalui jendela Command Prompt yang telah diubah encoding-nya.