Bagaimana cara mengikis situs web javascript dengan Python?
Saya mencoba mengikis situs web. Saya telah mencoba menggunakan dua metode tetapi keduanya tidak memberi saya kode sumber situs web lengkap yang saya cari. Saya mencoba mengikis judul berita dari URL situs web yang disediakan di bawah ini.
URL: "https://www.todayonline.com/"
Ini adalah dua metode yang telah saya coba tetapi gagal.
Metode 1: Sup Cantik
tdy_url = "https://www.todayonline.com/"
page = requests.get(tdy_url).text
soup = BeautifulSoup(page)
soup # Returns me a HTML with javascript text
soup.find_all('h3')
### Returns me empty list []
Metode 2: Selenium + BeautifulSoup
tdy_url = "https://www.todayonline.com/"
options = Options()
options.headless = True
driver = webdriver.Chrome("chromedriver",options=options)
driver.get(tdy_url)
time.sleep(10)
html = driver.page_source
soup = BeautifulSoup(html)
soup.find_all('h3')
### Returns me only less than 1/4 of the 'h3' tags found in the original page source
Tolong bantu. Saya telah mencoba mengorek situs berita lain dan itu jauh lebih mudah. Terima kasih.
Jawaban
Anda dapat mengakses data melalui API (lihat tab Jaringan):
Sebagai contoh,
import requests
url = "https://www.todayonline.com/api/v3/news_feed/7"
data = requests.get(url).json()
Ada berbagai cara untuk mengumpulkan konten halaman web yang berisi Javascript.
- Menggunakan
seleniumdengan driver web Firefox - Menggunakan browser tanpa kepala dengan
phantomJS - Melakukan panggilan API menggunakan klien REST atau
requestspustaka python
Anda harus melakukan riset terlebih dahulu
Saya akan menyarankan Anda pendekatan yang cukup sederhana,
import requests
from bs4 import BeautifulSoup as bs
page = requests.get('https://www.todayonline.com/googlenews.xml').content
soup = bs(page)
news = [i.text for i in soup.find_all('news:title')]
print(news)
keluaran
['DBS named world’s best bank by New York-based financial publication',
'Russia has very serious questions to answer on Navalny - UK',
"Exclusive: 90% of China's Sinovac employees, families took coronavirus vaccine - CEO",
'Three militants killed after fatal attack on policeman in Tunisia',
.....]
Selain itu, Anda dapat memeriksa halaman XML untuk informasi lebih lanjut jika diperlukan.
PS Selalu periksa kepatuhan sebelum membuang situs web apa pun :)
Data berita di situs web yang Anda coba gesek diambil dari server menggunakan JavaScript (ini disebut XHR - XMLHttpRequest ). Ini terjadi secara dinamis, saat halaman dimuat atau di-scroll. jadi data ini tidak dikembalikan ke dalam halaman yang dikembalikan oleh server.
Dalam contoh pertama, Anda hanya mendapatkan halaman yang dikembalikan oleh server - tanpa berita, tetapi dengan JS yang seharusnya mendapatkannya. Baik permintaan maupun BeautifulSoup tidak dapat mengeksekusi JS.
Namun, Anda dapat mencoba mereproduksi permintaan yang mendapatkan judul berita dari server dengan permintaan Python. Lakukan langkah-langkah berikut:
- Buka DevTools di browser Anda (biasanya Anda harus menekan F12atau Ctrl+ Shit+ Iuntuk itu), dan lihat permintaan yang mendapatkan judul berita dari server. Terkadang, ini lebih mudah daripada mengikis web dengan BeautifulSoup. Berikut tangkapan layarnya (Firefox):
Salin tautan permintaan (klik kanan -> Salin -> Salin tautan), dan teruskan ke
requests.get(...).Dapatkan
.json()permintaan itu. Ini akan mengembalikan perintah yang mudah digunakan. Untuk lebih memahami struktur dict, saya akan merekomendasikan untuk menggunakanpprintdaripada print sederhana. Perhatikan yang harus Anda lakukanfrom pprint import pprintsebelum menggunakannya.
Berikut adalah contoh kode yang mendapat judul dari berita utama di halaman:
import requests
nodes = requests.get("https://www.todayonline.com/api/v3/news_feed/7")\
.json()["nodes"]
for node in nodes:
print(node["node"]["title"])
Jika Anda ingin mengikis sekelompok berita di bawah teks, Anda perlu mengubah nomor setelah news_feed/di URL permintaan (untuk mendapatkannya, Anda hanya perlu memfilter permintaan dengan "news_feed" di DevTools dan menggulir halaman berita ke bawah).
Terkadang situs web memiliki perlindungan terhadap bot (meskipun situs web yang Anda coba hapus tidak). Dalam kasus seperti itu, Anda mungkin perlu melakukan langkah-langkah ini juga.