Mendapatkan data dari halaman web dengan cara yang stabil dan efisien

11

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.

Mike
sumber
8
Tidak ada cara yang stabil, tidak peduli bagaimana Anda menerapkan memo Anda, ia dapat dengan mudah dipecah dengan perubahan sederhana pada halaman web. Cara istal untuk mendapatkan data Anda adalah dengan menghubungi penulis data dan menengahi kesepakatan bagi Anda untuk mendapatkan data dalam format yang waras. Kadang-kadang itu bahkan tidak memerlukan biaya.
Joachim Sauer
1
@ JoachimSauer - Pertanyaan masih bisa dijawab dengan metode 'terbaik'.
Anonim
Karena sebagian besar situs web bersifat dinamis dan menyimpan datanya dalam basis data, cara terbaik adalah mendapatkan basis data dari situs web tersebut. Jika situs web memiliki API, Anda dapat menggunakannya. Jika Anda ingin mengikis halaman statis, maka modul Python urllib dan HTMLParser terpasang dengan baik. Beberapa paket untuk memo HTML juga tersedia di PyPi.
Ubermensch
Pengikisan situs adalah bisnis skeezy. Sebenarnya tidak ada cara yang stabil untuk melakukan ini karena pemilik situs tidak menginginkan Anda, dan industri secara keseluruhan berusaha menghentikan orang untuk melakukannya.
Steven Evers
1
Mungkin menanamkan browser web seperti Webkit dan kemudian menggunakan skrip DOM untuk mendapatkan informasi dari halaman yang diberikan? Hampir setiap platform dapat melakukan itu, tetapi inilah cara Anda melakukannya di Qt: doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
user16764

Jawaban:

2

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

K.Steff
sumber
Terima kasih, saya pasti akan melihat XPath lagi. Saya tidak terbiasa bekerja dengannya, jadi itu hal yang baik untuk dipelajari. +1 :)
Mike
5

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 .

gsscoder
sumber
Dan dengan 'kode jaringan HTTP' maksud Anda menangkap respons server saat permintaan dibuat? Terima kasih atas sarannya, saya pasti akan melihatnya. +1
Mike
Persis. Dalam. NET Anda dapat menggunakan System.Net.WebClient atau perpustakaan seperti RestSharp | restsharp.org . Saya sudah menggunakannya juga pada Mono untuk Droid.
gsscoder
4

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.

Andrea
sumber
Terima kasih, saya telah menggunakan Beautiful Soup untuk menyelesaikan pekerjaan. Saya tahu ini tidak akan stabil, saya mungkin harus menjelaskannya dalam pertanyaan saya. +1 untuk Anda :)
Mike
4

Sebagai pertanyaan sampingan: Bagaimana Anda melakukannya ketika halaman web dibangun oleh panggilan Ajax?

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.

Malam gelap
sumber
2
Perlu dicatat bahwa banyak layanan memeriksa HTTP header untuk memastikan HTTP_X_REQUESTED_WITHadalah XMLHttpRequest. 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.
Tim Post
@TimPost Anda 100% benar. Saya setuju dengan "icky" :) tetapi dengan tidak adanya API publik, kebutuhan harus ..
Darknight
Saya bisa menggunakan ini pada aplikasi AJAX saya sendiri (dan dengan 'sendiri' saya tidak bermaksud saya menulisnya tetapi setup adalah milik saya) tetapi rasanya tidak benar untuk mencoba dan mem-bypass sistem server lain jadi saya harus setuju dengan @ TimPost, rasanya agak 'menjijikkan'. Namun itu ide yang bagus, terima kasih! +1!
Mike
1

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.

nohro
sumber
Saya tahu bahwa halaman HTML tidak seharusnya diuraikan oleh komputer tetapi terkadang tidak ada pilihan lain. Juga, saya menggunakan informasi yang tersedia untuk umum untuk proyek pribadi yang tidak komersial dengan cara apa pun, saya rasa saya tidak perlu otorisasi eksplisit, bukan? Terima kasih atas masukan Anda! +1 untuk Anda juga;)
Mike
@MikeHeremans Untuk mengetahui apakah Anda berwenang untuk mendapatkan informasi dari situs web, baca ToS dan robots.txt. Jika keduanya tidak menolak hak Anda untuk mengikis informasi secara otomatis, Anda mungkin akan baik-baik saja dalam kebanyakan kasus secara hukum. Tentu saja, IANAL ...
K.Steff
Jika Anda ingin melihat kode proyek yang disebutkan: code.google.com/p/acao-toolkit/source/browse/… . Periksa content_script.js, itu adalah kode yang disuntikkan pada halaman.
nohros