Panduan scraping web Python langkah demi langkah untuk pemula

Komentar: 0

Python menjadi pilihan utama untuk web scraping karena pustaka yang kuat dan sintaks yang mudah. Dalam tutorial web scraping Python ini, kita akan mengeksplorasi dasar-dasar ekstraksi data dan memandu Anda dalam menyiapkan lingkungan Python Anda untuk membuat scraper web pertama Anda. Kami akan memperkenalkan Anda kepada pustaka-pustaka utama yang cocok untuk tugas-tugas scraping, termasuk Beautiful Soup, Playwright, dan lxml.

Pustaka Mana yang Digunakan

Ada banyak sekali pustaka pengikisan web Python yang menyederhanakan prosesnya. Di bawah ini adalah beberapa yang paling populer:

  • request: pustaka HTTP yang sederhana dan elegan untuk Python, yang digunakan untuk mengirim permintaan HTTP untuk mengambil halaman web.
  • Beautiful Soup: sangat bagus untuk mengurai konten halaman. Ini membuat pohon penguraian dari kode sumber halaman yang memudahkan untuk mengekstrak data.
  • lxml: dikenal dengan kecepatan dan efisiensinya, lxml sangat baik untuk mengurai data terstruktur.
  • Playwright: alat yang tangguh untuk mengikis konten dinamis dan berinteraksi dengan halaman web.

Jika Anda bertanya-tanya bagaimana cara mengupas situs web menggunakan Python, ini dimulai dengan memahami cara kerja permintaan HTTP.

Pengantar permintaan HTTP

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 mengirimkan kembali respons ke browser yang ditampilkan sebagai halaman web. Untuk web scraping, Anda perlu meniru proses ini dan membuat permintaan HTTP dari skrip Anda untuk mendapatkan konten halaman web secara terprogram.

Menyiapkan Lingkungan Anda

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

Membangun pengikis web dengan Beautiful Soup

Mari kita mulai dengan scraper web sederhana yang menggunakan permintaan untuk mengikis konten HTML statis.

Membuat permintaan HTTP GET

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)

Menangani respons HTTP

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)

Menangani kesalahan HTTP dan jaringan

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!')

Mengekstrak data dari elemen HTML

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.

Menemukan selektor XPath dan CSS

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:

  1. Buka alat pengembang:
    • Di Chrome: Klik kanan pada halaman dan pilih "Inspect" atau tekan Ctrl+Shift+I (Windows/Linux) atau Cmd+Opt+I (Mac).
    • Di Firefox: Klik kanan pada halaman dan pilih "Inspect Element" atau tekan Ctrl+Shift+I (Windows/Linux) atau Cmd+Opt+I (Mac).
  2. Periksa elemen:
    • Gunakan alat periksa (ikon kursor) untuk mengarahkan kursor ke atas dan klik elemen yang ingin Anda kikis. Ini akan menyorot elemen dalam tampilan struktur HTML.
  3. Salin pemilih XPath atau CSS:
    • Klik kanan pada elemen HTML yang disorot di panel alat pengembang.
    • Pilih "Salin" dan kemudian pilih "Salin XPath" atau "Salin pemilih" (pemilih CSS).

1n.png

XPath: /html/body/div/h1

CSS Selector: body > div > h1

Ekstraksi menggunakan Beautiful Soup

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)

Menangani kesalahan penguraian

Seperti halnya Beautiful Soup, lxml memungkinkan Anda untuk menangkap dan menangani masalah dengan baik menggunakan pengecualian seperti lxml.etree.XMLSyntaxError.

"Kode pengikisan web Python" yang disediakan melakukan ekstraksi data pada halaman produk Amazon menggunakan Playwright dan lxml. Kode ini menyiapkan proxy dan meluncurkan peramban, menavigasi ke halaman produk, berinteraksi dengan elemen, menunggu pemuatan halaman penuh, dan menangkap sumber halaman.

Konten ini diurai menggunakan lxml untuk membuat pohon elemen, dan XPath digunakan untuk mengekstrak judul produk. Skrip ini menangani kasus-kasus di mana elemen tidak ditemukan atau penguraian gagal. Setelah penguraian, skrip ini menutup sesi peramban dengan benar.


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

Ekstraksi menggunakan lxml

Pustaka populer lainnya untuk mengurai konten adalah lxml. Meskipun BeautifulSoup mudah digunakan, lxml lebih cepat dan lebih fleksibel, sehingga ideal untuk tugas-tugas yang sangat penting.


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)

Menangani kesalahan penguraian

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

Menyimpan data yang diekstrak

Setelah Anda berhasil mengekstrak data, 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:

Menyimpan data ke file CSV

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

Menyimpan data ke file JSON

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

Teknik scraping web tingkat lanjut dengan Playwright

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

Mengikis konten dinamis

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.

2n.png

Kode scraping web Python yang disediakan melakukan ekstraksi data 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 interaksi ini selesai dan halaman dimuat sepenuhnya, konten halaman diambil.

Konten ini kemudian diuraikan menggunakan metode fromstring di lxml untuk membuat pohon elemen. Kueri XPath digunakan untuk mengekstrak konten teks dari judul produk dari elemen tertentu dengan ID productTitle. Skrip ini dirancang untuk menangani situasi di mana kueri XPath mungkin gagal mengembalikan hasil, di mana masalah dengan sintaks XML terjadi selama penguraian, atau ketika ada hal lain yang tidak terduga. Pada akhirnya, judul produk yang diekstrak dengan lxml dicetak, dan konteks peramban serta peramban itu sendiri ditutup dengan benar untuk menyelesaikan 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.

Kesimpulan

Tutorial web scraping Python ini menguraikan metode praktis untuk ekstraksi data otomatis menggunakan library seperti Beautiful Soup, lxml, dan Playwright. Dalam istilah teknis, apa itu web scraping Python mengacu pada penggunaan alat berbasis Python untuk secara sistematis mengambil dan memproses data terstruktur dari situs web.

Baik Anda bekerja dengan konten statis atau halaman yang di-render dengan JavaScript, ada alat Python untuk pekerjaan itu. Dengan mempelajari permintaan HTTP, menguasai penguraian, dan memahami ekstraksi data, Anda siap untuk membangun scraper yang andal.

Saat Anda melangkah lebih jauh, ingatlah untuk mengikuti praktik scraping yang etis - hormati robots.txt, hindari server yang membebani, dan selalu tangani data secara bertanggung jawab. Dengan dasar yang kuat, Anda sekarang dapat dengan percaya diri mulai mengembangkan proyek scraping Anda sendiri dan membuka potensi penuh dari data web.

Komentar:

0 komentar