Web Scraping Berita Kompas dengan Python Scrapy |
Seiring dengan perkembangan media daring, kebutuhan masyarakat terhadap informasi demikian tinggi. Bila untuk memperoleh informasi, masyarakat harus membeli koran, majalah, atau media cetak lainnya, kini informasi itu bisa didapatkan dari ujung jemari saja. Era disrupsi mendorong sejumlah media cetak bertransformasi menjadi media daring, salah satunya adalah kompas.com.
Setiap berita yang berada di halaman-halaman daring media sebenarnya merupakan sekumpulan data dan informasi yang berjumlah besar sehingga memerlukan daya tampung penyimpan yang besar. Selain itu, kecepatan dan daya update kontennya juga cukup tinggi sehingga dalam konteks era Data Science, berita-berita tersebut memenuhi syarat sebagai Big Data.
Pada kesempatan kali ini, kita akan belajar bersama bagaimana menambang data dari berita daring. Adapun target media yang akan kita jadikan sebagai ajang latihan adalah kompas.com, sebuah media daring terbesar sekaligus mempunyai jangkauan luas di Indonesia sejauh ini. Berikut display halaman kompas.com yang akan kita scrape beritanya:
Laman indeks berita kompas.com |
Sebelum melakukan web scraping berita kompas.com, beberapa package yang diperlukan yaitu scrapy, pandas, requests, wordcloud, matplotlib, serta package yang khusus menangani data teks berbahasa Indonesia, yaitu package Sastrawi.
Dalam melakukan web scraping berita, tool yang kita gunakan untuk memperoleh node menggunakan CSS Selector atau bisa juga menggunakan Addons chrome, yakni Selector Gadget. Berikut langkah-langkah web scraping berita kompas.com:
#Import dan aktivasi package
import pandas as pd
import requests
from scrapy.http import TextResponse
C:\Users\56848\AppData\Local\Programs\Python\Python310\lib\site-packages\requests\__init__.py:102: RequestsDependencyWarning: urllib3 (1.26.8) or chardet (5.1.0)/charset_normalizer (2.0.12) doesn't match a supported version! warnings.warn("urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported "
#Deklarasi alamat situs
url = "https://indeks.kompas.com/"
res = requests.get(url)
respon = TextResponse(res.url, body = res.text, encoding = "utf-8")
#Melihat status website
kompas = respon.css(".latest--indeks")
kompas
[<Selector xpath="descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' latest--indeks ')]" data='<div class="latest--indeks mt2 clearf...'>]
#Scrape judul berita
judul = respon.css(".article__link::text").getall()
judul
['Cara ke Pameran Artefak Nabi Muhammad Naik KRL dan Transjakarta', 'Viral, Video TKW Hong Kong Dikenai Denda Rp 9 Juta karena Beli Gamis Rp 200.000, Bea Cukai: Itu Penipuan', 'Disayangkan, Lokomotif Tua dari Kediri dan Pemalang Dipinjamkan ke Belanda', 'Memilih Parfum Mobil Harus Benar, jika Salah Bisa Merusak Komponen Ini', 'Resep Kue Ulat Sutra, Gurih dengan Penggunaan Kaldu Bubuk ', 'Buka Lelang Impor Beras, Bos Bulog: 4 Negara Sudah Menawarkan', 'Mendagri Hadiri Rapat Paripurna Pengesahan Perppu Pemilu, 43 Anggota DPR Hadir Fisik', 'Polda Metro: Unggahan Baju Bekas yang Disebut "Ditilap" Penyidik adalah Foto Konferensi Pers', '1 Perampok yang Tewaskan Sopir Taksi "Online" di Tol Jagorawi Ditangkap, 2 Buron', 'Meneladani Ekalaya di Era Merdeka Belajar', 'Alasan Logo Twitter Berubah Jadi Gambar Anjing Shiba Inu Hari Ini', 'Golkar: PDI-P Sampai Sekarang Masih Ambil Posisi Sendirian Hadapi Pemilu 2024, Kita Kormati', 'Emas Antam Naik Rp 5.000, Simak Rincian Harganya', 'Seleksi Mandiri UNY 2023, Simak Jadwal dan Syaratnya', 'Indonesia Dapat Hibah 15 Rantis Bushmaster dari Australia']
#Scrape tanggal posting berita
tgl = respon.css(".article__date::text").getall()
tgl
['04/04/2023, 10:15 WIB', '04/04/2023, 10:15 WIB', '04/04/2023, 10:13 WIB', '04/04/2023, 10:12 WIB', '04/04/2023, 10:11 WIB', '04/04/2023, 10:09 WIB', '04/04/2023, 10:09 WIB', '04/04/2023, 10:09 WIB', '04/04/2023, 10:08 WIB', '04/04/2023, 10:05 WIB', '04/04/2023, 10:05 WIB', '04/04/2023, 10:04 WIB', '04/04/2023, 10:03 WIB', '04/04/2023, 10:03 WIB', '04/04/2023, 10:02 WIB']
#Scrape link berita
link = respon.css(".article__link::attr(href)").getall()
link
['https://travel.kompas.com/read/2023/04/04/101500727/cara-ke-pameran-artefak-nabi-muhammad-naik-krl-dan-transjakarta', 'https://www.kompas.com/tren/read/2023/04/04/101500065/viral-video-tkw-hong-kong-dikenai-denda-rp-9-juta-karena-beli-gamis-rp', 'https://www.kompas.com/global/read/2023/04/04/101300370/disayangkan-lokomotif-tua-dari-kediri-dan-pemalang-dipinjamkan-ke-belanda', 'https://otomotif.kompas.com/read/2023/04/04/101200115/memilih-parfum-mobil-harus-benar-jika-salah-bisa-merusak-komponen-ini', 'https://www.kompas.com/food/read/2023/04/04/101100175/resep-kue-ulat-sutra-gurih-dengan-penggunaan-kaldu-bubuk-', 'https://money.kompas.com/read/2023/04/04/100951126/buka-lelang-impor-beras-bos-bulog-4-negara-sudah-menawarkan', 'https://nasional.kompas.com/read/2023/04/04/10091191/mendagri-hadiri-rapat-paripurna-pengesahan-perppu-pemilu-43-anggota-dpr', 'https://megapolitan.kompas.com/read/2023/04/04/10090031/polda-metro-unggahan-baju-bekas-yang-disebut-ditilap-penyidik-adalah-foto', 'https://megapolitan.kompas.com/read/2023/04/04/10085601/1-perampok-yang-tewaskan-sopir-taksi-online-di-tol-jagorawi-ditangkap-2', 'https://www.kompas.com/edu/read/2023/04/04/100543771/meneladani-ekalaya-di-era-merdeka-belajar', 'https://www.kompas.com/tren/read/2023/04/04/100539465/alasan-logo-twitter-berubah-jadi-gambar-anjing-shiba-inu-hari-ini', 'https://nasional.kompas.com/read/2023/04/04/10043681/golkar-pdi-p-sampai-sekarang-masih-ambil-posisi-sendirian-hadapi-pemilu-2024', 'https://money.kompas.com/read/2023/04/04/100300026/emas-antam-naik-rp-5.000-simak-rincian-harganya', 'https://www.kompas.com/edu/read/2023/04/04/100300171/seleksi-mandiri-uny-2023-simak-jadwal-dan-syaratnya', 'https://nasional.kompas.com/read/2023/04/04/10023911/indonesia-dapat-hibah-15-rantis-bushmaster-dari-australia']
#Membuat dataframe hasil scraping berita kompas
berita_kompas = pd.DataFrame({'Judul_Berita':judul, 'Tanggal_Berita':tgl,'Link_Berita':link})
berita_kompas
Judul_Berita | Tanggal_Berita | Link_Berita | |
---|---|---|---|
0 | Cara ke Pameran Artefak Nabi Muhammad Naik KRL... | 04/04/2023, 10:15 WIB | https://travel.kompas.com/read/2023/04/04/1015... |
1 | Viral, Video TKW Hong Kong Dikenai Denda Rp 9 ... | 04/04/2023, 10:15 WIB | https://www.kompas.com/tren/read/2023/04/04/10... |
2 | Disayangkan, Lokomotif Tua dari Kediri dan Pem... | 04/04/2023, 10:13 WIB | https://www.kompas.com/global/read/2023/04/04/... |
3 | Memilih Parfum Mobil Harus Benar, jika Salah B... | 04/04/2023, 10:12 WIB | https://otomotif.kompas.com/read/2023/04/04/10... |
4 | Resep Kue Ulat Sutra, Gurih dengan Penggunaan ... | 04/04/2023, 10:11 WIB | https://www.kompas.com/food/read/2023/04/04/10... |
5 | Buka Lelang Impor Beras, Bos Bulog: 4 Negara S... | 04/04/2023, 10:09 WIB | https://money.kompas.com/read/2023/04/04/10095... |
6 | Mendagri Hadiri Rapat Paripurna Pengesahan Per... | 04/04/2023, 10:09 WIB | https://nasional.kompas.com/read/2023/04/04/10... |
7 | Polda Metro: Unggahan Baju Bekas yang Disebut ... | 04/04/2023, 10:09 WIB | https://megapolitan.kompas.com/read/2023/04/04... |
8 | 1 Perampok yang Tewaskan Sopir Taksi "Online" ... | 04/04/2023, 10:08 WIB | https://megapolitan.kompas.com/read/2023/04/04... |
9 | Meneladani Ekalaya di Era Merdeka Belajar | 04/04/2023, 10:05 WIB | https://www.kompas.com/edu/read/2023/04/04/100... |
10 | Alasan Logo Twitter Berubah Jadi Gambar Anjing... | 04/04/2023, 10:05 WIB | https://www.kompas.com/tren/read/2023/04/04/10... |
11 | Golkar: PDI-P Sampai Sekarang Masih Ambil Posi... | 04/04/2023, 10:04 WIB | https://nasional.kompas.com/read/2023/04/04/10... |
12 | Emas Antam Naik Rp 5.000, Simak Rincian Harganya | 04/04/2023, 10:03 WIB | https://money.kompas.com/read/2023/04/04/10030... |
13 | Seleksi Mandiri UNY 2023, Simak Jadwal dan Sya... | 04/04/2023, 10:03 WIB | https://www.kompas.com/edu/read/2023/04/04/100... |
14 | Indonesia Dapat Hibah 15 Rantis Bushmaster dar... | 04/04/2023, 10:02 WIB | https://nasional.kompas.com/read/2023/04/04/10... |
#Aktivasi beberapa pacakge untuk visualisasi
from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
from wordcloud import STOPWORDS
import matplotlib.pyplot as plt
#Visualisasi
text = " ".join(i for i in berita_kompas.Judul_Berita)
stopwords = set(STOPWORDS)
wordcloud = WordCloud(stopwords = stopwords, background_color = "white").generate(text)
plt.figure(figsize=(15,10))
plt.imshow(wordcloud, interpolation = "bilinear")
plt.axis("off")
plt.show()