Panduan scraping web Python langkah demi langkah untuk pemula

Komentar: 0

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.

Pustaka Python untuk web scraping

Python menyediakan beberapa pustaka untuk membuat web scraping menjadi lebih mudah. Berikut adalah beberapa yang paling umum digunakan:

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

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 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.

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

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

Ekstraksi menggunakan lxml

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)

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 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:

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 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 komentar