Skip to content

daffarg/csgo-api

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

64 Commits
 
 
 
 
 
 
 
 

Repository files navigation


Scraping CS:GO Teams and Players from HLTV.org


Tugas 1 Seleksi Calon Warga Basdat 2022

hltv

Daftar Isi

Deskripsi Data dan DBMS

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.

Spesifikasi Program

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).

Cara Menggunakan

Program Data Scraping

  1. Pastikan Python3 dan PostgreSQL ter-install pada PC Anda. Jika tidak, silakan unduh Python3 di sini dan PostgreSQL di sini
  2. Buka command prompt lalu pindah ke direktori src di dalam folder Data Scraping
  3. Jalankan perintah di bawah ini untuk mengunduh pustaka yang dibutuhkan
pip install -r requirements.txt
  1. Jalankan perintah di bawah ini untuk menjalankan main.py dan memulai scrape
py main.py
  1. 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
  2. Untuk menyimpan data hasil scraping ke dalam basis data, jalankan perintah di bawah ini untuk menjalankan store.py
py store.py
  1. Pilih opsi pertama jika ingin membuat file config.ini untuk konfigurasi basis data, sedangkan pilih opsi kedua file config.ini sudah tersedia dan ingin memasukkan data JSON ke dalam basis data tersebut

API

  1. Pastikan Go ter-install pada PC Anda. Jika tidak, silakan unduh Go di sini
  2. 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
  1. Bukalah command prompt lalu pindah ke direktori api
  2. Jalankan perintah di bawah ini untuk menjalankan server melalui file main.go
go run main.go
  1. Bukalah browser Anda dan pergi ke alamat http://localhost:8000. Jika halaman tersebut menampilkan teks "Selamat datang!", server berhasil berjalan
  2. 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

Struktur JSON

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
        },
        ..
    ]
}

Struktur Basis Data

Pada basis data, terdapat empat tabel, yaitu Team, Player, TeamStats, dan PlayerStats dengan rincian di bawah ini. Kolom yang dicetak tebal merupakan primary key.

Team

Kolom Tipe Data
team_id INT
name VARCHAR
country VARCHAR
rank INT
coach VARCHAR

Player

Kolom Tipe Data
player_id INT
nickname VARCHAR
realname VARCHAR
rank INT
country VARCHAR
age INT
team_id INT

TeamStats

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

PlayerStats

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

Foreign Key

TeamStats(team_id) -> Team(team_id)
PlayerStats(player_id) -> Player(player_id)
Player(team_id) -> Team(team_id)

Screenshot

Berikut beberapa screenshot program data scraping

Fungsi parseHTML dan getTeamsLink

Fungsi parseHTML dan getTeamsLink

Fungsi getTeamStats

Fungsi getTeamStats

Fungsi getTeamProfile

Fungsi getTeamProfile

Fungsi getPlayerData

Fungsi getPlayerData(1) Fungsi getPlayerData(2)

Fungsi writeJson

Fungsi writeJson

Fungsi startScrape

Fungsi startScrape

Program Main

Program Main

Penyimpanan Data pada Basis Data

tabel Player tabel Team

Referensi

Pustaka

  • Beautiful Soup
  • Psycopg2
  • Fiber
  • GORM

Tautan

Penulis

Mohamad Daffa Argakoesoemah
13520118
Teknik Informatika, Institut Teknologi Bandung

Lain-Lain

Penanganan Encoding pada psql

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.

Releases

No releases published

Packages

No packages published

Languages

  • PLpgSQL 53.0%
  • Python 32.9%
  • Go 14.1%