Dalam mengumpulkan berita utama terbaru, memantau tren berita, dan melakukan analisis sentimen tentang masalah-masalah yang sedang terjadi, scraping Google News terbukti menjadi alat yang sangat berharga. Pada artikel ini, kami akan memandu Anda melalui proses scraping Google News dengan menggunakan Python. Kita akan menggunakan library request untuk mendapatkan konten halaman; lxml untuk mem-parsing dokumen HTML dan mengekstrak data yang dibutuhkan. Di akhir tutorial ini, Anda akan belajar cara mengekstrak judul berita dan masing-masing tautannya dari Google News ke dalam format JSON terstruktur.
Sebelum memulai, pastikan Anda telah menginstal Python di sistem Anda. Anda dapat menginstal pustaka yang diperlukan dengan menjalankan perintah berikut:
pip install requests
pip install lxml
Pustaka ini akan memungkinkan kita untuk membuat permintaan HTTP dan mengurai konten HTML dari halaman web.
Kita akan mengikis halaman Google News di URL berikut:
URL = "https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGRqTVhZU0JXVnVMVWRDR2dKSlRpZ0FQAQ?hl=en-US&gl=US&ceid=US%3Aen"
Halaman ini berisi beberapa item berita, masing-masing dengan judul utama dan artikel terkait. Struktur XPath untuk item-item ini adalah sebagai berikut:
Struktur HTML Google News tetap konsisten di seluruh halaman yang berbeda, memastikan bahwa elemen XPath yang ditentukan dapat diterapkan secara universal.
Kita akan mulai dengan mengambil konten halaman Google News menggunakan pustaka permintaan. Berikut kode untuk mengambil konten halaman:
import requests
url = "https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGRqTVhZU0JXVnVMVWRDR2dKSlRpZ0FQAQ?hl=en-US&gl=US&ceid=US%3Aen"
response = requests.get(url)
if response.status_code == 200:
page_content = response.content
else:
print(f"Failed to retrieve the page. Status code: {response.status_code}")
Kode ini mengirimkan permintaan GET ke URL Google News dan menyimpan konten HTML halaman dalam variabel page_content.
Dengan konten HTML di tangan, kita dapat menggunakan lxml untuk mem-parsing halaman dan mengekstrak judul dan tautan berita.
from lxml import html
# Mengurai konten HTML
parser = html.fromstring(page_content)
Google News mengatur artikel-artikelnya dalam wadah-wadah tertentu. Pertama-tama kita akan mengekstrak wadah-wadah ini menggunakan XPath dan kemudian mengulanginya untuk mengekstrak berita utama dan tautan.
Artikel berita utama berada di bawah XPath berikut ini:
main_news_elements = parser.xpath('//c-wiz[@jsrenderer="ARwRbe"]')
Sekarang kita bisa mengulang 10 elemen pertama yang valid dan mengekstrak judul dan tautan:
news_data = []
for element in main_news_elements[:10]:
title = element.xpath('.//c-wiz/div/article/a/text()')[0]
link = "https://news.google.com" + element.xpath('.//c-wiz/div/article/a/@href')[0][1:]
# Pastikan data sudah ada sebelum menambahkan ke daftar
if title and link:
news_data.append({
"main_title": title,
"main_link": link,
})
Elemen berita utama memiliki subbagian yang berisi berita terkait. Kita dapat mengekstrak ini dengan menggunakan pendekatan yang sama:
related_articles = []
related_news_elements = element.xpath('.//c-wiz/div/div/article')
for related_element in related_news_elements:
related_title = related_element.xpath('.//a/text()')[0]
related_link = "https://news.google.com" + related_element.xpath('.//a/@href')[0][1:]
related_articles.append({"title": related_title, "link": related_link})
news_data.append({
"main_title": title,
"main_link": link,
"related_articles": related_articles
})
Setelah mengekstrak data, kita dapat menyimpannya dalam file JSON untuk digunakan di lain waktu.
import json
with open('google_news_data.json', 'w') as f:
json.dump(news_data, f, indent=4)
Kode ini akan membuat sebuah file bernama google_news_data.json yang berisi semua judul berita yang di-scraping dan tautan yang sesuai.
Saat mengikis data dalam jumlah besar, terutama dari situs dengan lalu lintas tinggi seperti Google News, Anda mungkin mengalami masalah seperti pemblokiran IP atau pembatasan kecepatan. Untuk menghindari hal ini, Anda dapat menggunakan proxy. Proksi memungkinkan Anda untuk merutekan permintaan Anda melalui alamat IP yang berbeda, sehingga menyulitkan situs web untuk mendeteksi dan memblokir aktivitas scraping Anda.
Untuk tutorial ini, Anda dapat menggunakan proxy dengan memodifikasi pemanggilan requests.get:
proxies = {
"http": "http://your_proxy_ip:port",
"https": "https://your_proxy_ip:port",
}
response = requests.get(url, proxies=proxies)
Jika Anda bekerja dengan penyedia layanan yang mengelola rotasi proxy, Anda hanya perlu mengonfigurasi layanan dalam permintaan Anda. Penyedia layanan akan menangani rotasi dan manajemen kumpulan IP di pihak mereka.
Terkadang, situs web dapat memblokir permintaan yang tidak memiliki header yang tepat, seperti string agen-pengguna yang mengidentifikasi permintaan berasal dari browser. Anda dapat menyesuaikan header untuk menghindari deteksi:
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-arch': '"x86"',
'sec-ch-ua-bitness': '"64"',
'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-model': '""',
'sec-ch-ua-platform': '"Linux"',
'sec-ch-ua-platform-version': '"6.5.0"',
'sec-ch-ua-wow64': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}
response = requests.get(url, headers=headers)
Berikut adalah kode lengkapnya, yang menggabungkan semua langkah:
import requests
import urllib3
from lxml import html
import json
urllib3.disable_warnings()
# URL dan tajuk
url = "https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGRqTVhZU0JXVnVMVWRDR2dKSlRpZ0FQAQ?hl=en-US&gl=US&ceid=US%3Aen"
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-arch': '"x86"',
'sec-ch-ua-bitness': '"64"',
'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-model': '""',
'sec-ch-ua-platform': '"Linux"',
'sec-ch-ua-platform-version': '"6.5.0"',
'sec-ch-ua-wow64': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}
# Konfigurasi proxy (ganti dengan detail proxy Anda)
proxy = 'ip:port'
proxies = {
"http": f"http://{proxy}",
"https": f"https://{proxy}",
}
# Mengambil konten halaman dengan header dan proxy yang ditentukan
response = requests.get(url, headers=headers, proxies=proxies, verify=False)
# Periksa apakah permintaan berhasil
if response.status_code == 200:
page_content = response.content
else:
print(f"Failed to retrieve the page. Status code: {response.status_code}")
exit()
# Mengurai konten HTML menggunakan lxml
parser = html.fromstring(page_content)
# Ekstrak berita utama dan artikel terkait
main_news_elements = parser.xpath('//*[@id="i10-panel"]/c-wiz/c-wiz')
# Inisialisasi daftar untuk menyimpan data berita yang diekstrak
news_data = []
# Ulangi setiap elemen berita utama
for element in main_news_elements[:10]:
# Mengekstrak judul dan tautan berita utama
title = element.xpath('.//c-wiz/div/article/a/text()')
link = element.xpath('.//c-wiz/div/article/a/@href')
# Inisialisasi daftar untuk menyimpan artikel terkait untuk berita utama ini
related_articles = []
# Mengekstrak elemen-elemen berita terkait dalam blok yang sama
related_news_elements = element.xpath('.//c-wiz/div/div/article')
# Ulangi setiap elemen berita terkait dan ekstrak judul dan tautannya
for related_element in related_news_elements:
related_title = related_element.xpath('.//a/text()')[0]
related_link = "https://news.google.com" + related_element.xpath('.//a/@href')[0][1:]
related_articles.append({"title": related_title, "link": related_link})
# Menambahkan berita utama dan artikel terkait ke daftar news_data
if title is not None:
news_data.append({
"main_title": title,
"main_link": f'https://news.google.com{link}',
"related_articles": related_articles
})
else:
continue
# Menyimpan data yang diekstrak ke file JSON
with open("google_news_data.json", "w") as json_file:
json.dump(news_data, json_file, indent=4)
print('Data extraction complete. Saved to google_news_data.json')
Mengikis Google News menggunakan Python, bersama dengan pustaka permintaan dan lxml, memfasilitasi analisis terperinci tentang tren berita. Menerapkan proksi dan mengonfigurasi header permintaan sangat penting untuk menghindari pemblokiran dan menjaga stabilitas scraper. Proksi yang ideal untuk tujuan ini termasuk proksi pusat data IPv4 dan IPv6 serta proksi ISP, yang menawarkan kecepatan tinggi dan ping rendah. Selain itu, proxy perumahan yang dinamis sangat efektif karena faktor kepercayaan mereka yang unggul.
Komentar: 0