Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Ruby
Code

Membuat Web Scraper Pertama Anda, Bagian 1

by
Length:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Muhammad Gufron (you can also view the original English article)

Rubyland memiliki dua permata yang telah menduduki sorotan web scraping selama beberapa tahun terakhir: Nokogiri dan Mekanize. Kita menghabiskan artikel pada masing-masing sebelum kita menempatkan mereka ke dalam tindakan dengan contoh praktis.

Topik

  • Web Scraping?
  • Permission
  • Masalah
  • Nokogiri
  • Ekstraksi?
  • Halaman
  • API
  • Node Navigation

Web Scraping?

Ada istilah yang lebih bagus di sekitar daripada web atau screen scraping. Web harvesting dan web data extraction cukup banyak memberitahu Anda segera apa yang terjadi. We dapat mengotomatisasi ekstraksi data dari halaman web — dan tidak yang rumit juga.

Dengan cara, alat-alat ini memungkinkan Anda untuk meniru dan mengotomatisasi browsing web manusia. Anda menulis sebuah program yang hanya ekstrak jenis data yang menarik bagi Anda. Penargetan data tertentu hampir semudah dengan menggunakan CSS selector.

Beberapa tahun lalu saya berlangganan beberapa kursus video online yang punya seperti satu juta video pendek tapi tidak ada pilihan untuk men-download dalam jumlah besar. Saya harus melalui setiap tautan saya sendiri dan melakukan hal yang ditakuti ‘save as’ sendiri. Itu adalah semacam manusia web scraping — sesuatu yang kita sering perlu lakukan ketika kita kekurangan pengetahuan untuk mengotomatisasi hal semacam itu. Kursus itu sendiri baik-baik saja, tetapi saya tidak menggunakan layanan mereka lagi setelah itu. Itu terlalu membosankan.

Hari ini, aku tidak peduli terlalu banyak tentang seperti mind-melting UX. Scraper yang akan melakukan download untuk saya saya akan mengambil hanya beberapa menit untuk melemparkan bersama-sama. Tidak ada masalah besar!

Biarkan saya memecahnya dengan cepat sebelum kita mulai. Semuanya dapat diringkas menjadi beberapa langkah. Pertama kita mengambil halaman web yang memiliki data yang diinginkan yang kita butuhkan. Kemudian kita mencari melalui halaman tersebut dan mengidentifikasi informasi yang kami inginkan untuk mengekstrak.

Langkah terakhir adalah untuk menargetkan bit ini, iris mereka jika diperlukan, dan putuskan bagaimana dan di mana Anda ingin menyimpannya. HTML yang ditulis dengan baik sering kali menjadi kunci untuk membuat proses ini mudah dan menyenangkan. Untuk ekstraksi yang lebih terlibat, itu bisa menjadi sakit jika Anda harus berurusan dengan markup yang tidak terstruktur dengan baik.

Bagaimana dengan API? Pertanyaan yang sangat bagus. Jika Anda memiliki akses ke layanan dengan API, sering ada sedikit kebutuhan untuk menulis scraper Anda sendiri. Pendekatan ini adalah sebagian besar untuk situs web yang tidak menawarkan semacam kenyamanan. Tanpa API, hal ini sering satu-satunya cara untuk mengotomatisasi proses ekstraksi informasi dari situs web.

Anda mungkin bertanya, bagaimana scraping benar-benar bekerja? Tanpa melompat ke ujung yang dalam, jawaban pendek adalah, dengan melintasi pohon struktur data. Nokogiri membangun struktur data ini dari dokumen-dokumen Anda memberinya makan dan memungkinkan Anda menargetkan bit menarik untuk ekstraksi. Misalnya, CSS adalah bahasa yang ditulis untuk pohon traversal, untuk mencari pohon struktur data, dan kita dapat menggunakannya untuk ekstraksi data.

Ada banyak pendekatan dan solusi di luar sana untuk dimainkan. Rubyland memiliki dua permata yang telah menduduki sorotan selama beberapa tahun sekarang. Banyak orang masih bergantung pada Nokogiri dan Mechanize untuk kebutuhan HTML scraping. Keduanya telah diuji dan membuktikan dirinya sebagai mudah digunakan sementara menjadi sangat mampu. Kita akan melihat keduanya. Namun sebelum itu, saya ingin meluangkan waktu untuk mengatasi masalah yang akan kami pecahkan di akhir seri pengantar singkat ini.

Permision

Sebelum Anda mulai scraping pergi, pastikan Anda memiliki izin dari situs yang Anda mencoba untuk mengakses data ekstraksi. Jika situs memiliki API atau RSS feed, misalnya, mungkin tidak hanya lebih mudah untuk mendapatkan konten yang diinginkan, itu juga mungkin menjadi pilihan legal.

Tidak semua orang akan menghargai jika Anda melakukan scraping besar-besaran di situs mereka — dimengerti. Mendapatkan diri Anda yang berpendidikan pada situs tertentu Anda tertarik, dan tidak mendapatkan diri Anda dalam kesulitan. Kemungkinan rendah bahwa Anda akan menimbulkan kerusakan serius, tapi mempertaruhkan masalah tanpa sadar tidak cara untuk pergi.

Masalah

Aku perlu untuk membangun podcast baru. Desain itu tidak mana saya ingin menjadi, dan aku benci cara penerbitan posting baru. WYSIWYGs sialan! Sedikit dari konteks. Sekitar dua tahun yang lalu, aku membangun versi pertama dari podcast. Idenya adalah untuk bermain dengan Sinatra dan membangun sesuatu yang super ringan. Aku berlari ke dalam beberapa masalah yang tak terduga sejak aku tailor-made pretty much semua.

Datang dari rel, itu pasti perjalanan pendidikan yang saya menghargai, tapi dengan cepat menyesal tidak digunakan situs statis yang saya bisa digunakan melalui GitHub melalui GitHub pages. Mendeploy episode baru dan mempertahankannya tidak memiliki kesederhanaan yang saya cari. Untuk sementara, saya memutuskan bahwa saya punya ikan yang lebih besar untuk menggoreng dan terfokus pada menghasilkan bahan podcast baru sebagai gantinya.

Ini musim panas lalu saya mulai mendapatkan serius dan bekerja di situs perantara yang di-host melalui halaman GitHub. Untuk musim dua acara, aku ingin sesuatu yang segar.  Desain baru yang disederhanakan, Penurunan harga untuk memublikasikan episode baru, dan tidak ada perkelahian dengan Heroku — surga! Masalahnya adalah bahwa saya memiliki 139 episode yang tergeletak di sekitar yang diperlukan untuk diimpor dan dikonversi pertama untuk bekerja dengan perantara.

Untuk posting, perantara menggunakan file .markdown yang telah disebut frontmatter untuk data — yang menggantikan database saya pada dasarnya. Melakukan transfer ini dengan tangan bukanlah suatu pilihan untuk episode 139. Itulah gunanya perhitungan. Saya perlu mencari cara untuk menguraikan HTML situs web lama saya, mengikis konten yang relevan, dan mentransfernya ke posting blog yang saya gunakan untuk menerbitkan episode podcast baru di perantara.

Oleh karena itu, selama tiga artikel berikutnya, saya akan memperkenalkan Anda ke alat yang biasa digunakan di Rubyland untuk tugas-tugas tersebut.  Pada akhirnya, kami akan membahas solusi saya untuk menunjukkan kepada Anda sesuatu yang praktis juga.

Nokogiri

Bahkan jika Anda benar-benar baru Ruby Rails, kemungkinan baik bahwa Anda telah mendengar tentang permata kecil ini. Nama dijatuhkan sering dan tongkat dengan Anda dengan mudah. Saya tidak yakin banyak yang tahu bahwa nokogiri adalah bahasa Jepang untuk “melihat”.

Ini adalah nama yang pas setelah Anda memahami apa yang dilakukan alat tersebut.  Pencipta permata ini adalah Tenderlove yang cantik, Aaron Patterson. Nokogiri mengkonversi dokumen XML dan HTML ke dalam struktur data — struktur data pohon, menjadi lebih tepat. Alat cepat dan menawarkan antarmuka yang bagus juga. Secara keseluruhan, ini adalah pustaka yang sangat kuat yang menangani banyak kebutuhan scraping HTML Anda.

Anda dapat menggunakan Nokogiri tidak hanya untuk menguraikan HTML; XML adalah game yang adil juga. Ini memberi Anda pilihan dari bahasa jalur XML dan antarmuka CSS untuk melintasi dokumen yang Anda muat. Bahasa Path XML, atau XPath untuk pendek, adalah bahasa kueri.

Hal ini memungkinkan kita untuk pilih node dari dokumen-dokumen XML. CSS selector adalah kemungkinan lebih akrab untuk pemula. Seperti halnya gaya yang Anda tulis, pemilih CSS membuatnya sangat mudah untuk menargetkan bagian tertentu dari halaman yang menarik untuk ekstraksi. Anda hanya perlu membiarkan Nokogiri tahu apa yang Anda cari ketika Anda menargetkan tujuan tertentu.

Halaman

Yang harus selalu kita mulai adalah mengambil halaman yang sebenarnya kita minati. Kita menentukan apa jenis dokumen Nokogiri kita ingin parse — XML atau HTML untuk contoh:

some_scraper.rb

Nokogiri:XML dan Nokogiri:HTML dapat mengambil objek IO atau objek String. Apa yang terjadi di atas sederhana. Ini membuka dan mengambil Ruangan Khusus halaman menggunakan open-uri dan kemudian beban strukturnya, XML atau HTML ke dokumen Nokogiri baru. XML bukanlah sesuatu yang harus dihadapi pemula dengan sangat sering.

Oleh karena itu, saya akan merekomendasikan bahwa kita fokus pada parsing HTML untuk saat ini. Mengapa open-uri? Modul ini dari Perpustakaan Standar Ruby memungkinkan kami mengambil situs tanpa banyak keributan. Karena IO objek permainan yang adil, kita dapat membuat mudah penggunaan open-uri.

API

Mari praktikkan ini dengan contoh mini:

at_css

some_podcast_scraper.rb

Apa yang kami lakukan di sini mewakili semua langkah yang biasanya terlibat dengan web scraping — hanya pada tingkat mikro. Kami memutuskan URL mana yang kami butuhkan dan situs mana yang perlu kami ambil, dan kami memuatnya ke dokumen Nokogiri yang baru. Lalu kami membuka halaman itu dan menargetkan bagian tertentu.

Di sini saya hanya ingin tahu judul episode terbaru. Menggunakan metode at_css dan pemilih CSS untuk h2.post-title adalah yang saya perlukan untuk menargetkan titik ekstraksi. Dengan metode ini kami hanya akan mengikis elemen tunggal ini, meskipun. Ini memberi kita seluruh pemilih - yang sebagian besar waktu bukan apa yang kita butuhkan. Oleh karena itu kami hanya mengekstrak bagian teks bagian dalam dari node ini melalui metode teks. Sebagai perbandingan, Anda dapat memeriksa output untuk header dan teks di bawah ini.

Output

Meskipun contoh ini memiliki aplikasi yang sangat terbatas, ia memiliki semua bahan, semua langkah yang perlu Anda pahami. Saya pikir itu keren betapa sederhananya hal ini. Karena mungkin tidak jelas dari contoh ini, saya ingin menunjukkan seberapa kuat alat ini. Mari kita lihat apa lagi yang bisa kita lakukan dengan skrip Nokogiri.

Perhatian!

Jika Anda seorang pemula dan tidak yakin bagaimana menargetkan HTML yang diperlukan untuk ini, saya sarankan Anda mencari online untuk mencari tahu cara memeriksa isi situs web di browser Anda. Pada dasarnya, semua browser utama membuat proses ini sangat mudah akhir-akhir ini.

Di Chrome Anda hanya perlu klik kanan pada sebuah elemen dalam situs web dan memilih inspect option. Ini akan membuka jendela kecil di bagian bawah browser Anda yang menunjukkan kepada Anda sesuatu seperti x-ray dari situs DOM. Ini memiliki lebih banyak pilihan, dan saya akan merekomendasikan menghabiskan beberapa waktu di Google untuk mendidik diri sendiri. Ini adalah waktu yang dihabiskan dengan bijaksana!

CSS

Metode css akan memberi kita tidak hanya satu elemen pilihan tetapi setiap elemen yang cocok dengan kriteria pencarian pada halaman. Cukup rapi dan mudah!

some_scraper.rb

Output

Satu-satunya sedikit perbedaan dalam hal ini contoh adalah bahwa saya iterate pada header mentah yang pertama. Saya juga mengekstrak teks bagian dalamnya dengan metode teks. Nokogiri berhenti secara otomatis di bagian akhir halaman dan tidak mencoba mengikuti paginasi di mana saja secara otomatis.

Katakanlah kita ingin memiliki lebih banyak informasi, katakan tanggal dan subtitle untuk setiap episode. Kami hanya dapat memperluas contoh di atas. Ini adalah ide yang baik pula untuk mengambil langkah demi langkah ini. Dapatkan sedikit karya dan tambahkan lebih banyak kerumitan di sepanjang jalan.

some_scraper.rb

Output

Pada titik ini, kita sudah memiliki beberapa data untuk dimainkan. Kita dapat menyusun atau memotongnya sesuka kita. Hal di atas seharusnya hanya menunjukkan apa yang kita miliki dengan cara yang mudah dibaca. Tentu saja kita dapat menggali masing-masing dengan menggunakan regular expressions dengan metode teks.

Kami akan melihat ini secara lebih detail ketika kami dapat memecahkan masalah podcast yang sebenarnya. Ini tidak akan menjadi kelas pada regexp, tetapi Anda akan melihat lebih banyak dari itu dalam tindakan — tetapi jangan khawatir, jangan sampai membuat otak Anda berdarah.

Atribut

Apa yang bisa menjadi berguna pada tahap ini adalah penggalian href untuk episode individu juga. Itu tidak bisa lebih sederhana.

some_scraper.rb

Bit yang paling penting untuk diperhatikan di sini adalah [: href] dan podcast_url. Jika Anda memberi tag pada [:] Anda cukup mengekstrak atribut dari pemilih yang ditargetkan. Saya sedikit lebih abstrak, tetapi Anda dapat melihat lebih jelas bagaimana cara kerjanya di bawah ini.

Untuk mendapatkan URL yang lengkap dan berguna, saya menyimpan domain root dalam sebuah variabel dan membuat URL lengkap untuk setiap episode.

Mari kita lihat dengan cepat hasilnya:

Output

Rapi, bukan? Anda dapat melakukan hal yang sama untuk mengekstrak [:class] dari pemilih.

Jika simpul itu memiliki lebih dari satu kelas, Anda akan mendapatkan daftar semuanya.

Node Navigation

  • parent
  • children
  • previous_sibling
  • next_sibling

Kita terbiasa menangani struktur pohon di CSS atau bahkan jQuery. Akan sangat merepotkan jika Nokogiri tidak menawarkan API yang berguna untuk bergerak di dalam pohon seperti itu.

some_scraper.rb

Output

Seperti yang dapat Anda lihat sendiri, ini adalah beberapa hal yang sangat kuat — terutama ketika Anda melihat apa yang bisa dilakukan oleh .parent. Alih-alih mendefinisikan sekelompok simpul dengan tangan, Anda bisa mengumpulkannya secara grosir.

Anda bahkan dapat mengikat mereka untuk dilalui lebih banyak lagi. Anda dapat menganggap ini serumit yang Anda suka, tentu saja, tetapi saya akan mengingatkan Anda untuk membuat semuanya tetap sederhana. Ini dapat dengan cepat menjadi sedikit sulit dan sulit dimengerti. Ingat, 'Keep it simple, stupid!'

some_scraper.rb

Output

Pemikiran Akhir

Nokogiri bukanlah sebuah perpustakaan besar, tetapi memiliki banyak untuk menawarkan. Saya sarankan Anda bermain dengan apa yang telah Anda pelajari sejauh ini dan perluas pengetahuan Anda melalui dokumentasi ketika Anda mendapat stack. Tapi jangan membuat masalah!

Pengantar kecil ini akan membantu Anda memahami apa yang dapat Anda lakukan dan bagaimana cara kerjanya. Saya harap Anda akan menjelajahinya sedikit lebih sendiri dan bersenang-senang dengannya. Seperti yang Anda akan temukan sendiri, itu adalah alat yang kaya yang terus memberi.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.