Baru-baru ini saya telah belajar bahwa menggunakan regex untuk mem-parsing HTML situs web untuk mendapatkan data yang Anda butuhkan bukanlah tindakan terbaik.
Jadi pertanyaan saya sederhana: Lalu, apakah cara terbaik / paling efisien dan umumnya stabil untuk mendapatkan data ini?
Saya harus mencatat bahwa:
- Tidak ada API
- Tidak ada sumber lain di mana saya bisa mendapatkan data (tidak ada database, feed, dan semacamnya)
- Tidak ada akses ke file sumber. (Data dari situs web publik)
- Katakanlah data adalah teks normal, ditampilkan dalam tabel di halaman html
Saat ini saya menggunakan python untuk proyek saya tetapi solusi / tips yang independen bahasa akan menyenangkan.
Sebagai pertanyaan sampingan: Bagaimana Anda melakukannya ketika halaman web dibangun oleh panggilan Ajax?
EDIT:
Dalam hal penguraian HTML, saya tahu bahwa sebenarnya tidak ada cara stabil untuk mendapatkan data. Segera setelah halaman berubah, parser Anda selesai. Yang saya maksud dengan stabil dalam hal ini adalah: cara yang efisien untuk mengurai halaman, yang selalu memberi saya hasil yang sama (untuk set data yang sama jelas) asalkan halaman tidak berubah.
Jawaban:
Nah, ini 2 sen saya:
Jika tidak ada AJAX yang terlibat, atau dapat dihapus dengan mudah, 'perbaiki' HTML ke XHTML (menggunakan HTMLTidy misalnya), kemudian gunakan XPath alih-alih ekspresi reguler untuk mengekstrak informasi.
Di halaman web yang terstruktur dengan baik, entitas informasi yang dipisahkan secara logis berada di
<div>
s yang berbeda , atau tag lain apa pun, yang berarti Anda akan dapat dengan mudah menemukan informasi yang tepat dengan ekspresi XPath sederhana. Ini bagus juga karena Anda dapat mengujinya di, katakanlah, konsol Chrome, atau konsol pengembang Firefox dan verifikasi berfungsi sebelum menulis bahkan satu baris kode lain.Pendekatan ini juga memiliki rasio signal-to-noise yang sangat tinggi, karena biasanya ekspresi untuk memilih informasi yang relevan adalah one-liners. Mereka juga lebih mudah dibaca daripada ekspresi reguler dan dirancang untuk tujuan itu.
Jika ada AJAX dan JavaScript-ing serius terlibat dalam halaman, embed komponen browser dalam aplikasi dan gunakan DOM untuk memicu peristiwa yang Anda butuhkan, dan XPath untuk mengekstrak informasi. Ada banyak komponen peramban yang dapat disematkan di luar sana, yang sebagian besar menggunakan peramban dunia nyata di bawah kap, yang merupakan hal yang baik, karena laman web mungkin salah (X) HTML, tetapi masih membuat peramban bagus di semua peramban utama ( sebenarnya, sebagian besar halaman akhirnya mendapatkan cara ini).
sumber
Dalam pengalaman saya, menggunakan lingkungan .NET, Anda dapat memanfaatkan HTML Agility Pack .
Jika halaman diformat sebagai XHTML Anda juga dapat menggunakan parser XML biasa. Ada banyak di luar sana untuk lingkungan apa pun yang dapat Anda bayangkan.
Untuk pertanyaan sampingan tentang AJAX, Anda dapat menggunakan kode jaringan HTTP biasa untuk mendapatkan data dan menguraikannya.
Sekali lagi jika tumpukan AJAX Anda mengembalikan XML, Anda akan mendapat banyak pilihan. Jika mengembalikan JSON, pertimbangkan pustaka yang memungkinkan Anda untuk memetakan aliran ke objek yang diketik. Dalam .NET saya sarankan Anda Newtonsoft.Json .
sumber
Parsing HTML bukanlah tugas sepele, karena kita harus berurusan dengan markup yang mungkin salah (tag soup). Selama bertahun-tahun, browser telah menerapkan strategi yang kurang lebih sama untuk mengatasi kesalahan, dan algoritma itu telah dibaptis dalam spesifikasi HTML5 (ya, spesifikasi HTML5 menentukan apa yang harus dilakukan dengan hal-hal yang bukan HTML5).
Pustaka adalah untuk semua bahasa utama untuk mem-parsing HTML, misalnya yang ini .
Bagaimanapun, apa yang akan Anda dapatkan tidak stabil dalam arti apa pun. Setiap kali format halaman web berubah, Anda harus menyesuaikan scraper Anda.
sumber
Jika panggilan ajax sedang dilakukan, maka sangat mungkin ada beberapa POST atau GET url dengan beberapa variabel.
Saya akan memeriksa JavaScript untuk mencari tahu apa titik akhir dan parameternya. Setelah itu sangat mungkin bahwa data yang dikembalikan adalah json / xml / teks biasa atau mungkin sebagian html.
Setelah Anda mengetahui informasi di atas, Anda cukup membuat permintaan GET atau POST ke titik akhir itu, dan mengurai data yang dikembalikan.
sumber
HTTP_X_REQUESTED_WITH
adalahXMLHttpRequest
. Yang bagus juga akan menerapkan semacam perlindungan XSRF untuk permintaan POST, jadi Anda akan memerlukan cookie ajaib itu juga. Menggelitik titik akhir AJAX yang tidak sengaja diekspos oleh beberapa API publik terasa agak menjengkelkan bagi saya, dan pengikis Anda juga rentan terhadap kerusakan jika output (atau kebijakan permintaan) berubah.Tidak ada cara yang stabil atau lebih baik untuk melakukan ini, halaman web HTML tidak dibuat untuk dimanipulasi oleh komputer. Ini untuk pengguna manusia, tetapi jika Anda perlu melakukannya saya sarankan yang akan menggunakan browser dan beberapa javascript. Di pekerjaan saya, saya terlibat dengan proyek yang perlu mengekstrak beberapa informasi dari situs pihak ketiga. Aplikasi ini dikembangkan sebagai ekstensi Chrome. Logika aplikasi ditulis menggunakan javascript yang disuntikkan di situs setelah pemuatan Halaman selesai. Data yang diekstraksi dikirim ke database melalui server http. Ini bukan pendekatan terbaik, tetapi berhasil. P: Pemilik situs telah memberi kami wewenang untuk melakukan hal itu.
sumber