Daftar Isi
TL;DR: Bagaimana cara mendapatkan data dinamis?
Berikut cara mengikis konten dinamis menggunakan ScraperAPI dan Selenium. Pendekatan ini menangani JavaScript, pengguliran tak terbatas, dan interaksi pengguna yang kompleks, memastikan Anda mendapatkan semua data yang Anda perlukan.
API Python dan Pengikis
import requests
from bs4 import BeautifulSoup
API_KEY = 'your_scraperapi_key'
url = 'https://www.booking.com/searchresults.html?ss=New+York'
payload = {
'url': url,
}
headers = {
'x-sapi-api_key': API_KEY,
'x-sapi-render': 'true',
'x-sapi-instruction_set': '({"type": "loop", "for": 5, "instructions": ({"type": "scroll", "direction": "y", "value": "bottom" }, { "type": "wait", "value": 5 }) })'
}
response = requests.get('https://api.scraperapi.com', params=payload, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
listings = soup.find_all('div', attrs={'data-testid': 'property-card'})
print(f"Found {len(listings)} hotel listings on Booking.com")
Python dan Selenium
from seleniumwire import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
API_KEY = 'your_scraperapi_key'
proxy_options = {
'proxy': {
'http': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001',
'https': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001',
'no_proxy': 'localhost,127.0.0.1'
}
}
driver = webdriver.Chrome(seleniumwire_options=proxy_options)
url = 'https://www.booking.com/searchresults.html?ss=New+York'
driver.get(url)
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.END)
time.sleep(10)
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
listings = soup.find_all('div', attrs={'data-testid': 'property-card'})
print(f"Found {len(listings)} hotel listings on Booking.com")
Baca terus untuk mengetahui lebih lanjut tentang metode ini dan bagaimana metode tersebut dapat digunakan untuk proyek web scraping Anda.
Kesalahan umum saat menyalin konten dinamis dan cara menghindarinya
Menghapus konten dinamis dari situs web dapat menjadi tantangan. Namun, memahami dan menghindari kesalahan umum dapat membuat prosesnya berjalan lebih lancar. Berikut adalah empat jebakan penting yang harus diwaspadai:
1. Abaikan permintaan AJAX
Tantangan:
Banyak situs web menggunakan permintaan AJAX (Asynchronous JavaScript and XML) untuk memuat konten secara asinkron tanpa menyegarkan seluruh halaman. Artinya meskipun HTML utama dimuat sepenuhnya, data yang diperlukan masih dapat diambil secara terpisah melalui panggilan AJAX. Jika scraper Anda tidak memenuhi permintaan ini, Anda bisa kehilangan data penting.
Cara menghindarinya:
Periksa aktivitas jaringan di alat pengembang browser Anda untuk mengidentifikasi permintaan AJAX yang terjadi ketika konten baru muncul. Setelah permintaan ini teridentifikasi, replikasi permintaan tersebut secara langsung di scraper Anda untuk memastikan Anda menangkap semua data yang dimuat secara dinamis.
import requests
# Example of handling an AJAX request
ajax_url = 'https://www.example.com/ajax_endpoint'
response = requests.get(ajax_url)
data = response.json() # Assuming the response is in JSON format
print(data)
Praktik terbaik:
Selalu perhatikan permintaan AJAX saat menggores situs web. Saat konten yang Anda perlukan dimuat melalui AJAX, replikasi permintaan ini di scraper Anda untuk mengambil data secara langsung.
Sumber: Kami menggunakan strategi ini untuk menghapus lowongan pekerjaan publik dari LinkedIn.
2. Kesalahan penomoran halaman
Tantangan:
Banyak situs web, terutama situs atau direktori e-niaga, menyebarkan kontennya ke beberapa halaman. Jika scraper Anda hanya mengumpulkan data dari halaman pertama, Anda mungkin kehilangan sejumlah besar data.
Cara menghindarinya:
Terapkan logika di scraper Anda untuk menangani penomoran halaman dengan mendeteksi dan mengikuti tombol Berikutnya atau membuat URL untuk halaman berikutnya. Hal ini memastikan scraper Anda mengumpulkan data dari semua halaman, bukan hanya halaman pertama.
import requests
for page in range(1, 11): # Adjust the range based on the number of pages
url = f'https://www.example.com/search?page={page}'
response = requests.get(url)
# Process each page's results here
print(f'Page {page} data: {response.text}')
Praktik terbaik:
Selalu sertakan penomoran halaman dalam logika pengikisan Anda untuk memastikan pengambilan data yang komprehensif di semua halaman.
Sumber: Baca panduan kami untuk menangani pagination Pengikisan web.
3. Menangani eksekusi JavaScript dan interaksi kompleks dengan ScraperAPI
Tantangan:
Banyak situs web saat ini menggunakan JavaScript untuk memuat konten secara dinamis dan menangani interaksi kompleks seperti pengiriman formulir, pengguliran tanpa akhir, dan klik tombol. Jika scraper Anda hanya mengambil HTML asli tanpa menjalankan skrip atau interaksi ini, Anda mungkin kehilangan data penting.
Cara menghindarinya:
Fungsi rendering ScraperAPI, dikombinasikan dengan Set Instruksi Render yang kuat, memungkinkan Anda memproses JavaScript dan mengotomatiskan interaksi halaman. Ini berarti Anda dapat mensimulasikan tindakan pengguna seperti memasukkan istilah pencarian, mengklik tombol, atau menggulir konten - semuanya dalam alur kerja scraping Anda.
Cara menggunakan kumpulan perintah render
Kumpulan perintah render adalah objek JSON yang Anda kirim ke ScraperAPI sebagai bagian dari header permintaan. Serangkaian perintah ini memberi tahu browser tindakan apa yang harus dilakukan saat halaman dirender - mis. Misalnya mengisi formulir, mengklik tombol, atau menunggu konten tertentu dimuat. Petunjuk ini memungkinkan Anda mengotomatiskan interaksi pengguna yang kompleks pada halaman web dinamis tanpa harus menggunakan browser tanpa kepala di komputer Anda.
Contoh: Scraping dengan dan tanpa instruksi rendering dan interaksi
Mari kita lihat contoh penggunaan ScraperAPI untuk mengotomatisasi pencarian di Wikipedia. Tujuannya adalah untuk mensimulasikan pengetikan istilah pencarian “sepatu bot koboi” ke dalam bilah pencarian, mengklik tombol pencarian, dan kemudian menunggu hasilnya dimuat.
Catatan: Untuk menjalankan cuplikan ini, buat akun ScraperAPI gratis dan ganti 'YOUR_API_KEY'
dengan kunci API Anda.
Tanpa rendering dan instruksi:
import requests
url = 'https://api.scraperapi.com/'
headers = {
'x-sapi-api_key': 'YOUR_API_KEY',
'x-sapi-instruction_set': '({"type": "input", "selector": {"type": "css", "value": "#searchInput"}, "value": "cowboy boots"}, {"type": "click", "selector": {"type": "css", "value": "#search-form button(type=\\"submit\\\")"}}, {"type": "wait_for_selector", "selector": {"type": "css", "value": "#content"}})'
}
payload = {
'url': 'https://www.wikipedia.org'
}
response = requests.get(url, params=payload, headers=headers)
print(response.text)
Dalam kode ini, kami mengirimkan permintaan ke ScraperAPI untuk mengikis beranda Wikipedia. Header berisi kunci API dan set instruksi render. Namun, perhatikan bahwa x-sapi-render
Tajuknya hilang.
Meskipun instruksi untuk mengetik "sepatu bot koboi" dan mengklik tombol pencarian dikirimkan, JavaScript yang diperlukan untuk merender hasil pencarian tidak dijalankan. Hasil yang diharapkan adalah tindakan pencarian tidak selesai dan HTML yang dikembalikan mungkin tidak berisi hasil pencarian.
Dengan rendering diaktifkan dan instruksi:
import requests
url = 'https://api.scraperapi.com/'
headers = {
'x-sapi-api_key': 'YOUR_API_KEY',
'x-sapi-render': 'true',
'x-sapi-instruction_set': '({"type": "input", "selector": {"type": "css", "value": "#searchInput"}, "value": "cowboy boots"}, {"type": "click", "selector": {"type": "css", "value": "#search-form button(type=\\"submit\\\")"}}, {"type": "wait_for_selector", "selector": {"type": "css", "value": "#content"}})'
}
payload = {
'url': 'https://www.wikipedia.org'
}
response = requests.get(url, params=payload, headers=headers)
print(response.text)
Kami menambahkan: x-sapi-render: 'true'
Header dalam versi ini. Hal ini memberitahu ScraperAPI untuk sepenuhnya merender JavaScript pada halaman dan memastikan bahwa input pencarian, tindakan klik, dan pemuatan hasil pencarian berikutnya semuanya dilakukan seolah-olah pengguna sedang berinteraksi langsung dengan browser.
Hasil yang diharapkan adalah HTML yang dikembalikan berisi hasil penelusuran untuk “sepatu bot koboi”, yang mencerminkan keberhasilan eksekusi JavaScript.
Praktik terbaik:
Saat menyalin situs yang memerlukan JavaScript untuk memuat konten atau memerlukan interaksi pengguna, selalu tutup ini x-sapi-render: 'true'
Header. Hal ini memastikan bahwa eksekusi JavaScript dan interaksi yang Anda tentukan dalam kumpulan perintah render dijalankan secara efektif, sehingga memungkinkan Anda menangkap semua data yang relevan.
Untuk informasi selengkapnya tentang penggunaan kumpulan perintah render dan contoh tambahan, lihat dokumentasi ScraperAPI.
Mengikis Konten Dinamis dengan ScraperAPI (Pendekatan Terbaik)
Di bagian ini, saya akan menunjukkan cara mengikis hasil pencarian hotel dinamis dari Booking.com menggunakan ScraperAPI.
Booking.com adalah contoh sempurna situs web yang memuat konten secara dinamis seperti daftar hotel, harga, dan ketersediaan. Saya akan memandu Anda melalui prosesnya dan menunjukkan bagaimana ScraperAPI mengatasi tantangan ini sehingga Anda dapat mengumpulkan semua data yang Anda perlukan.
Langkah 1: Menyiapkan proyek pengikisan
Untuk mulai mengambil hasil pencarian hotel dari Booking.com, Anda harus menyiapkan lingkungan Anda untuk menggunakan ScraperAPI dengan Python.
- Daftar ke ScraperAPI: Jika Anda belum melakukannya, daftar ke ScraperAPI dan dapatkan kunci API gratis Anda.
- Instal perpustakaan Permintaan: Instal
requests
Perpustakaan dengan Python untuk membuat permintaan HTTP. Jalankan perintah berikut:
Langkah 2: Impor perpustakaan yang diperlukan
Pertama, Anda perlu mengimpor perpustakaan yang diperlukan.
Buka skrip Python Anda dan tambahkan baris berikut:
import requests
from bs4 import BeautifulSoup
Perpustakaan ini penting: requests
membantu Anda mengirim permintaan HTTP saat BeautifulSoup
memungkinkan Anda mengurai dan mengekstrak data dari konten HTML yang dikembalikan oleh ScraperAPI.
Langkah 3: Siapkan kunci ScraperAPI Anda
Selanjutnya, tentukan kunci ScraperAPI Anda. Kunci ini memungkinkan Anda mengakses fitur ScraperAPI:
# Your ScraperAPI key
api_key = 'YOUR_API_KEY'
Pastikan untuk mengganti placeholder dengan kunci API Anda yang sebenarnya. Ini penting untuk mengautentikasi permintaan Anda dan menggunakan layanan ScraperAPI.
Langkah 4: Tentukan URL untuk pengikisan
Sekarang tentukan URL halaman yang ingin Anda kikis. Untuk tutorial ini, kami mengikis hasil pencarian hotel dari Booking.com:
# The URL for a Booking.com hotel search query (e.g., hotels in New York)
url = 'https://www.booking.com/searchresults.html?ss=New+York'
Anda dapat menyesuaikan URL ini untuk menargetkan lokasi berbeda dengan mengubah parameter kueri (mis. ss=New+York
). Fleksibilitas ini memungkinkan Anda mengumpulkan data untuk berbagai kota.
Langkah 4: Siapkan payload untuk ScraperAPI
Selanjutnya, atur payload
Kamus dikirim ke ScraperAPI - dalam payload ini Anda mengirimkan URL yang ingin Anda kikis.
# Set up the parameters for ScraperAPI
payload = {
'url': url
}
Langkah 5: Konfigurasikan header untuk permintaan tersebut
Sekarang konfigurasikan header untuk permintaan Anda ke ScraperAPI:
- Itu
x-sapi-api_key
berisi kunci ScraperAPI Anda untuk autentikasi - Itu
x-sapi-render
mengaktifkan rendering JS - Itu
x-sapi-instruction_set
Header berisi instruksi terperinci dan memberitahu ScraperAPI untuk menggulir halaman ke bawah lima kali, berhenti selama lima detik setiap kali. Hal ini memastikan bahwa semua konten yang dimuat secara dinamis ditangkap.
Header berikut menunjukkan cara ScraperAPI memproses permintaan Anda:
headers = {
'x-sapi-api_key': api_key,
'x-sapi-render': 'true',
'x-sapi-instruction_set': '({"type": "loop", "for": 5, "instructions": ({"type": "scroll", "direction": "y", "value": "bottom" }, { "type": "wait", "value": 5 }) })'
}
Langkah 6: Buat permintaan ke ScraperAPI
Setelah semuanya siap, saatnya mengirim permintaan ke ScraperAPI. Setelah mengirimkan permintaan, ScraperAPI memproses halaman sesuai dengan instruksi Anda dan mengembalikan HTML yang telah dirender sepenuhnya dan siap untuk dikikis.
# Make the request to ScraperAPI
response = requests.get('http://api.scraperapi.com', params=payload, headers=headers)
Langkah 7: Analisis konten HTML
Setelah Anda mendapatkan jawabannya, Anda perlu mengurai konten HTML. Untuk melakukan ini, gunakan BeautifulSoup:
soup = BeautifulSoup(response.text, 'html.parser')
Langkah ini mengubah teks HTML menjadi objek BeautifulSoup sehingga Anda dapat dengan mudah menavigasi dan mengekstrak data spesifik yang Anda minati, seperti: B.Daftar hotel.
Langkah 8: Ekstrak entri hotel
Setelah HTML diurai, Anda dapat mengekstrak daftar hotel. Begini cara kerjanya:
listings = soup.find_all('div', attrs={'data-testid': 'property-card'})
Ini menemukan semua orang div
Elemen dengan atribut data-testid
diatur ke property-card
yang mengidentifikasi listingan hotel di Booking.com. Di sini Anda dapat mengekstrak detail seperti nama hotel, harga, dan ulasan.
Langkah 9: Cetak hasilnya
Terakhir, mari kita lihat apa yang kita miliki. Cetak jumlah entri hotel yang ditemukan:
print(f"Found {len(listings)} hotel listings on Booking.com")
Ini akan menampilkan jumlah total entri. Ini mengonfirmasi bahwa operasi pengikisan Anda berhasil dan menunjukkan berapa banyak hotel yang ditemukan.
Menggores situs web dinamis dengan Python dan Selenium
Selenium menawarkan metode ampuh lainnya, terutama ketika Anda memerlukan kontrol yang tepat atas tindakan browser.
Di bagian ini, saya akan memandu Anda mengambil halaman hasil pencarian hotel yang sama dari Booking.com menggunakan SeleniumWire. Selenium Wire memperluas kemampuan Selenium dengan menambahkan dukungan untuk pengambilan permintaan dan respons serta menyediakan integrasi proksi yang kuat - menjadikannya sempurna untuk digunakan dengan ScraperAPI.
Langkah 1: Menyiapkan proyek pengikisan
Untuk memulai Selenium, Anda perlu menyiapkan lingkungan Anda:
- Instal Selenium: Pertama instal SeleniumWire dengan
pip
:
pip install selenium-wire
- Unduh WebDriver: Selenium memerlukan WebDriver untuk mengontrol browser. Jika Anda menggunakan Chrome, unduh ChromeDriver di sini.
- Instal Sup Cantik: Anda juga memerlukan BeautifulSoup untuk mengurai HTML:
pip install beautifulsoup4
Langkah 2: Impor perpustakaan yang diperlukan
Selanjutnya, impor perpustakaan yang diperlukan untuk proyek ini.
from seleniumwire import webdriver # Use selenium-wire's webdriver for proxy support
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
Langkah 3: Siapkan ScraperAPI dalam mode proksi
Integrasikan ScraperAPI dengan Selenium sebagai proksi untuk meningkatkan ketahanan scraper Anda. Menggunakan ScaperAPI sebagai proxy membantu merotasi alamat IP dan mengelola CAPTCHA, menjadikan scraping Anda lebih efisien dan andal.
API_KEY = 'YOUR_API_KEY'
proxy_options = { 'proxy': { 'http': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001', 'https': f'http://scraperapi:{API_KEY}@proxy-server.scraperapi.com:8001', 'no_proxy': 'localhost,127.0.0.1' # Bypass the proxy for local addresses } }
driver = webdriver.Chrome(seleniumwire_options=proxy_options)
Langkah 4: Navigasikan ke halaman Booking.com
Setelah WebDriver dikonfigurasi, kini Anda dapat menavigasi ke halaman hasil pencarian Booking.com:
url = 'https://www.booking.com/searchresults.html?ss=New+York'
driver.get(url)
Langkah 5: Proses konten dinamis dengan Selenium
Booking.com memuat konten tambahan saat Anda menggulir halaman ke bawah. Untuk mengambil semua listingan hotel, Anda harus menggulir berulang kali ke bagian bawah halaman hingga tidak ada konten baru yang dimuat.
# Scroll to the bottom of the page to load more content
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.END)
time.sleep(10) # Wait for the page to load
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height: # Check if the bottom has been reached
break
last_height = new_height
Lingkaran ini menggulir halaman ke bawah dan menunggu konten tambahan dimuat. Pengguliran berlanjut hingga tidak ada konten baru yang ditampilkan. Ini memastikan bahwa semua data dinamis ditangkap.
Langkah 6: Ekstrak dan parsing konten HTML
Setelah halaman dimuat sepenuhnya dan tidak ada konten baru yang ditampilkan, ambil konten HTML dan parsing dengan BeautifulSoup:
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
listings = soup.find_all('div', attrs={'data-testid': 'property-card'})
Ini menangkap seluruh HTML halaman dan mengekstrak semua entri hotel.
Langkah 7: Cetak hasilnya
Terakhir, cetak jumlah listing hotel yang ditemukan di halaman:
print(f"Found {len(listings)} hotel listings on Booking.com")
Output ini mengonfirmasi berapa banyak listingan hotel yang berhasil dicari skrip Anda.
Mengapa menggunakan Selenium Wire dengan ScraperAPI?
Selenium Wire menawarkan fitur-fitur canggih dibandingkan Selenium standar, terutama dalam menangani permintaan jaringan dan konfigurasi proxy. Dengan menggabungkan Selenium Wire dengan ScraperAPI Anda mendapatkan:
- Rotasi IP dan anonimitas: ScraperAPI mengelola rotasi IP, mengurangi risiko pemblokiran.
- Penanganan CAPTCHA: ScraperAPI dapat menyelesaikan CAPTCHA secara otomatis, memungkinkan pengikisan yang tidak mengganggu.
- Peningkatan Kontrol: Selenium Wire memberi Anda kontrol terperinci atas kebutuhan jaringan, sehingga memudahkan pemecahan masalah dan mengoptimalkan scraping Anda.
Bersama-sama, alat-alat ini membentuk pengaturan yang kuat untuk menghapus situs web yang paling dinamis dan kompleks sekalipun.