Beranda BlogPengikisan web Panduan Praktis untuk Web Scraping dengan Python Pyppeteer

Panduan Praktis untuk Web Scraping dengan Python Pyppeteer

oleh Kadek

Pyppeteer adalah pembungkus Python untuk perpustakaan Puppeteer, awalnya dikembangkan untuk Node.js. Hal ini memungkinkan penggunaan metode asinkron untuk memproses halaman dan data serta membedakannya dari pustaka web scraping lainnya.

Artikel ini mencakup berbagai aspek bekerja dengan perpustakaan Pyppeteer, mulai dari instalasi dan persyaratan hingga interaksi dengan elemen dan data pada halaman.

Kami juga akan membahas masalah umum dan cara mengatasinya. Untuk lebih memahami kemampuan dan manfaat perpustakaan ini, kami menyediakan tabel perbandingan dengan Pyppeteer dan perpustakaan web scraping populer lainnya.

Apa itu Pyppeteer?

Pyppeteer adalah pustaka Python populer untuk berinteraksi dengan browser tanpa kepala Chromium dan mensimulasikan tindakan pengguna sebenarnya. Seperti disebutkan sebelumnya, ini awalnya dikembangkan untuk NodeJS sebagai Puppeteer dan kemudian di-porting ke Python.

Fungsi utama perpustakaan Pyppeteer meliputi manajemen halaman, penanganan peristiwa, bekerja dengan penyeleksi, mengeksekusi kode JavaScript dalam konteks halaman, serta fungsi untuk mengambil tangkapan layar dan merekam video sesi web.

Memulai dengan Pyppeteer

Untuk memulai perpustakaan Pyppeteer, Anda memerlukan Python v3.6 atau lebih baru dan editor kode atau Python IDE. Kami akan menggunakan Visual Studio Code, editor kode yang ringan dan kuat dengan penyorotan sintaksis dan kompiler bawaan.

Bagaimana cara menginstal Pyppeteer

Untuk menginstal perpustakaan, buka terminal atau command prompt dan ketik:

pip install pyppeteer

Chromium versi terbaru akan diunduh dan diinstal secara otomatis selama instalasi perpustakaan. Jika ingin mempercepat proses atau menginstal secara manual, gunakan perintah berikut:

pyppeteer-install

Setelah perpustakaan diinstal, Anda dapat menggunakannya dalam proyek Anda.

Browser didukung oleh Pyppeteer

Pyppeteer adalah pustaka Python yang memungkinkan pengguna mengontrol browser Chromium. Browser lain seperti Firefox atau Safari tidak didukung. Sebaliknya, ia menggunakan versi Chromium yang dibundel sendiri, yang secara otomatis diinstal bersama perpustakaan.

Proyek dasar Pyppeteer

Mari buat file Python baru dengan ekstensi .py. Impor perpustakaan yang diperlukan, mulai Chromium dan navigasikan ke halaman mana pun menggunakan Pyppeteer. Pertama kita perlu mengimpor perpustakaan berikut:

import asyncio
from Pyppeteer import launch

Pustaka Asyncio diperlukan agar Pyppeteer dapat berjalan dalam mode asinkron. Ini adalah cara yang lebih efisien untuk menjalankan Pyppeteer karena memungkinkan banyak tugas dilakukan secara bersamaan. Pustaka Asyncio sudah diinstal sebelumnya dengan Python, jadi kita tidak perlu menginstalnya secara terpisah.

Selanjutnya, buat fungsi yang dapat Anda panggil dan jalankan secara asinkron:

async def main():

Dalam fungsi ini kami melakukan semua tindakan, termasuk memulai dan menutup browser serta menavigasi antar halaman. Mari kita jelaskan perintah untuk memulai browser, membuat tab baru, menavigasi ke halaman, dan menutup browser:

    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://www.example.com')
    await browser.close()

Sekarang kita telah menjelaskan fungsi asinkron yang melakukan semua tindakan yang diperlukan, sebut saja fungsi tersebut.

asyncio.get_event_loop().run_until_complete(main())

Kami akan menggunakan contoh sederhana ini untuk membuat skrip yang lebih kompleks di masa mendatang. Namun, struktur dasar contohnya tetap sama.

Konfigurasi lanjutan dengan Pyppeteer

Di bagian ini, kita akan memeriksa parameter yang dapat dikonfigurasi sebelum menjalankan browser, yang akan membuat skrip Anda lebih berfungsi. Kami akan menunjukkan cara mengonfigurasi proxy, menambahkan dan mengelola agen pengguna, serta menangani cookie.

Penggunaan proxy

Pada artikel sebelumnya, kami telah membahas penggunaan proxy dengan Python, termasuk pembahasan tentang penyedia proxy terbaik. Dalam tutorial ini kita akan fokus menggunakan proxy dengan Pyppeteer.

Untuk menambahkan proxy, gunakan parameter args saat memulai browser. Untuk kenyamanan, buat variabel untuk menyimpan server proxy dan port.

    proxy_server="your_proxy_server"
    proxy_port="your_proxy_port"

Kemudian buat template untuk menentukan proxy:

    proxy_url = f'http://{proxy_server}:{proxy_port}'

Tambahkan argumen proxy sebagai parameter saat memanggil browser:

    browser = await launch(args=(f'--proxy-server={proxy_url}'))

Jika tidak, contoh utama tetap tidak berubah.

Mengubah agen pengguna

Tidak seperti proxy, agen pengguna ditentukan setelah browser diluncurkan dan ditentukan sebagai parameter halaman yang diluncurkan. Mari buat halaman kosong:

    page = await browser.newPage()

Selanjutnya, buat variabel untuk menyimpan agen pengguna. Hal ini diperlukan untuk kenyamanan dan menyederhanakan proses penggantian dan penggantian bila diperlukan.

    user_agent = "Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail Firefox/firefoxversion"

Kemudian atur agen pengguna yang ditentukan.

    await page.setUserAgent(user_agent)

Pyppeteer sekarang menggunakan agen pengguna yang ditentukan saat mengunjungi situs web. Untuk mengurangi risiko pemblokiran, Anda dapat membuat sekumpulan agen pengguna dan memilih salah satu secara acak dari daftar saat membuat halaman baru. Hal ini mempersulit situs web untuk mengidentifikasi dan memblokir aktivitas scraping Anda.

Kelola cookie

Cookie ditentukan sebagai parameter pada halaman dengan cara yang sama seperti agen pengguna:

    cookie = {'name': 'example_cookie', 'value': '123456789'}
    await page.setCookie(cookie)

Pyppeteer mendukung banyak parameter lain selain yang dibahas di sini. Untuk daftar lengkapnya Anda dapat menggunakan dokumentasi resmi.

Dalam contoh sederhana kami menunjukkan cara menavigasi ke halaman melalui link. Di bagian ini, Anda akan mempelajari cara mengekstrak semua informasi yang Anda inginkan dari suatu halaman, termasuk data dari halaman dengan konten yang dimuat secara dinamis. Sebagai contoh, kita akan menggunakan halaman demo OpenCart.

Dapatkan konten HTML

Mari kita ubah fungsi utama pada contoh utama dan navigasikan ke halaman demo OpenCart.

    await page.goto('https://demo.opencart.com/')

Selanjutnya, ekstrak semua konten di halaman tersebut.

    content = await page.content()

Dan cetak hasilnya di layar:

    print(content)

Jika Anda mengikuti instruksi dengan benar, Anda akan melihat seluruh kode HTML halaman yang Anda minta di terminal atau command prompt.

Menggunakan pemilih XPath dan CSS untuk pengikisan data

Biasanya kita hanya memerlukan elemen tertentu pada suatu halaman, seperti produk, judul, atau harga, bukan keseluruhan kode HTML. Untuk mengekstrak data ini kita dapat menggunakan pemilih CSS atau XPath. Pemilih CSS lebih mudah bagi pemula, sementara XPath menawarkan fitur dan kemampuan tingkat lanjut. Pada akhirnya, pilihan terbaik untuk Anda bergantung pada kebutuhan spesifik Anda.

Pyppeteer mendukung penyeleksi CSS dan XPath. Mari kita lihat cara menggunakan masing-masingnya. Misalnya, kami mengekstrak semua judul h1 suatu halaman. Untuk melakukan ini kita dapat menggunakan fungsi querySelector():

    await page.goto('https://demo.opencart.com/')
    element = await page.querySelector('h1')

Pada tahap ini kita mendapatkan keseluruhan elemen, bukan hanya isinya. Untuk mengekstrak konten teks dari elemen kami menggunakan fungsi berikut:

    text_content = await page.evaluate('(element) => element.textContent', element)

Untuk memeriksa apakah ekstraksi berhasil, kita dapat mencetak konten teks ke konsol:

    print(text_content)

Dengan menggunakan pemilih CSS, Anda dapat mengekstrak semua informasi yang diperlukan dari sebuah halaman. Namun, untuk contoh yang lebih baik, mari kita mengekstrak data yang sama menggunakan XPath. Prinsip ekstraksi untuk XPath serupa dengan yang telah kita lihat:

    element = await page.xpath('//h1')
    text_content = await page.evaluate('(element) => element.textContent', element(0))

Perhatikan bahwa dalam kasus XPath page.xpath() mengembalikan daftar elemen, jadi kita perlu mengakses elemen berdasarkan indeksnya (mis. element(0)).

Berurusan dengan batas waktu

Pyppeteer menyediakan metode penanganan batas waktu untuk memberikan waktu yang cukup bagi browser untuk menyelesaikan operasi. Misalnya, saat menavigasi ke suatu halaman, Anda dapat menggunakan parameter batas waktu untuk membatasi waktu buka halaman maksimum:

    await page.goto('https://demo.opencart.com/', {'timeout': 5000})

Ini memberitahu browser untuk menunggu hingga 5 detik hingga halaman dimuat sebelum memberikan kesalahan batas waktu.

Implementasinya menunggu halaman dimuat

Selain itu, Anda dapat menggunakan waitUntil() Metode untuk menunjukkan kapan menurut Anda navigasi berhasil. Misalnya, Anda dapat menggunakan event load untuk menunggu halaman dimuat sepenuhnya atau domcontentloaded Acara menunggu DOM dimuat:

    page.goto('https://demo.opencart.com/', waitUntil="load")

Ini memberitahu browser untuk menunggu acara pemuatan diaktifkan sebelum melanjutkan.

Menggaruk halaman dinamis

Untuk melacak pemuatan halaman dengan konten yang dihasilkan secara dinamis, Anda dapat menggunakan pemilih pada elemen yang dimuat secara dinamis dan menunggu hingga elemen tersebut dimuat.

    await page.waitForSelector('#someDynamicElement')

Jadi jika Anda menggunakan fitur ini setelah menavigasi ke suatu halaman, skrip Anda akan menunggu hingga elemen yang diperlukan muncul di halaman tersebut sebelum melanjutkan eksekusi.

Interaksi dengan situs

Pengumpulan data adalah bagian penting dari proses pengikisan, namun penting juga untuk meniru tindakan pengguna. Ini membantu mengurangi risiko penyumbatan dan memastikan Anda mendapatkan semua data yang Anda perlukan, meskipun data tersebut tersembunyi di balik layar. Pyppeteer juga memungkinkan Anda berinteraksi dengan formulir untuk mengekstrak data dan mengisinya. Ini penting jika Anda merayapi situs web yang memerlukan autentikasi.

Mengklik tombol dan elemen

Salah satu tindakan yang paling penting dan umum digunakan adalah mengklik tombol atau elemen. Pyppeteer tidak membedakan tindakan-tindakan ini dan tindakan tersebut dilakukan dengan cara yang sama:

  1. Temukan elemen berdasarkan pemilihnya.
  2. Klik dengan click() Fungsi.

Mari kita lihat contoh mengklik tombol dengan salah satunya id="button":

    await page.click('#button')

Pyppeteer menunggu hingga klik selesai sebelum mengambil tindakan lebih lanjut. Anda dapat secara eksplisit menunggu hingga klik selesai (misalnya, “menunggu page.waitForNavigation()). Satu-satunya pengecualian adalah jika klik memicu navigasi ke halaman lain.

Isi kolom masukan

Itu type() Fungsi tersebut digunakan untuk mengisi formulir. Cara kerjanya mirip dengan itu click() fungsi, namun alih-alih mengeklik suatu elemen, ia malah memasukkan teks ke dalamnya. Menggunakan type()pilih elemen melalui pemilihnya dan teruskan teks yang ingin Anda masukkan ke fungsi.

    await page.type('input(name="username")', 'put_your_text')

Di sisi lain, jika Anda ingin mendapatkan teks dari formulir masukan, Anda dapat menggunakan:

    input_text = await page.evaluate('document.querySelector("input(name="username")").value')

Ini berguna ketika Anda perlu mengekstrak data dari bidang yang tidak dapat diedit yang dibuat secara otomatis.

Lakukan tindakan tertentu

Pyppeteer menyediakan kemampuan ekstensif untuk mengeksekusi kode JavaScript dalam konteks halaman, memungkinkannya melakukan tindakan yang tidak mungkin dilakukan menggunakan API standar. Misalnya, kami sebelumnya menggunakan pendekatan ini untuk mendapatkan nilai kolom input. Seperti yang kami tunjukkan pada contoh sebelumnya, Anda dapat menggunakan page.evaluate() Metode untuk mengeksekusi kode JavaScript arbitrer.

    await page.evaluate('console.log("Hello world!")')

Jika Anda ingin kontrol lebih besar atas simulasi tindakan pengguna, Pyppeteer mendukung berbagai fitur khusus, seperti simulasi penekanan tombol Enter:

     await page.keyboard.press('Enter')

Atau bahkan arahkan mouse Anda ke suatu elemen:

    await page.hover('.example-element')

Untuk daftar lengkap fitur, lihat dokumentasi resmi.

Masuk dengan Pyppeteer

Mari gabungkan semua yang telah kita diskusikan dan kembangkan skrip kecil untuk mensimulasikan otentikasi pengguna dengan Pyppeteer. Kami akan menggunakan template dasar dari contoh pertama dan membuat beberapa perubahan. Setelah menavigasi ke halaman, kami menemukan bidang yang diperlukan dan mengisi formulir:

    await page.type('#login-input', 'login')
    await page.type('#password-input', 'password')

Kemudian kami menemukan tombol "Login" dan klik di atasnya.

    await page.click('#login-button')

Alternatifnya, Anda dapat melakukan simulasi menekan Enter, karena kursor tetap berada di kolom input setelah mengisi formulir.

Menggulir ke samping

Untuk menggulir halaman di Pyppeteer, Anda perlu menggunakan page.evaluate() untuk mengeksekusi kode JavaScript dalam konteks halaman. Misalnya, untuk menggulir halaman ke bawah 300 piksel, Anda dapat menggunakan kode ini:

    await page.evaluate('window.scrollBy(0, 300)')

Opsi gulir ini memungkinkan Anda menggulir halaman secara bebas secara horizontal dan vertikal.

Ambil tangkapan layar

Pyppeteer menawarkan fitur khusus untuk mengambil tangkapan layar. Fitur ini mendukung penyimpanan tangkapan layar dalam berbagai format termasuk PNG dan JPEG. PNG adalah format kompresi lossless yang menghasilkan gambar berkualitas tinggi, sedangkan JPEG adalah format kompresi lossy yang menghasilkan ukuran file lebih kecil.

    await page.screenshot({'path': 'folder/path/screenshot.png'})

Untuk menyimpan tangkapan layar ke folder terpisah, pastikan folder tersebut ada dan Anda memiliki izin untuk menulis ke folder tersebut. Jika tidak, skrip akan gagal.

Pemecahan masalah dan penanganan kesalahan

Saat menggunakan Pyppeteer, Anda mungkin mengalami kesalahan yang disebabkan oleh instalasi paket, dependensi atau versi yang salah, atau komponen yang diperlukan hilang. Mari kita lihat kesalahan paling umum dan cara memperbaikinya.

Masalah Umum seperti “Pyppeteer tidak diinstal”

Pesan kesalahan “Pyppeteer tidak diinstal” menunjukkan bahwa paket tersebut tidak diinstal atau dianggap telah dihapus instalasinya. Kesalahan ini biasanya terjadi karena instalasi paket dibatalkan karena kesalahan, misalnya versi tidak cocok.

Seperti disebutkan di awal, Pyppeteer hanya bekerja dengan Python 3.6 dan yang lebih baru. Dalam hal ini, Anda harus memperbarui atau menginstal ulang Python ke versi yang lebih baru. Jika Anda menggunakan Python 3.6 atau lebih baru, Anda dapat mencoba menginstal Pyppeteer lagi:

pip install pyppeteer

Dalam beberapa kasus, masalah mungkin muncul karena ketidakcocokan antara Pyppeteer dan Chromium yang diinstal. Coba instal versi tertentu yang kompatibel:

pip install pyppeteer==<version>
pyppeteer-install --force

Tentukan versinya, yang dapat Anda temukan di halaman rilis Pyppeteer di GitHub.

Menangani penutupan browser yang tidak terduga di Pyppeteer

Solusi yang mungkin untuk kesalahan ini bergantung pada penyebabnya. Misalnya, jika Anda baru saja menginstal Pyppeteer dan mengalami masalah saat memulai browser, instalasi Chromium mungkin tidak berhasil. Dalam hal ini, Anda dapat mencoba menginstal ulang browser dan dependensinya.

pyppeteer-install

Jika Anda khawatir tentang browser yang tiba-tiba menutup selama eksekusi skrip, Anda dapat menggunakan blok coba/tangkap standar untuk menangani kasus ini.

Library yang paling mirip dengan Pyppeteer dari segi fungsionalitas adalah Selenium. Namun, Pyppeteer memiliki fitur serupa dengan pustaka scraping Python lainnya seperti Beautiful Soup atau Scrapy. Bagian ini membandingkan Pyppeteer dengan perpustakaan lain, pendekatan scraping, atau metode pemrosesan data.

Pyppeteer vs Sup Cantik

Untuk perbandingan yang lebih ringkas dan informatif, berikut adalah tabel yang merangkum perbedaan utama antara Pyppeteer dan BeautifulSoup:

Fitur khusus orang pyppeteer Sup yang enak
Tujuan Otomatisasi interaksi browser, eksekusi konten dinamis, dan tindakan pengguna. Parsing dokumen HTML dan XML, mengekstrak informasi dari markup statis.
keramahan pengguna Kompleks karena kebutuhan untuk mengelola instance browser dan kode asinkron. Memberikan pendekatan yang lebih sederhana dan deklaratif untuk penguraian HTML.
Pertunjukan Mungkin lebih lambat, terutama saat memproses konten dinamis dalam jumlah besar Lebih efisien untuk mengurai halaman statis.
kasus penggunaan Berinteraksi dengan halaman web dinamis, mengikis data setelah eksekusi JavaScript, mengambil tangkapan layar, dan banyak lagi. Ekstraksi data dari HTML statis, navigasi dan markup pencarian.

Memilih antara BeautifulSoup dan Pyppeteer bergantung pada kebutuhan spesifik proyek Anda. Jika Anda perlu menganalisis data dari halaman web statis, BeautifulSoup adalah pilihan yang lebih mudah dan cepat. Namun, jika Anda perlu mensimulasikan tindakan pengguna atau berinteraksi dengan halaman web dinamis, Pyppeteer adalah pilihan yang lebih baik.

Pyppeteer vs Scrapy

Mari kita lihat tabel perbandingan Pyppeteer dan Scrapy:

Fitur khusus orang pyppeteer Tdk lengkap
Tujuan Pengikisan web dengan otomatisasi browser Perayapan dan pengikisan web universal
Otomatisasi peramban Ya Tidak (fokus pada permintaan HTTP)
keramahan pengguna Lebih kompleks karena integrasi browser Lebih mudah digunakan
Skalabilitas Cocok untuk proyek yang lebih kecil Dirancang untuk pengikisan yang skalabel dan luas
fleksibilitas Memberikan fleksibilitas untuk skenario yang kompleks Kurang fleksibel untuk skenario yang memerlukan interaktivitas browser
Pertunjukan Lebih lambat karena overhead startup browser Lebih cepat untuk scraping berbasis HTTP tradisional

Seperti yang Anda lihat dari tabel, Pyppeteer dan Scrapy cocok untuk tujuan yang berbeda. Pyppeteer adalah pilihan yang lebih baik untuk proyek kecil yang memerlukan pemrosesan halaman web dinamis atau mengeksekusi JavaScript. Scrapy lebih cocok untuk proyek besar atau skalabel yang mengikis halaman HTML sederhana.

Pyppeteer vs Selenium

Mari kita lihat tabel perbandingan Pyppeteer dan Selenium:

Fitur khusus orang pyppeteer selenium
Dukungan peramban Hanya krom Beberapa browser (Chrome, Firefox, Edge, dll.)
asinkron Asinkron (asinkron/tunggu) Sinkron (mendukung asinkron, tetapi secara tradisional sinkron)
kasus penggunaan Ideal untuk otomatisasi tanpa kepala dan pengikisan web Otomatisasi web universal, pengujian, dan interaksi browser
Pertunjukan Umumnya lebih cepat karena sifatnya yang asinkron Sedikit lebih lambat karena sinkronisitas dan perpindahan tambahan

Selenium dan Pyppeteer keduanya merupakan alat otomatisasi web sumber terbuka yang populer. Keduanya menawarkan fitur dan kemampuan serupa, namun ada beberapa perbedaan utama yang perlu dipertimbangkan saat memilih di antara keduanya.

Pilihan antara keduanya terutama bergantung pada kebutuhan eksekusi asinkron dan preferensi pribadi. Selain itu, Pyppeteer sering kali lebih disukai untuk tugas tanpa kepala dan kesederhanaan, sementara keserbagunaan Selenium membuatnya cocok untuk berbagai skenario otomatisasi web.

Kesimpulan dan temuan

Dalam artikel ini, kami telah membahas berbagai aspek dan kasus penggunaan pustaka Pyppeteer, mulai dari instalasi dan fitur intinya hingga kemungkinan masalah dan perbandingan dengan pustaka dan kerangka kerja scraping lain yang tersedia.

Secara khusus, kami membahas cara mengonfigurasi dan mempersonalisasi data menggunakan agen pengguna dan cookie, menemukan dan mengekstrak data, meniru tindakan pengguna sebenarnya, dan mengontrol berbagai elemen pada halaman. Kami juga membahas kemungkinan masalah saat menggunakan Pyppeteer, seperti pembatasan kecepatan dan deteksi browser.

Secara keseluruhan, Pyppeteer adalah perpustakaan yang kuat dan serbaguna yang dapat digunakan untuk berbagai tugas pengikisan. Mudah dipelajari dan digunakan serta menawarkan berbagai fitur, menjadikannya pilihan yang baik untuk pemula dan pengikis berpengalaman.

Pos terkait

Tinggalkan Komentar