Panduan untuk mengikis Google News dengan Python

Komentar: 0

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.

Langkah 1: Menyiapkan Lingkungan

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.

Langkah 2: Memahami URL Target dan Struktur XPath

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:

  • Wadah Berita Utama: //c-wiz[@jsrenderer="ARwRbe"]
  • Judul Berita Utama: //c-wiz[@jsrenderer="ARwRbe"]/c-wiz/div/article/a/text()
  • Tautan Berita Utama: //c-wiz[@jsrenderer="ARwRbe"]/c-wiz/div/article/a/@href
  • Berita Terkait Kontainer: //c-wiz[@jsrenderer="ARwRbe"]/c-wiz/div/div/article/
  • Judul Berita Terkait: //c-wiz[@jsrenderer="ARwRbe"]/c-wiz/div/div/article/a/text()
  • Tautan Berita Terkait: //c-wiz[@jsrenderer="ARwRbe"]/c-wiz/div/div/article/a/@href

Struktur HTML Google News tetap konsisten di seluruh halaman yang berbeda, memastikan bahwa elemen XPath yang ditentukan dapat diterapkan secara universal.

Langkah 3: Mengambil konten Google News

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.

Langkah 4: Mengurai konten HTML dengan lxml

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)

Langkah 5: Mengekstrak data berita

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.

Mengekstrak artikel berita utama

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,
    })

Mengekstrak artikel terkait di dalam setiap elemen baru utama

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

Langkah 6: Menyimpan data sebagai JSON

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.

Menggunakan proksi

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.

Menyesuaikan tajuk permintaan

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)

Contoh kode lengkap

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 komentar