Python menonjol sebagai pilihan utama untuk web scraping karena pustaka yang kuat dan sintaks yang mudah. Dalam artikel ini, kita akan menjelajahi dasar-dasar web scraping dan memandu Anda dalam menyiapkan lingkungan Python untuk membuat web scraper pertama Anda. Kami akan memperkenalkan Anda pada pustaka-pustaka Python utama yang cocok untuk tugas-tugas scraping, termasuk Beautiful Soup, Playwright, dan lxml.
Python menyediakan beberapa pustaka untuk membuat web scraping menjadi lebih mudah. Berikut adalah beberapa yang paling umum digunakan:
HTTP (HyperText Transfer Protocol) adalah protokol lapisan aplikasi untuk transfer data di web. Anda mengetikkan URL di browser, dan browser akan membuat permintaan HTTP dan mengirimkannya ke server web. Server web kemudian mengirimkan kembali respons HTTP ke browser yang ditampilkan kepada Anda sebagai halaman HTML. Untuk web scraping, Anda perlu meniru proses ini dan membuat permintaan HTTP dari skrip Anda untuk mendapatkan konten HTTP dari halaman web secara terprogram.
Pertama, pastikan Anda telah menginstal Python pada sistem Anda. Anda bisa mengunduhnya dari situs web resmi Python.
Lingkungan virtual membantu mengelola ketergantungan. Gunakan perintah ini untuk membuat dan mengaktifkan lingkungan virtual:
python -m venv scraping_env
source scraping_env/bin/activate
Selanjutnya, instal paket yang diperlukan dengan menggunakan perintah berikut:
pip install requests
pip install beautifulsoup4
pip install lxml
Mari kita mulai dengan scraper web sederhana yang menggunakan permintaan untuk mengikis konten HTML statis.
Jenis permintaan HTTP yang paling umum adalah permintaan GET, yang digunakan untuk mengambil data dari URL tertentu. Berikut ini adalah contoh dasar cara melakukan permintaan GET ke http://example.com.
import requests
url = 'http://example.com'
response = requests.get(url)
Pustaka permintaan menyediakan beberapa cara untuk menangani dan memproses respons:
Periksa kode status: memastikan permintaan berhasil.
if response.status_code == 200:
print('Request was successful!')
else:
print('Request failed with status code:', response.status_code)
Mengekstrak konten: mengekstrak teks atau konten JSON dari respons.
# Dapatkan konten respons sebagai teks
page_content = response.text
print(page_content)
# Dapatkan konten respons sebagai JSON (jika respons dalam format JSON)
json_content = response.json()
print(json_content)
Kesalahan HTTP dan jaringan dapat terjadi ketika sumber daya tidak dapat dijangkau, permintaan telah habis waktunya, atau server mengembalikan status HTTP yang salah (misalnya 404 Tidak Ditemukan, 500 Internal Server Error). Kita dapat menggunakan objek pengecualian yang dimunculkan oleh permintaan untuk menangani situasi ini.
import requests
url = 'http://example.com'
try:
response = requests.get(url, timeout=10) # Set a timeout for the request
response.raise_for_status() # Raises an HTTPError for bad responses
except requests.exceptions.HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
except requests.exceptions.ConnectionError:
print('Failed to connect to the server.')
except requests.exceptions.Timeout:
print('The request timed out.')
except requests.exceptions.RequestException as req_err:
print(f'Request error: {req_err}')
else:
print('Request was successful!')
Untuk melakukan web scraping, kita sering kali perlu mengekstrak data dari konten HTML. Bagian ini akan membahas tentang cara mencari dan mengekstrak data dari elemen HTML dengan beberapa pustaka seperti Beautiful Soup atau lxml.
HTML (HyperText Markup Language) adalah bahasa markup standar untuk membuat halaman web. Bahasa ini terdiri dari elemen-elemen bersarang yang diwakili oleh tag, seperti <div>, <p>, <a>, dll. Setiap tag dapat memiliki atribut dan berisi teks, tag lain, atau keduanya.
Selektor XPath dan CSS menyediakan cara serbaguna untuk memilih elemen HTML berdasarkan atribut atau posisinya dalam dokumen.
Ketika melakukan web scraping, mengekstrak data spesifik dari halaman web sering kali membutuhkan identifikasi selektor XPath atau CSS yang tepat untuk menargetkan elemen HTML. Berikut ini adalah cara menemukan selektor ini secara efisien:
Sebagian besar browser web modern dilengkapi dengan alat pengembang bawaan yang memungkinkan Anda untuk memeriksa struktur HTML halaman web. Berikut adalah panduan langkah demi langkah tentang cara menggunakan alat bantu ini:
XPath: /html/body/div/h1
CSS Selector: body > div > h1
Beautiful Soup adalah pustaka Python untuk mengurai dokumen HTML dan XML. Ini menyediakan metode dan atribut sederhana untuk menavigasi dan mencari melalui struktur HTML.
from bs4 import BeautifulSoup
import requests
# URL halaman web yang akan dikikis
url = 'https://example.com'
# Kirim permintaan HTTP GET ke URL
response = requests.get(url)
# Mengurai konten HTML dari respons menggunakan Beautiful Soup
soup = BeautifulSoup(response.content, 'html.parser')
# Gunakan pemilih CSS untuk menemukan semua tag <h1> yang berada di dalam tag <div>
# yang merupakan anak langsung dari tag <body>
h1_tags = soup.select('body > div > h1')
# Lakukan perulangan pada daftar tag <h1> yang ditemukan dan cetak konten teksnya
for tag in h1_tags:
print(tag.text)
Kesalahan penguraian terjadi ketika struktur HTML atau XML tidak sesuai dengan yang diharapkan, sehingga menyebabkan masalah dalam ekstraksi data. Hal ini dapat dikelola dengan menangani pengecualian seperti AttributeError.
from bs4 import BeautifulSoup
import requests
# URL halaman web yang akan dikikis
url = 'https://example.com'
# Kirim permintaan HTTP GET ke URL
response = requests.get(url)
try:
# Mengurai konten HTML dari respons menggunakan Beautiful Soup
soup = BeautifulSoup(response.content, 'html.parser')
# Gunakan pemilih CSS untuk menemukan semua tag <h1> yang berada di dalam tag <div>
# yang merupakan anak langsung dari tag <body>
h1_tags = soup.select('body > div > h1')
# Lakukan perulangan pada daftar tag <h1> yang ditemukan dan cetak konten teksnya
for tag in h1_tags:
print(tag.text)
except AttributeError as attr_err:
# Menangani kasus-kasus di mana AttributeError dapat terjadi (misalnya, jika response.content adalah None)
print(f'Attribute error occurred: {attr_err}')
except Exception as parse_err:
# Menangani pengecualian lain yang mungkin terjadi selama penguraian
print(f'Error while parsing HTML: {parse_err}')
Selain Beautiful Soup, pustaka populer lainnya untuk mem-parsing dokumen HTML dan XML dalam Python adalah lxml. Meskipun BeautifulSoup berfokus pada penyediaan antarmuka yang nyaman untuk menavigasi dan memanipulasi data yang diurai, lxml dikenal karena kecepatan dan fleksibilitasnya, sehingga menjadi pilihan yang lebih disukai untuk tugas-tugas yang sangat penting bagi kinerja.
from lxml.html import fromstring
import requests
# URL halaman web yang akan dikikis
url = 'https://example.com'
# Kirim permintaan HTTP GET ke URL
response = requests.get(url)
# Mengurai konten HTML dari respons menggunakan metode fromstring dari lxml
parser = fromstring(response.text)
# Gunakan XPath untuk menemukan konten teks dari tag <h1> pertama
# yang berada di dalam tag <div>, yang merupakan anak langsung dari tag <body>
title = parser.xpath('/html/body/div/h1/text()')[0]
# Mencetak judul
print(title)
Mirip dengan Beautiful Soup, lxml memungkinkan Anda menangani kesalahan penguraian dengan baik dengan menangkap pengecualian seperti lxml.etree.XMLSyntaxError.
from lxml.html import fromstring
from lxml import etree
import requests
# URL halaman web yang akan dikikis
url = 'https://example.com'
# Kirim permintaan HTTP GET ke URL
response = requests.get(url)
try:
# Mengurai konten HTML dari respons menggunakan metode fromstring dari lxml
parser = fromstring(response.text)
# Gunakan XPath untuk menemukan konten teks dari tag <h1> pertama
# yang berada di dalam tag <div>, yang merupakan anak langsung dari tag <body>
title = parser.xpath('/html/body/div/h1/text()')[0]
# Mencetak judul
print(title)
except IndexError:
# Menangani kasus di mana kueri XPath tidak mengembalikan hasil apa pun
print('No <h1> tag found in the specified location.')
except etree.XMLSyntaxError as parse_err:
# Menangani kesalahan sintaks XML selama penguraian
print(f'Error while parsing HTML: {parse_err}')
except Exception as e:
# Menangani pengecualian lainnya
print(f'An unexpected error occurred: {e}')
Setelah Anda berhasil mengekstrak data dari elemen HTML, langkah selanjutnya adalah menyimpan data tersebut. Python menyediakan beberapa opsi untuk menyimpan data yang telah diekstrak, termasuk menyimpan ke file CSV, file JSON, dan database. Berikut ini adalah ikhtisar cara menyimpan data yang diekstrak menggunakan format yang berbeda:
CSV (Comma-Separated Values) adalah format yang sederhana dan banyak digunakan untuk menyimpan data tabel. Modul CSV dalam Python memudahkan penulisan data ke file CSV.
import csv
# Data sampel
data = {
'title': 'Example Title',
'paragraphs': ['Paragraph 1', 'Paragraph 2', 'Paragraph 3']
}
# Menyimpan data ke file CSV
with open('scraped_data.csv', mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(['Title', 'Paragraph'])
for paragraph in data['paragraphs']:
writer.writerow([data['title'], paragraph])
print('Data saved to scraped_data.csv')
JSON (JavaScript Object Notation) adalah format pertukaran data ringan yang mudah dibaca dan ditulis. Modul JSON dalam Python menyediakan metode untuk menyimpan data dalam format JSON.
import json
# Data sampel
data = {
'title': 'Example Title',
'paragraphs': ['Paragraph 1', 'Paragraph 2', 'Paragraph 3']
}
# Menyimpan data ke file JSON
with open('scraped_data.json', mode='w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
print('Data saved to scraped_data.json')
Playwright adalah alat yang ampuh untuk mengikis konten dinamis dan berinteraksi dengan elemen-elemen web. Alat ini dapat menangani situs web dengan banyak JavaScript yang tidak dapat ditangani oleh pengurai HTML statis.
Instal Playwright dan siapkan:
pip install playwright
playwright install
Playwright memungkinkan Anda untuk berinteraksi dengan elemen-elemen web seperti mengisi formulir dan mengklik tombol. Aplikasi ini dapat menunggu permintaan AJAX selesai sebelum melanjutkan, membuatnya ideal untuk mengikis konten dinamis.
Kode yang disediakan melakukan pengikisan web pada halaman produk Amazon menggunakan Playwright dan lxml. Awalnya, modul-modul yang diperlukan diimpor. Fungsi run didefinisikan untuk merangkum logika pengikisan. Fungsi ini dimulai dengan menyiapkan server proxy dan meluncurkan contoh peramban baru dengan proxy dan dalam mode tanpa kepala, yang memungkinkan kita untuk mengamati tindakan peramban. Dalam konteks peramban, halaman baru dibuka dan dinavigasi ke URL produk Amazon yang ditentukan, dengan batas waktu 60 detik untuk memastikan halaman dimuat sepenuhnya.
Skrip kemudian berinteraksi dengan halaman untuk memilih gaya produk tertentu dari menu tarik-turun dan opsi produk dengan menggunakan pencari lokasi dan pencocokan teks. Setelah memastikan interaksi ini selesai dan halaman dimuat kembali sepenuhnya, konten HTML dari halaman tersebut diambil.
Konten HTML kemudian diuraikan menggunakan metode fromstring dari lxml untuk membuat pohon elemen. Kueri XPath digunakan untuk mengekstrak konten teks dari judul produk dari elemen tertentu dengan ID productTitle. Skrip ini mencakup penanganan kesalahan untuk mengelola kasus-kasus di mana kueri XPath tidak mengembalikan hasil, di mana terdapat kesalahan sintaks XML selama penguraian, atau pengecualian tak terduga lainnya. Terakhir, judul produk yang diekstrak tlxml dicetak, dan konteks peramban serta peramban ditutup untuk mengakhiri sesi.
Fungsi run dijalankan dalam sesi Playwright yang dimulai oleh sync_playwright, memastikan bahwa seluruh proses dikelola dan dijalankan dalam lingkungan yang terkendali. Struktur ini memastikan ketahanan dan ketahanan terhadap kesalahan saat melakukan tugas pengikisan web.
from playwright.sync_api import Playwright, sync_playwright
from lxml.html import fromstring, etree
def run(playwright: Playwright) -> None:
# Menentukan server proxy
proxy = {"server": "https://IP:PORT", "username": "LOGIN", "password": "PASSWORD"}
# Luncurkan instans peramban baru dengan proxy yang ditentukan dan dalam mode non-headless
browser = playwright.chromium.launch(
headless=False,
proxy=proxy,
slow_mo=50,
args=['--ignore-certificate-errors'],
)
# Membuat konteks browser baru
context = browser.new_context(ignore_https_errors=True)
# Membuka halaman baru dalam konteks browser
page = context.new_page()
# Arahkan ke halaman produk Amazon yang ditentukan
page.goto(
"https://www.amazon.com/A315-24P-R7VH-Display-Quad-Core-Processor-Graphics/dp/B0BS4BP8FB/",
timeout=10000,
)
# Tunggu hingga halaman dimuat sepenuhnya
page.wait_for_load_state("load")
# Pilih gaya produk tertentu dari menu tarik-turun
page.locator("#dropdown_selected_style_name").click()
# Memilih opsi produk tertentu
page.click('//*[@id="native_dropdown_selected_style_name_1"]')
page.wait_for_load_state("load")
# Dapatkan konten HTML dari halaman yang dimuat
html_content = page.content()
try:
# Mengurai konten HTML menggunakan metode fromstring dari lxml
parser = fromstring(html_content)
# Gunakan XPath untuk mengekstrak konten teks dari judul produk
product_title = parser.xpath('//span[@id="productTitle"]/text()')[0].strip()
# Mencetak judul produk yang diekstrak
print({"Product Title": product_title})
except IndexError:
# Menangani kasus di mana kueri XPath tidak mengembalikan hasil apa pun
print('Product title not found in the specified location.')
except etree.XMLSyntaxError as parse_err:
# Menangani kesalahan sintaks XML selama penguraian
print(f'Error while parsing HTML: {parse_err}')
except Exception as e:
# Menangani pengecualian lainnya
print(f'An unexpected error occurred: {e}')
# Tutup konteks browser dan browser
context.close()
browser.close()
# Gunakan sync_playwright untuk memulai sesi Playwright dan menjalankan skrip
with sync_playwright() as playwright:
run(playwright)
Scraping web dengan Python adalah metode yang ampuh untuk memanen data dari situs web. Alat-alat yang dibahas memfasilitasi ekstraksi, pemrosesan, dan penyimpanan data web untuk berbagai tujuan. Dalam proses ini, penggunaan server proxy untuk mengganti alamat IP dan menerapkan penundaan di antara permintaan sangat penting untuk menghindari pemblokiran. Beautiful Soup mudah digunakan untuk pemula, sementara lxml cocok untuk menangani kumpulan data yang besar berkat efisiensinya. Untuk kebutuhan scraping yang lebih canggih, terutama dengan situs web JavaScript yang dimuat secara dinamis, Playwright terbukti sangat efektif.
Komentar: 0