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