Halaman mempunyai potensi untuk berubah secara drastis sehingga membuat scraper yang sangat "pintar" mungkin cukup sulit; dan jika memungkinkan, scrapernya tidak dapat diprediksi, bahkan dengan teknik canggih seperti pembelajaran mesin dan sebagainya. Sulit untuk membuat scraper yang dapat dipercaya dan memiliki fleksibilitas otomatis.
Pemeliharaan adalah sebuah bentuk seni yang berpusat pada bagaimana penyeleksi didefinisikan dan digunakan.
Di masa lalu saya telah menggulirkan penyeleksi "dua tahap" saya sendiri:
(temukan) Tahap pertama sangat tidak fleksibel dan memeriksa struktur halaman menuju elemen yang diinginkan. Jika tahap pertama gagal, maka akan muncul semacam kesalahan "struktur halaman berubah".
(mengambil) Tahap kedua kemudian agak fleksibel dan mengekstrak data dari elemen yang diinginkan pada halaman.
Hal ini memungkinkan scraper mengisolasi dirinya dari perubahan halaman drastis dengan tingkat deteksi otomatis tertentu, sambil tetap mempertahankan tingkat fleksibilitas yang dapat dipercaya.
Saya sering menggunakan penyeleksi xpath, dan ini sungguh mengejutkan, dengan sedikit latihan, betapa fleksibelnya Anda dengan pemilih yang baik namun tetap sangat akurat. Saya yakin penyeleksi css serupa. Ini menjadi lebih mudah jika desain halamannya semakin semantik dan "datar".
Beberapa pertanyaan penting yang harus dijawab adalah:
Apa yang Anda harapkan akan berubah pada halaman ini?
Apa yang Anda harapkan tetap sama di halaman ini?
Saat menjawab pertanyaan-pertanyaan ini, semakin akurat Anda, semakin baik pula penyeleksi Anda.
Pada akhirnya, terserah Anda seberapa besar risiko yang ingin Anda ambil, seberapa dapat dipercaya penyeleksi Anda, kapan menemukan dan mengambil data pada halaman, cara Anda menyusunnya akan membuat perbedaan besar; dan idealnya, yang terbaik adalah mendapatkan data dari web-api, yang diharapkan akan tersedia lebih banyak sumber.
EDIT: Contoh kecil
Menggunakan skenario Anda, di mana elemen yang Anda inginkan berada di .content > .deal > .tag > .price
, pemilih .content .price
umum sangat "fleksibel" mengenai perubahan halaman; tetapi jika, misalnya, muncul elemen positif palsu, kita mungkin ingin menghindari mengekstraksi elemen baru ini.
Dengan menggunakan penyeleksi dua tahap, kita dapat menentukan tahap pertama yang kurang umum dan lebih tidak fleksibel seperti .content > .deal
, dan kemudian tahap kedua yang lebih umum seperti .price
untuk mengambil elemen terakhir menggunakan kueri relatif terhadap hasil Pertama.
Jadi mengapa tidak menggunakan pemilih seperti .content > .deal .price
saja?
Untuk penggunaan saya, saya ingin dapat mendeteksi perubahan halaman yang besar tanpa menjalankan tes regresi tambahan secara terpisah. Saya menyadari bahwa daripada satu pemilih besar, saya bisa menulis tahap pertama untuk memasukkan elemen struktur halaman yang penting. Tahap pertama ini akan gagal (atau dilaporkan) jika elemen strukturalnya tidak ada lagi. Kemudian saya bisa menulis tahap kedua untuk mengambil data dengan lebih baik dibandingkan dengan hasil tahap pertama.
Saya tidak boleh mengatakan bahwa ini adalah praktik "terbaik", namun telah berhasil dengan baik.
person
David
schedule
23.01.2014