Program pengikisan web inovatif untuk menghasilkan rekomendasi mobil bekas yang dipersonalisasi

Ketika saya mengambil cuti beberapa hari dari perguruan tinggi untuk merayakan Thanksgiving pada tahun 2022, saya akhirnya mendapatkan waktu luang yang sangat saya butuhkan. Meskipun saya menghabiskan sebagian besar waktunya bersama keluarga, saya juga ingin memulai proyek pribadi yang akan memanfaatkan keterampilan yang saya peroleh pada semester itu. Dengan magang yang akan datang di Ericsson di Dallas, Texas, saya perlu membeli mobil pertama saya, namun saya hanya tahu sedikit tentang pasar mobil bekas. Banyaknya sumber daya online yang membingungkan membuat saya kewalahan, jadi saya memutuskan untuk membuat program untuk melakukan penelitian untuk saya.

Maka lahirlah Casper. Ini menjelajahi pengecer mobil bekas online seperti AutoTrader, CarsDirect, CarGuru, Carvana, Lowbook, dan KSL untuk data penjualan mobil bekas menggunakan paket Selenium Python. Meskipun saat ini hanya menelusuri mobil di wilayah Provo, Utah, Casper menilai setiap kendaraan untuk menghasilkan laporan CSV tentang pasar saat ini dan mencatat perubahan pasar sejak dimulainya pada November 2022.

Saat Casper menemukan penawaran bagus, ia memperingatkan saya sehingga saya dapat melihat lebih detail mobil yang ditemukannya dan memutuskan apakah saya ingin melakukan pembelian atau melanjutkan. Casper dengan cepat berkembang menjadi salah satu proyek terbesar saya, dan sekarang memiliki beragam kemampuan yang telah saya atur ke dalam bagian berbeda dari artikel ini. Meskipun sistemnya tidak sempurna, sistem ini secara signifikan mengurangi jumlah waktu yang saya habiskan untuk melakukan penelitian dan membuat keputusan akhir saya menjadi lebih tepat.

Nama Casper berasal dari kata Spanyol “raspar”, yang berarti “mengikis”. Selain itu, program ini juga memberi penghormatan kepada “Casper si Hantu Ramah”, karena ketika program sedang berjalan, sepertinya ada hantu yang mengendalikan komputer Anda!

Pengikisan Web

Tujuan utama saya ketika memulai proyek ini adalah untuk mengembangkan keterampilan web scraping saya. Pengikisan web adalah istilah umum yang mengacu pada penggalian data bermakna dari situs web. Dengan mengikuti serangkaian instruksi yang diprogram, program web scraping dapat mengidentifikasi dan mengekstrak data dan menyimpannya dalam database atau mengekspornya ke spreadsheet. Saya memutuskan untuk membangun Casper menggunakan paket pengujian dan otomatisasi Selenium untuk melakukan “penelitian” untuk saya.

Karena saya tinggal di Provo, Utah pada saat itu, fokus saya adalah pada dealer dengan kehadiran paling luas di wilayah tersebut. Meskipun Casper dapat dikonfigurasi ulang untuk mencari kode pos lain dan area yang lebih luas, program ini tidak dapat berjalan di latar belakang dan mudah diperlambat oleh waktu pemuatan halaman yang lama. Menurut saya, membatasi kriteria pencarian juga sangat berguna. Untungnya, Casper mengizinkan pengguna memasukkan parameter pencarian tertentu, termasuk kisaran harga, kisaran jarak tempuh, tahun produksi, kota penjualan dan radius, serta mobil baru atau bekas saja. Dengan masukan ini, Casper menjelajahi platform mobil bekas populer dan mengambil informasi relevan seperti tahun produksi, merek, model, harga, gambar, dan tautan daftar dari hasil pencarian.

Program ini memiliki struktur kode berorientasi objek. Saya membuat instance objek untuk setiap situs web di fungsi utama. Karena setiap situs web unik dan memerlukan beberapa langkah berbeda, lebih masuk akal untuk membuat objek kelas terpisah untuk masing-masing situs daripada mengabstraksikannya ke satu objek. Konstruktor membuka situs web terkait melalui Selenium, dan menyiapkan halaman dengan menambahkan filter pengguna yang diperlukan yang tidak disertakan dalam URL. Terakhir, konstruktor memanggil masing-masing metode temuan, seperti metode yang dijelaskan di bawah.

Fungsi ini menemukan semua harga yang terlihat di halaman saat ini. Dalam contoh ini, saya mencari dengan xpath, artinya Casper akan mencari struktur kode HTML hingga menemukan blok yang cocok dengan priceClass menggunakan metode find_elements pada objek driver Selenium. Variabel string priceClass memberitahu Casper untuk mencari elemen “div” dengan atribut “data-qa” yang memiliki nilai sama dengan “price”. Perulangan for di bagian bawah kemudian mem-parsing daftar yang sesuai sehingga objek string pada akhirnya dapat dilemparkan ke objek int.

def findPrices(self):
    """
    Find the prices for each car
    :param self
    :return: prices (list): list of price strings
    """
    # initialize a list of prices to return
    prices = []

    # define the X-Path to search the HTML code
    priceClass = "//div[@data-qa='price']"

    # get a list of price elements and save the parsed text content
    priceElems = self.driver.find_elements(By.XPATH, priceClass)

    # add the text from the elements to the list
    for elem in priceElems:
        prices.append(elem.text.replace(",", "").replace("$", "").split()[0])

    # return the list of prices
    return prices

Setelah Casper mengambil data dari hasil pencarian, ia membuat daftar objek Mobil dengan mencocokkan setiap mobil dengan parameter yang relevan. Setiap objek Mobil pada dasarnya adalah kamus yang juga menghitung skor keseluruhan mobil dan mendeteksi kesalahan pengikisan. Setelah semua objek Mobil dibuat, Casper menambahkan hasil yang dibersihkan ke file CSV yang sesuai dengan situs web saat ini.

Karena sebagian besar penelusuran menghasilkan beberapa halaman yang masing-masing hanya berisi 20–50 penjualan, Casper berpindah ke halaman berikutnya setelah menghapus halaman pertama, menyetel ulang filter, dan melanjutkan proses hingga menemukan semua hasil. Proses lengkapnya memakan waktu sekitar 30 menit untuk mengumpulkan rata-rata 500 listingan di keenam situs web.

Kompresi Gambar

Mengumpulkan hingga 500 gambar setiap hari adalah tugas yang berat, dan hal ini dapat dengan cepat menghabiskan penyimpanan yang tersedia di komputer. Untuk memperbaiki masalah ini, saya perlu mengompresi gambar agar tidak memakan banyak ruang dan lebih mudah dikelola. Meskipun paket seperti OpenCV menyediakan teknik kompresi gambar bawaan, saya memilih untuk memanfaatkan teknik aljabar linier yang saya pelajari di salah satu kelas ACME untuk membuat algoritma khusus untuk mengompresi gambar secara efisien. Anda dapat menemukan informasi rinci tentang algoritme di postingan blog saya yang lain, “Membuka Rahasia Kompresi Gambar dengan Vektor”.

Intinya, metode yang disebut Dekomposisi Nilai Singular memungkinkan Anda membagi gambar menjadi bagian-bagian komponennya, mengidentifikasi bagian yang paling penting, dan menghapus bagian yang paling tidak penting beserta data yang diperlukan untuk menyimpannya. Saat Anda menggabungkan kembali komponen-komponen ini, gambar yang dihasilkan tampak serupa atau bahkan tidak dapat dibedakan dengan mata manusia, namun memerlukan ruang penyimpanan yang jauh lebih sedikit.

Algoritma Penilaian

Fungsi penilaian yang saya tulis cukup sederhana. Dengan lebih banyak data seperti judul, kondisi, warna, dan peringkat bermerek vs bersih, algoritme ini akan jauh lebih efektif, tetapi untuk apa yang harus saya kerjakan, algoritme tersebut bekerja dengan baik. Ada delapan masukan ke fungsi tersebut: jarak tempuh mobil, harga, tahun, merek, dan bobot untuk masing-masing empat parameter tersebut.

Bobot memungkinkan pengguna memberi tahu Casper betapa pentingnya setiap parameter tersebut bagi mereka. Misalnya, jika jarak tempuh dua kali lebih penting dari hal lainnya, bobotnya masing-masing adalah (2, 1, 1, 1). Bobotnya dinormalisasi, jadi nilai sebenarnya tidak menjadi masalah, yang penting hanyalah nilai relatifnya. Fungsi ini menghitung jumlah rasio antara nilai tercatat dan nilai maksimum ideal, lalu mengalikan nilai tersebut dengan setiap bobot dikalikan seratus. Ini mengembalikan angka antara nol dan seratus. Berikut adalah rumus untuk salah satu perhitungan tersebut menggunakan jarak tempuh sebagai contoh.

Saya membuat keluaran nonlinier dengan sedikit memodifikasi keluaran sebelum mengembalikannya. Rumus ini dirancang untuk membuat nilai buruk menjadi lebih buruk dan nilai baik menjadi lebih baik, sehingga akan lebih mudah untuk menemukan mobil yang menonjol.

Deteksi Kerusakan

Meskipun algoritme penilaian bekerja secara konsisten, terdapat kelemahan signifikan yang menghambat kepraktisannya. Mobil dengan skor tertinggi terkadang mendapat peringkat baik karena mengalami kerusakan yang terlihat dan terkadang parah. Meskipun kerugiannya terlihat jelas bagi mata manusia, yang dapat dilihat oleh fungsi penilaian hanyalah penurunan harga penawaran yang sangat besar.

Untuk mengatasi masalah ini, saya mengembangkan model pembelajaran mesin yang mampu mendeteksi kerusakan pada gambar mobil dengan akurasi lebih dari 99%. Fitur ini sebenarnya adalah proyek akhir untuk kelas Deep Learning saya, dan ternyata lebih menantang daripada yang saya perkirakan sebelumnya. Saya yakin ini juga layak mendapatkan postingannya sendiri, sehingga Anda dapat menemukan informasi lebih lanjut tentangnya di postingan blog saya yang lain, “Mendeteksi Kerusakan Kendaraan dengan Teknologi Pembelajaran Mendalam yang Canggih”. Saya menghabiskan lebih dari tiga puluh jam untuk menambah data gambar kendaraan dengan kumpulan data kerusakan mobil yang tersedia untuk umum untuk melatih jaringan saraf konvolusional mendalam U-Net untuk mengklasifikasikan kendaraan sebagai rusak atau tidak rusak.

Prediksi Harga

Dalam upaya untuk lebih meningkatkan keakuratan penghitungan skor saya, saya membuat model pembelajaran mesin lain yang memprediksi harga mobil berdasarkan fitur-fiturnya. Dengan memanfaatkan pendekatan ini sebagai faktor dalam fungsi penilaian saya, saya dapat mengevaluasi apakah suatu listingan layak dipertimbangkan dengan membandingkan harga penawarannya dengan prediksi harga model saya.

Karena saya memerlukan lebih banyak data tentang setiap mobil untuk membuat model yang lebih akurat, saya memulai dengan kumpulan data yang lebih komprehensif yang saya temukan online. Dengan sedikit pembersihan data dan rekayasa fitur, saya melatih jaringan saraf yang mengandalkan penyematan data selama lebih dari 2000 periode untuk mencapai kinerja yang memuaskan. Meskipun model tersebut menunjukkan hasil yang mengesankan pada data yang diunduh, saya masih perlu menyesuaikannya dengan data terbatas yang diambil Casper sebelum dapat diterapkan pada proyek ini.

Pekerjaan Masa Depan

Seperti yang mungkin telah Anda lihat dari beberapa langkah yang telah saya ambil untuk meningkatkan fungsi penilaian, peningkatan lebih lanjut pada keakuratan dan kegunaan algoritma penilaian mobil tetap menjadi langkah terpenting berikutnya. Meskipun versi saat ini memberikan dasar yang berguna bagi pembeli, mengumpulkan lebih banyak data tentang setiap mobil akan memungkinkan penilaian yang lebih tepat dan rekomendasi yang lebih bermanfaat. Namun, tugas mengumpulkan data tambahan menjadi rumit karena perangkat lunak online yang mendeteksi bot dan menggagalkan upaya Casper untuk melihat informasi lebih rinci tentang listingan tersebut. Melewati kendala ini akan memungkinkan saya memperoleh data yang lebih komprehensif dan meningkatkan fungsi penilaian.

Selain meningkatkan algoritma penilaian kendaraan, memperluas kemampuan Casper untuk memasukkan analisis pasar akan menjadi tantangan yang menarik dan menarik. Dengan data selama beberapa bulan, Casper akan dapat mengidentifikasi tren di pasar mobil bekas lokal dan memberikan wawasan yang lebih bermanfaat bagi pembeli. Misalnya saja, sistem ini dapat menentukan waktu terbaik dalam setahun untuk membeli, berapa lama mobil tertentu cenderung bertahan di pasar, dan bagaimana tren pasar lokal dibandingkan dengan tren pasar nasional.

Terakhir, Casper memerlukan pembaruan terus-menerus untuk beradaptasi dengan perubahan desain apa pun yang terjadi di situs web yang terus berubah. Pemeliharaan ini akan memastikan Casper tetap berfungsi dengan lancar dan memberikan informasi yang akurat dan terkini bagi penggunanya.

Saya harap Anda mempelajari sesuatu dari proyek ini dan algoritma serta teknik yang saya terapkan untuk menangani tantangan dan mengembangkan fitur yang diperlukan oleh parameter proyek. Jika Anda ingin melihat repositori kode, Anda dapat mengunjungi GitHub saya di sini. Saya menghargai kontribusi atau masukan apa pun yang Anda berikan!