<jupyter_start><jupyter_text>Ekstraksi Data Akan diekstraksi data dari 100 halaman review pada FemaleDaily sebagai batasan agar proses ekstraksi tidak dilakukan terlalu lama. Beirkut adalah syntax yang digunakan untuk mendapatkan data<jupyter_code>import pandas as pd
from time import sleep
from random import randint
import numpy as np
from bs4 import BeautifulSoup
import requests

#Pembuatan array untuk menyimpan data yang diekstraksi
id = []
nama = []
umur = []
id_produk = []
produk = []
brand = []
nilai = []
pembelian = []
kepuasan = []
rekomendasi = []
jenis = []
date = []
tempat = []
tipe =[]
parent = []
waktu_pemakaian = []
penggunaan = []
jumlah_review = []
review = []

url='https://reviews.femaledaily.com/?page='

for page in range(1,100):
    result = requests.get(url)
    temp = result.content
    soup = BeautifulSoup(result.content, 'html.parser')
    string_html = str(result.content)
    print(page)

    startr = '"storeNewestReviews":'
    starting_splitr = string_html.split(startr,1)[1]
    end_splitr = starting_splitr.split('storeProductsCampaign',1)[0]
    raw_list_review = ['"text":"'+itemr for itemr in end_splitr.split('"text":"')[1:]]
    for itemr in raw_list_review:
        start_tokenr = '"text":"'
        end_tokenr = ',"is_like"'
        temp  = itemr.split(start_tokenr, 1)[1]
        resultr = temp.split(end_tokenr, 1)[0]
        review.append(resultr)
    review = list(set(review))

    #Ekstraksi kategori produk
    start = '"storeNewestReviews":'
    starting_split = string_html.split(start,1)[1]
    end_split = starting_split.split('"storeProducts"',1)[0]
    raw_list_jenis = ['"category":{"name":"'+item for item in end_split.split('"category":{"name":"')[1:]]
    for item in raw_list_jenis:
        start_token = '"category":{"name":"'
        end_token = '","slug"'
        temp  = item.split(start_token, 1)[1]
        hasil = temp.split(end_token, 1)[0]
        jenis.append(hasil)

    #Ekstraksi tanggal dibuatnya review
    yuhu = '"storeNewestReviews":'
    starting = string_html.split(yuhu,1)[1]
    end_splits = starting.split('"storeProducts"',1)[0]
    raw_list_date = ['"date":"'+yo for yo in end_splits.split('"date":"')[1:]]
    for yo in raw_list_date:
        start_letsgo = '"date":"'
        end_letsgo = '","text":'
        temp  = yo.split(start_letsgo, 1)[1]
        hisal = temp.split(end_letsgo, 1)[0]
        date.append(hisal)

    # Ekstraksi data tempat pembelian produk
    yuhu1 = '"storeNewestReviews":'
    starting1 = string_html.split(yuhu1,1)[1]
    end1_splits = starting1.split('"storeProducts"',1)[0]
    raw_list_tempat = ['"place_to_get":{"place":"'+wi for wi in end1_splits.split('"place_to_get":{"place":"')[1:]]
    for wi in raw_list_tempat:
        start1_letsgo = '"place_to_get":{"place":"'
        end1_letsgo = '","order"'
        temp  = wi.split(start1_letsgo, 1)[1]
        hisal1 = temp.split(end1_letsgo, 1)[0]
        tempat.append(hisal1)

    #Ekstraksi data kategori parent dari produk yang diulas
    yuhu2 = '"storeNewestReviews":'
    starting2 = string_html.split(yuhu2,1)[1]
    end2_splits = starting2.split('"storeProducts"',1)[0]
    raw_list_parent = ['"parent":{"name":"'+wo for wo in end2_splits.split('"parent":{"name":"')[1:]]
    for wo in raw_list_parent:
        start11_letsgo = '"parent":{"name":"'
        end11_letsgo = '","slug"'
        temp  = wo.split(start11_letsgo, 1)[1]
        hisal11 = temp.split(end11_letsgo, 1)[0]
        parent.append(hisal11)

    #Ekstraksi id user
    yuhu21 = '"storeNewestReviews":'
    starting21 = string_html.split(yuhu21,1)[1]
    end21_splits = starting21.split('"storeProducts"',1)[0]
    raw_list_id = ['"user":{"id":'+wo1 for wo1 in end21_splits.split('"user":{"id":')[1:]]
    for wo1 in raw_list_id:
        start111_letsgo = '"user":{"id":'
        end111_letsgo = ',"username"'
        temp  = wo1.split(start111_letsgo, 1)[1]
        hisal111 = temp.split(end111_letsgo, 1)[0]
        id.append(hisal111)       

    # Ekstraksi id produk yang diulas
    mulai = '"storeNewestReviews":'
    starting211 = string_html.split(mulai,1)[1]
    end211_splits = starting211.split('"storeProducts"',1)[0]
    raw_list_id = ['"product":{"id":'+wo11 for wo11 in end211_splits.split('"product":{"id":')[1:]]
    for wo11 in raw_list_id:
        start1111_letsgo = '"product":{"id":'
        end1111_letsgo = ',"image"'
        temp  = wo11.split(start1111_letsgo, 1)[1]
        hisal1111 = temp.split(end1111_letsgo, 1)[0]
        id_produk.append(hisal1111)

    #Ekstraksi data waktu pemakaian produk
    mulai1 = '"storeNewestReviews":'
    start_line = string_html.split(mulai1,1)[1]
    end_line = start_line.split('"storeProducts"',1)[0]
    raw_list_waktu = ['"duration_of_use":"'+nilai2 for nilai2 in end_line.split('"duration_of_use":"')[1:]]
    for nilai2 in raw_list_waktu:
        start_now = '"duration_of_use":"'
        end_now = '","place_to_get"'
        temp  = nilai2.split(start_now, 1)[1]
        hasilnya = temp.split(end_now, 1)[0]
        waktu_pemakaian.append(hasilnya)

    #Ekstraksi data mulai penggunaan
    mulai11 = '"storeNewestReviews":'
    start_line1 = string_html.split(mulai11,1)[1]
    end_line1 = start_line1.split('"storeProducts"',1)[0]
    raw_list_peng = ['"is_firsttime_use":"'+nilai1 for nilai1 in end_line1.split('"is_firsttime_use":"')[1:]]
    for nilai1 in raw_list_peng:
        start_now1 = '"is_firsttime_use":"'
        end_now1 = '","duration_of_use"'
        temp  = nilai1.split(start_now1, 1)[1]
        hasilnya = temp.split(end_now1, 1)[0]
        penggunaan.append(hasilnya)
      
    #Ekstraksi data-data yang dapat diambil langsung menggunakan struktur html nya
    project = soup.find_all("div", class_="review-card")

    for value in project:
        #Ekstraksi nama pengguna
        name = value.find_all("p", class_="profile-username")
        nama.append(name)

        #Ekstraksi rentang umur pengguna
        age = value.find_all("p", class_="profile-age")
        umur.append(age)

        #Ekstraksi nama produk yang diulas
        product = value.find_all("p", class_="product-name")
        produk.append(product)

        #Ekstraksi brand produk yang diulas
        merek = value.find_all("h3", class_="product-brand")
        brand.append(merek)

        #Ekstraksi nilai rating produk secara total
        puas = value.find_all('span', class_='rating-text')
        nilai.append(puas)

        #Ekstraksi data apakah pengguna merekomendasikan produk atau tidak
        recommend = value.find_all('p', class_='recommend') 
        rekomendasi.append(recommend)
        
        #Ekstraksi tipe kulit pengguna
        tipes = value.find_all('p', class_='profile-description')
        tipe.append(tipes)

        #Ekstraksi jumlah review terhadap produk yang sedang diulas
        jumlach = value.find_all('span', class_='rating-total')
        jumlah_review.append(jumlach)

        #Ekstraksi besar rating yang diberikan pengguna kepada produk yang diulas
        full = len(value.find_all(('i'), class_ = "icon-ic_big_star_full"))
        kepuasan.append(full)
        
    url = 'https://reviews.femaledaily.com/?page='+ str(page+1)

#Pembuatan dataframe dari data yang diekstrak   
a = {'date':date,'id' : id, 'nama' : nama ,'umur' : umur , 'id_produk':id_produk, 
     'produk': produk , 'brand':brand , 'nilai_produk':nilai ,'jumlah_review':jumlah_review, 
     'tempat_beli':tempat, 'jenis': jenis,'kategori': parent, 'tipe_kulit':tipe,
     'waktu_pemakaian':waktu_pemakaian, 'penggunaan':penggunaan, 'kepuasan': kepuasan,
     'rekomendasi': rekomendasi, 'review': review}

skincare = pd.DataFrame.from_dict(a, orient='index')
skincare = skincare.transpose()

skincare.head(5)
skincare.shape<jupyter_output><empty_output><jupyter_text>Selanjutnya, data akan disimpan dalam bentuk CSV agar dapat dibersihkan bentuk html-nya<jupyter_code>from google.colab import files
skincare.to_csv('data_ekstraksi.csv', header = True) 
#files.download("data_tubes.csv")<jupyter_output><empty_output><jupyter_text>Data Cleaning<jupyter_code>data = pd.read_csv('/content/data_ekstraksi.csv')
data.head(2)<jupyter_output><empty_output><jupyter_text>Data di-upload kembali. Kemudian, data baru dikeluarkan dan dilihat bentuknya. Dpaat diihat bahwa bentuk dari data sebelum diganti menjadi CSV dengan data baru memiliki format yang berbeda. Data yang lama memiliki "[[ ]]" yang merupakan penyingkatan dari bentuk html. Setelah data diganti menjadi csv, data html tersebut terlihat sehingga harus dibersihkan terlebih dahulu Data akan dibersihkan dari bentuk html-nya dengan syntax berikut ini<jupyter_code>#Pembersihan data dari bentuk html-nya
from bs4 import BeautifulSoup

date = []
nama = []
umur = []
produk = []
brand = []
nilai_produk = []
tempat_beli = []
jenis = []
kategori = []
tipe_kulit = []
kepuasan = []
rekomendasi = []
jumlah_review = []

for text in data['nama']:
  soup = BeautifulSoup(text,"html.parser")
  name = soup.find('a').get_text()
  nama.append(name)
data.loc[:, 'nama'] = nama

for text in data['umur']:
  soup = BeautifulSoup(text,"html.parser")
  p = soup.find('p')
  if p is not None:
    age = p.get_text()
    umur.append(age)
data['umur']= pd.DataFrame(umur)

for text in data['produk']:
  soup = BeautifulSoup(text,"html.parser")
  produk1 = soup.find('a').get_text()
  produk.append(produk1)
data.loc[:, 'produk'] = produk

for text in data['brand']:
  soup = BeautifulSoup(text,"html.parser")
  merk = soup.find('a').get_text()
  brand.append(merk)
data.loc[:, 'brand'] = brand

for text in data['nilai_produk']:
  soup = BeautifulSoup(text,"html.parser")
  mantap = soup.find('span')
  if mantap is not None:
    lala = mantap.get_text()
    nilai_produk.append(lala)
data['nilai_produk']= pd.DataFrame(nilai_produk)

for text in data['tipe_kulit']:
  soup = BeautifulSoup(text,"html.parser")
  kulit = soup.find('p')
  if kulit is not None:
    lala1 = kulit.get_text()
    tipe_kulit.append(lala1)
data['tipe_kulit']= pd.DataFrame(tipe_kulit)

for text in data['rekomendasi']:
  soup = BeautifulSoup(text,"html.parser")
  mantap4 = soup.find('p')
  if mantap4 is not None:
    lala4 = mantap4.get_text()
    rekomendasi.append(lala4)
data['rekomendasi']= pd.DataFrame(rekomendasi)

for text in data['jumlah_review']:
  soup = BeautifulSoup(text,"html.parser")
  mantap3 = soup.find('span')
  if mantap3 is not None:
    lala3 = mantap3.get_text()
    jumlah_review.append(lala3)
data['jumlah_review']= pd.DataFrame(jumlah_review)

data.head(5)<jupyter_output><empty_output><jupyter_text>Dapat dilihat bahwa data bentuk HTML sudah dibersihkan dan diambil data intinya saja. Kemudian, akan kolom tipe kulit akan dipisah menjadi tiga kolom, yaitu kolom tipe kulit, warna kulit, dan tone kulit<jupyter_code>#Slicing kolom tipe_kulit
data[['tipe_kulit', 'warna_kulit', 'tone_kulit']] = data['tipe_kulit'].str.split(', ', 2, expand=True)
data.head()
data.shape<jupyter_output><empty_output><jupyter_text>Lalu, data akan dideteksi jumlah nilai Nullnya<jupyter_code># Melihat data hilang
data.isna().sum()<jupyter_output><empty_output><jupyter_text>Data null dibuang<jupyter_code>#Membuang data hilang
data = data.dropna()<jupyter_output><empty_output><jupyter_text>Kemudian, terdapat beberapa data emoji yang terekstrasi dalam bentuk unicode. Dengan ini, akan dihilangkan teks emoji yang terdapat pada review.<jupyter_code>#Pembersihan emoji
import re
df = data
df['review'] = data['review'].str.replace(r'\\\w+', '')
df.head()<jupyter_output>/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  after removing the cwd from sys.path.<jupyter_text>Dilakukan transformasi bentuk data pada kolom rekomendasi dari bentuk string menjadi bentuk numerik biner<jupyter_code>#Pengubahan kolom rekomendasi : 1 untuk merekomendasikan produk, 0 untuk tidak merekomendasikan produk
data['rekomendasi'] = data['rekomendasi'].str.replace(r"\b(?!doesn'|t\b)\w+.",'')
data["rekomendasi"] = [0 if ele  == "doesn't  " else 1 for ele in data["rekomendasi"]]<jupyter_output><empty_output><jupyter_text>Dilakkan transformasi bentuk data pada kolom penggunaan menjadi biner<jupyter_code>#Pengubahan kolom rekomendasi : 1 untuk penggunaan pertama kali, 0 untuk bukan penggunaan pertama kali
data["penggunaan"] = ["0" if ele  == "n" else "1" for ele in data["penggunaan"]]
data.head(5)<jupyter_output><empty_output><jupyter_text>Dilakukan penghapusan simbol '( )' pada kolom jumlah review agar si kolom hanya berbentuk numerik<jupyter_code>#Penghapusan string ()
data['jumlah_review'] = data['jumlah_review'].str.replace(r'\(', '')
data['jumlah_review'] = data['jumlah_review'].str.replace(r'\)','')
data.head()
#Pengubahan tipe data kolom
data['penggunaan'] = data['penggunaan'].astype('int')
data['jumlah_review'] = data['jumlah_review'].astype('int')
data.dtypes<jupyter_output><empty_output><jupyter_text>Kemudian, akan dihapus kolom pertama yang tidak akan relevan untuk digunakan pada pengolahan data berjenis apa pun<jupyter_code>data = data.drop(['Unnamed: 0'], axis = 1)
data.head()<jupyter_output><empty_output>
StarcoderdataJupyterStructuredCleanDedup