Pertama, mari kita coba memilih nama karyawan pertama di konsol browser kita menggunakan metode .querySelectorAll(). Fitur yang sangat berguna dari metode ini adalah kita dapat masuk lebih dalam ke dalam hierarki dengan menerapkan simbol lebih besar dari (>) untuk mengambil elemen induk (kiri) dan elemen anak yang ingin kita ambil (kanan), untuk didefinisikan.
document.querySelectorAll('table.stripe > tbody > tr > td')(0)
Ini tidak bisa lebih baik lagi. Seperti yang Anda lihat, mari kita ambil semuanya terlebih dahulu
Dari sana kita dapat menulis kode kita seperti ini:
for row in rows:
name = row.find_all('td')(0).text
print(name)
Sederhananya, kami mengambil setiap baris satu per satu dan mencari semua sel yang ada di dalamnya. Setelah kita memiliki daftarnya, kita hanya mengakses yang pertama di indeks (posisi 0) dan menyelesaikannya dengan metode .text untuk mengakses teks elemen dan mengabaikan data HTML yang tidak kita perlukan.
Itu dia, daftar semua nama karyawannya! Selebihnya, kita cukup mengikuti logika yang sama:
position = row.find_all('td')(1).text
office = row.find_all('td')(2).text
age = row.find_all('td')(3).text
start_date = row.find_all('td')(4).text
salary = row.find_all('td')(5).text
Namun, mencetak semua data ini di konsol kami tidak terlalu membantu. Sebaliknya, mari simpan data ini dalam format baru yang lebih berguna.
Daftar Isi
5. Simpan data tabel ke file JSON
Meskipun kami dapat dengan mudah membuat file CSV dan mengirimkan data kami ke sana, format tersebut bukanlah format yang paling mudah dikelola jika kami dapat membuat sesuatu yang baru dengan data bekas.
Namun, berikut adalah proyek yang kami lakukan beberapa bulan lalu yang menjelaskan cara membuat file CSV untuk menyimpan data bekas.
Kabar baiknya adalah Python memiliki modul JSON sendiri untuk bekerja dengan objek JSON, jadi kita tidak perlu menginstal apa pun, cukup impor saja.
Namun sebelum kita dapat melanjutkan pembuatan file JSON, kita perlu mengubah semua data yang tergores ini menjadi sebuah daftar. Untuk melakukan ini, kita membuat array kosong di luar loop kita.
Dan kemudian tambahkan data ke dalamnya, dengan setiap loop menambahkan objek baru ke array.
employee_list.append({
'Name': name,
'Position': position,
'Office': office,
'Age': age,
'Start date': start_date,
'salary': salary
})
jika kita print(employee_list)
inilah hasilnya:
Masih agak berantakan, tapi kami memiliki banyak objek yang siap untuk dikonversi ke JSON.
Catatan: Sebagai ujian, kami mencetak panjangnya employee_list
dan menghasilkan 57, yang merupakan jumlah baris yang benar yang telah kita gores (baris sekarang menjadi objek dalam array).
Mengimpor daftar ke JSON hanya memerlukan dua baris kode:
with open('json_data', 'w') as json_file:
json.dump(employee_list, json_file, indent=2)
- Pertama kita buka file baru dan masukkan nama file yang diinginkan
(json_data)
dan 'w' karena kami ingin menulis data ke dalamnya. - Selanjutnya kita menggunakan
.dump()
Berfungsi untuk membackup data dari array(
employee_list
)
Danindent=2
Jadi setiap objek mempunyai garisnya masing-masing, bukan semuanya berada pada satu garis yang tidak terbaca.
6. Jalankan script dan kode lengkapnya
Jika Anda sudah mengikuti, Basis kode Anda akan terlihat seperti ini:
#dependencies
import requests
from bs4 import BeautifulSoup
import json
url = 'http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxx&url=https://datatables.net/examples/styling/stripe.html'
#empty array
employee_list = ()
#requesting and parsing the HTML file
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
#selecting the table
table = soup.find('table', class_ = 'stripe')
#storing all rows into one variable
for employee_data in table.find_all('tbody'):
rows = employee_data.find_all('tr')
#looping through the HTML table to scrape the data
for row in rows:
name = row.find_all('td')(0).text
position = row.find_all('td')(1).text
office = row.find_all('td')(2).text
age = row.find_all('td')(3).text
start_date = row.find_all('td')(4).text
salary = row.find_all('td')(5).text
#sending scraped data to the empty array
employee_list.append({
'Name': name,
'Position': position,
'Office': office,
'Age': age,
'Start date': start_date,
'salary': salary
})
#importing the array to a JSON file
with open('employee_data', 'w') as json_file:
json.dump(employee_list, json_file, indent=2)
Catatan: Kami telah menambahkan beberapa komentar untuk konteksnya.
Dan inilah tampilan tiga objek pertama dari file JSON:
Dengan menyimpan data yang tergores dalam format JSON, kita dapat menggunakan kembali informasi tersebut untuk aplikasi baru atau
Mengikis tabel HTML dengan header yang rumit.
Mengikis data dari tabel HTML cukup mudah, namun apa yang terjadi jika Anda mengakses tabel dengan struktur yang lebih kompleks, seperti: Misalnya tabel bersarang? rowspans
atau colspans
? Dalam kasus ini, Anda mungkin perlu menerapkan logika penguraian yang lebih canggih.
Sebelum kita mulai, lihat seperti apa tabel target di bawah ini:
Seperti yang Anda lihat, tabel ini memiliki struktur header dua tingkat:
-
Baris pertama berisi kategori yang lebih luas: “Nama belakang", "posisi", Dan "Kontak“.
- Baris kedua mengelompokkan kategori-kategori ini lebih lanjut.
Mari kita bersihkan mejanya!
Menyiapkan lingkungan pengikisan
Pertama kita perlu mengimpor perpustakaan yang diperlukan. ScraperAPI membantu kami menangani tindakan anti-scraping apa pun yang mungkin ada di situs web, termasuk mengelola header dan merotasi IP jika perlu:
import requests
from bs4 import BeautifulSoup
import pandas as pd
api_key = 'YOUR_API_KEY'
url = 'https://datatables.net/examples/basic_init/complex_header.html'
Membuat fungsi pengikisan
Mari beralih ke pembuatan fungsi scrape_complex_table
Ini menangani seluruh proses pengikisan. Fungsi ini mengambil URL kita sebagai masukan dan mengembalikan Pandas DataFrame yang berisi data tabel terstruktur:
def scrape_complex_table(url):
# Send a request to the webpage
payload = {'api_key': api_key, 'url': url}
response = requests.get('https://api.scraperapi.com', params=payload)
soup = BeautifulSoup(response.text, 'html.parser')
Fungsi ini digunakan requests.get
untuk mengirim permintaan GET ke ScraperAPI, yang kemudian mengambil situs web target. Kami kemudian mengurai konten HTML menggunakan BeautifulSoup.
Menemukan tabel target
Kami menemukan tabel dalam HTML yang diurai menggunakannya id
Atribut.
# Find the target table
table = soup.find('table', id='example')
Baris ini menemukan yang pertama
, and stores the data in the rows Daftar.
Membuat DataFrameKami membuat Pandas DataFrame menggunakan gabungan header dan data yang diekstraksi. DataFrame ini mengatur data kita dalam format terstruktur dengan nama kolom yang sesuai.
Jalankan scraper dan simpan data Kami menyebutnya demikian
Ini akan mencetak baris teratas DataFrame dan menyimpan semua data dalam file bernama Menyatukan semuanyaIni adalah tampilan kode lengkapnya setelah menggabungkan semua langkah:
Catatan: Pastikan Anda sudah menggantinya Mengikis tabel HTML yang diberi halaman dengan PythonSaat menangani kumpulan data yang besar, tabel sering kali dibagi menjadi beberapa halaman untuk meningkatkan waktu pemuatan dan pengalaman pengguna. Biasanya hal ini memerlukan pengaturan browser tanpa kepala menggunakan alat seperti Selenium. Namun, dengan menggunakan kumpulan perintah rendering ScraperAPI, kita dapat mencapai hasil yang sama dengan lebih efisien. catatan: Lihat tutorial mendetail ini Pengikisan web dengan Selenium untuk mengetahui lebih lanjut. Dasar-dasar menangani paginationDalam contoh kita, tabel ditandai dengan “>” dan “ Untuk mengekstrak semua data kita perlu melakukan hal berikut:
Menggunakan set instruksi render ScraperAPIDaripada mengontrol browser secara manual, kami dapat mengirimkan instruksi ke browser tanpa kepala ScraperAPI melalui API mereka. Kumpulan instruksi render ScraperAPI memungkinkan Anda mengirim instruksi ke browser tanpa kepala melalui panggilan API, memberi tahu tindakan apa yang harus diambil saat merender halaman. Instruksi ini dikirim sebagai objek JSON di header permintaan API. Mari kita dengan cepat mendemonstrasikan cara mengikis tabel yang diberi nomor halaman menggunakan kumpulan perintah render ScraperAPI: Konfigurasikan ScraperAPI dan instruksi rendering Pertama, kami menyiapkan kunci ScraperAPI dan URL target yang ingin kami hapus. Ingatlah untuk menggantinya
Sekarang mari kita tentukan kumpulan instruksi rendering.
Itu Buat permintaan ke ScraperAPI Setelah kita menentukan instruksi rendering, kita perlu mengonversinya
Kami kemudian menyiapkan header dan payload untuk permintaan GET ke ScraperAPI:
Dalam judul:
Payload hanya mencakup Memproses data tabelSetelah kita mendapatkan jawabannya, kita dapat mengolah data tabel menggunakan BeautifulSoup:
Keuntungan menggunakan instruksi renderMenggunakan instruksi render ScraperAPI menawarkan beberapa keuntungan dibandingkan otomatisasi browser tradisional:
Menangani kesalahan saat menggores tabel HTMLTabel HTML di situs web nyata sering kali memiliki tata letak yang rumit, sehingga sulit dikuasai oleh pemula. Tabel ini bisa berisi tipe data campuran, elemen bertumpuk, sel gabungan, dan struktur rumit lainnya yang membuat tabel sulit diurai saat digores. Mari jelajahi beberapa masalah umum dan solusinya untuk membuat pengikisan tabel Anda lebih efisien dan andal: 1. Menangani sel kosong dan data yang hilangSel kosong atau data yang hilang dapat menyebabkan skrip pengikisan Anda gagal atau memberikan hasil yang tidak lengkap. Berikut cara menanganinya dengan elegan:
2. Tabel yang disuntikkan JavaScriptBeberapa tabel dibuat secara dinamis menggunakan JavaScript. Artinya, data tidak ada dalam respons HTML awal, namun dimasukkan ke dalam halaman setelah dirender oleh browser. Metode pengikisan tradisional mungkin tidak dapat mengambil konten ini karena tidak menjalankan JavaScript. Kumpulan perintah rendering ScraperAPI memungkinkan Anda menyimulasikan interaksi pengguna dan menjalankan JavaScript di lingkungan browser tanpa kepala. Hal ini memungkinkan Anda mencari tabel yang dimuat secara dinamis tanpa harus menggunakan alat rumit seperti Selenium.
Catatan: Untuk informasi lebih lanjut tentang menggores tabel Javascript, lihat panduan terperinci kami. 3. Tabel HTML salahBeberapa tabel mungkin memiliki struktur HTML yang tidak valid atau tag penutup tidak ada. Parser yang lebih baik untuk kasus ini adalah html5lib. Berikut cara mengatasinya:
4. Menggunakan Pandas sebagai pengganti MechanicalSoup atau BeautifulSoup Menggunakan Pandas untuk mengikis tabel HTML menghemat banyak waktu dan membuat kode lebih andal karena Anda memilih seluruh tabel daripada elemen individual yang dapat berubah seiring waktu. Itu Mengikis tabel HTML dengan PandasSebelum Anda meninggalkan halaman ini, mari kita jelajahi pendekatan kedua untuk menggores tabel HTML. Dalam beberapa baris kode, kita dapat mengekstrak semua data tabel dari dokumen HTML dan menyimpannya dalam bingkai data menggunakan Pandas. Buat folder baru di direktori proyek (kami beri nama pandas-html-table-scraper) dan buat nama file baru bernama pandas_table_scraper.py. Mari buka terminal baru dan navigasikan ke folder yang baru saja kita buat (cd pandas-html-table-scraper) dan instal pandas dari sana: Dan kami mengimpornya ke bagian atas file. Pandas memiliki fungsi bernama read_html() yang pada dasarnya mengevaluasi URL target untuk kita dan mengembalikan semua tabel HTML sebagai daftar objek DataFrame. Namun, agar ini berfungsi, tabel HTML setidaknya harus terstruktur dengan rapi, karena fungsinya mencari elemen seperti itu |