Tugas 1 : Crawling Berita Online#

Dalam Tugas 1 diminta untuk melakukan proses crawling website berita online. Saya disini menggunakan website https://www.kompas.com/ sebagai bahan untuk tugas ini.

Dibuat Oleh:

  • Nama : Sabil Ahmad Hidayat

  • NIM : 220411100058

  • Kelas : PPW A

Link Code : https://colab.research.google.com/drive/1GoIQHjIVM7qOFbA_eJRwxnRSGfCyQRaW?usp=sharing

Link Github : meinhere/ppw

Crawling Website Berita Online (Kompas)#

Apa itu Web Crawling?#

Web Crawling atau bisa disebut juga Web Spider adalah bot yang otomatis merayapi data melalui tautan. Web Crawling biasanya dioperasikan oleh search engine yang bertugas untuk mencari dan menemukan isi konten atau sesuatu yang ada pada sebuah halaman website.

Web Crawling bekerja dengan mempelajari setiap halaman web, tentang apa halaman tersebut, mendapatkan beberapa metadata (judul, deskripsi, status, dll.) kata kunci sehingga mendapatkan informasi yang dibutuhkan.

Web Crawling digunakan untuk mengekstrak dan menangkap data dari halaman web yang dirayapi kemudian dianalisis untuk mendapatkan informasi.

Bagaimana Web Crawling Bekerja?#

Web Crawling melakukan tugasnya melalui tautan dan melacaknya. Pada dasarnya, susah untuk merayapi banyak halaman sekaligus dalam suatu tautan sehingga perlu menerapkan aturan dan prioritas yang wajib diikuti sesuai dengan syarat yang ada (kepentingan, jumlah kunjungan, jenis konten, profil pengguna, dll).

Setelah halaman berhasil dimuat, teks dalam halaman web dimasukkan ke dalam indeks search engine.

crawl.png

Proses Crawling Website#

Persiapan Library#

# alat untuk crawling
from urllib.request import urlopen
from bs4 import BeautifulSoup

# dataframe
import pandas as pd

# monitoring
from tqdm import tqdm
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
Cell In [1], line 6
      3 from bs4 import BeautifulSoup
      5 # dataframe
----> 6 import pandas as pd
      8 # monitoring
      9 from tqdm import tqdm

File ~\AppData\Roaming\Python\Python310\site-packages\pandas\__init__.py:59
     56 # let init-time option registration happen
     57 import pandas.core.config_init  # pyright: ignore[reportUnusedImport] # noqa: F401
---> 59 from pandas.core.api import (
     60     # dtype
     61     ArrowDtype,
     62     Int8Dtype,
     63     Int16Dtype,
     64     Int32Dtype,
     65     Int64Dtype,
     66     UInt8Dtype,
     67     UInt16Dtype,
     68     UInt32Dtype,
     69     UInt64Dtype,
     70     Float32Dtype,
     71     Float64Dtype,
     72     CategoricalDtype,
     73     PeriodDtype,
     74     IntervalDtype,
     75     DatetimeTZDtype,
     76     StringDtype,
     77     BooleanDtype,
     78     # missing
     79     NA,
     80     isna,
     81     isnull,
     82     notna,
     83     notnull,
     84     # indexes
     85     Index,
     86     CategoricalIndex,
     87     RangeIndex,
     88     MultiIndex,
     89     IntervalIndex,
     90     TimedeltaIndex,
     91     DatetimeIndex,
     92     PeriodIndex,
     93     IndexSlice,
     94     # tseries
     95     NaT,
     96     Period,
     97     period_range,
     98     Timedelta,
     99     timedelta_range,
    100     Timestamp,
    101     date_range,
    102     bdate_range,
    103     Interval,
    104     interval_range,
    105     DateOffset,
    106     # conversion
    107     to_numeric,
    108     to_datetime,
    109     to_timedelta,
    110     # misc
    111     Flags,
    112     Grouper,
    113     factorize,
    114     unique,
    115     value_counts,
    116     NamedAgg,
    117     array,
    118     Categorical,
    119     set_eng_float_format,
    120     Series,
    121     DataFrame,
    122 )
    124 from pandas.core.dtypes.dtypes import SparseDtype
    126 from pandas.tseries.api import infer_freq

File ~\AppData\Roaming\Python\Python310\site-packages\pandas\core\api.py:1
----> 1 from pandas._libs import (
      2     NaT,
      3     Period,
      4     Timedelta,
      5     Timestamp,
      6 )
      7 from pandas._libs.missing import NA
      9 from pandas.core.dtypes.dtypes import (
     10     ArrowDtype,
     11     CategoricalDtype,
   (...)
     14     PeriodDtype,
     15 )

File ~\AppData\Roaming\Python\Python310\site-packages\pandas\_libs\__init__.py:18
     16 import pandas._libs.pandas_parser  # noqa: E501 # isort: skip # type: ignore[reportUnusedImport]
     17 import pandas._libs.pandas_datetime  # noqa: F401,E501 # isort: skip # type: ignore[reportUnusedImport]
---> 18 from pandas._libs.interval import Interval
     19 from pandas._libs.tslibs import (
     20     NaT,
     21     NaTType,
   (...)
     26     iNaT,
     27 )

File interval.pyx:1, in init pandas._libs.interval()

File <frozen importlib._bootstrap>:404, in parent(self)

KeyboardInterrupt: 

urlopen berfungsi sebagai http client untuk menangkap dan memproses url

BeautifulSoup berfungsi untuk mengambil dan memetakan data (parse) dari HTML/XML

pandas berfungsi untuk memproses data ke dalam dataframe

tqdm berfungsi untuk melakukan tracking terhadap proses pengambilan setiap berita

Membuat Fungsi untuk Persiapan Crawling#

# fungsi untuk mengambil link yang akan dilakukan crawling
def extract_urls(url):
    html = urlopen(url).read()
    soup = BeautifulSoup(html, 'html.parser')

    urls = soup.find_all("a", {"class": "paging__link"})
    urls = [url.get('href') for url in urls]

    return urls

# fungsi untuk mengambil isi dari berita
def get_content(url):
    html = urlopen(url).read()
    soup = BeautifulSoup(html, 'html.parser')

    div = soup.find("div", {"class": "read__content"})
    paragraf = div.find_all("p")

    content = ''
    for p in paragraf:
        content += p.text

    return content

function extract_urls digunakan untuk melakukan ekstraksi link url yang memiliki pagination pada halaman awal, sehingga didapat beberapa url yang bisa mengarah ke halaman selanjutnya atau sebelumnya.

function get_content digunakan untuk melakukan proses pembuatan isi berita sesuai link berita yang dicari.

Crawling Data#

Pada tahap ini dilakukan proses crawling data terhadap berita dari url yang akan dicari. Dibutuhkan beberapa variabel yang perlu disiapkan

  • news digunakan untuk menyimpan data berita hasil crawling

  • link digunakan untuk menentukan url website yang akan dicari

  • page digunakan untuk menentukan jumlah halaman yang akan dicari

  • news_per_page digunakan untuk menentukan jumlah berita per halaman

  • urls digunakan untuk menampung beberapa link yang akan dilakukan proses crawling

# inisialisasi variabel penampung hasil berita
news_data = []

# inisialisasi persiapan untuk crawling berita
link = "https://indeks.kompas.com"
# last_url = extract_urls(link).pop()
# page = last_url.split('=').pop() # jumlah halaman secara otomatis
page = 1 # jumlah halaman secara manual

# persiapan link yang akan dilakukan crawling
urls = [link + '/?page=' + str(a) for a in range(1, int(page) + 1)]

# menelusuri semua link yang telah ditentukan
for idx, url in enumerate(urls):
    html = urlopen(url).read()
    soup = BeautifulSoup(html, 'html.parser')

    # mengambil data yang diperlukan pada struktur html
    links       = soup.find_all("a", {"class": "article-link"})
    titles      = soup.find_all("h2", {"class": "articleTitle"})
    dates       = soup.find_all("div", {"class": "articlePost-date"})
    categories  = soup.find_all("div", {"class": "articlePost-subtitle"})

    news_per_page = len(links) # berita artikel yang ditampilkan

    # memasukkan data ke dalam list
    for elem in tqdm(range(news_per_page)):
      news = {}
      news['No']               = news_per_page * idx + (elem + 1)
      news['Judul Berita']     = titles[elem].text
      news['Isi Berita']       = get_content(links[elem].get("href"))
      news['Tanggal Berita']   = dates[elem].text
      news['Kategori Berita']  = categories[elem].text

      news_data.append(news)
100%|██████████| 15/15 [00:18<00:00,  1.25s/it]

Dari proses yang dilakukan diatas, didapatkan data berita yang ada di variabel news_data sesuai dengan jumlah halaman dan berita per halaman yang dicari

Konversi ke dalam Data Frame#

Selanjutnya pada tahap ini, dilakukan proses konversi data yang ada ke dalam dataframe agar dapat dilihat dalam bentuk tabel dan dimanipulasi sesuai keinginan.

main_df = pd.DataFrame(news_data).set_index('No')
main_df
Judul Berita Isi Berita Tanggal Berita Kategori Berita
No
1 Jokowi dan Iriana Jenguk Cucu Keenam, Bebingah... JAKARTA, KOMPAS.com - Presiden Joko Widodo ber... 16/10/2024 NEWS
2 Bahrain Ajukan Pemindahan Lokasi Lawan Indones... KOMPAS.com - Exco PSSI Arya Sinulingga memasti... 16/10/2024 BOLA
3 Dari Sumber Terlindungi di 17 Gunung Terpilih,... KOMPAS.com - Akses ke air bersih dan sehat mer... 16/10/2024 HEALTH
4 DPR: Herindra Lolos Fit and Proper Test Menjad... KOMPAS.com - Dewan Perwakilan Rakyat (DPR) Rep... 16/10/2024 NEWS
5 Pria di Pasar Minggu Todongkan Pistol ke PPSU ... JAKARTA, KOMPAS.com - FA, menodongkan pistol ... 16/10/2024 NEWS
6 Kecemasan Masa Kecil Bisa Sebabkan Anak Alami ... KOMPAS.com - Banyak orangtua percaya bahwa ket... 16/10/2024 LIFESTYLE
7 Tips Menyiram Tanaman Peace Lily agar Semakin ... KOMPAS.com - Peace lily atau bunga lili perdam... 16/10/2024 HOMEY
8 Hitung Biaya Servis Honda Stylo 160 CBS JAKARTA, KOMPAS.com – Honda Stylo 160 CBS seca... 16/10/2024 OTOMOTIF
9 Bawaslu Jakarta: Ketua dan Anggota DPRD Dapat ... JAKARTA, KOMPAS.com - Badan Pengawasan Pemilih... 16/10/2024 NEWS
10 Tantangan Indonesia untuk Dongkrak Industriali... JAKARTA, KOMPAS.com - Indonesia menghadapi sej... 16/10/2024 MONEY
11 Kimberly Ryder Mengaku Disekap, Edward Akbar: ... JAKARTA, KOMPAS.com - Artis peran Edward Akbar... 16/10/2024 HYPE
12 Mengenal Planet Dalam dan Planet Luar di Tata ... KOMPAS.com - Dalam pengertian sederhana, plane... 16/10/2024 TREN
13 Momen Pendukung Airin-Ade Soraki Pasangan Andr... JAKARTA, KOMPAS.com - Pendukung pasangan guber... 16/10/2024 NEWS
14 BNI Ingatkan Mahasiswa tentang Pentingnya Perl... JAKARTA, KOMPAS.com - PT Bank Negara Indonesia... 16/10/2024 MONEY
15 Pasangan ASIH Terima Dukungan dari DDII Jabar,... KOMPAS.com - Pasangan calon (paslon) Gubernur ... 16/10/2024 NEWS

Save Data#

main_df.to_csv('data_berita.csv', index=False)