Apa cara terbaik untuk mengambil data dari situs web? [Tutup]

107

Saya perlu mengekstrak konten dari situs web, tetapi aplikasi tidak menyediakan antarmuka pemrograman aplikasi atau mekanisme lain untuk mengakses data tersebut secara terprogram.

Saya menemukan alat pihak ketiga yang berguna bernama Import.io yang menyediakan fungsionalitas klik dan buka untuk menyalin halaman web dan membangun kumpulan data, satu-satunya hal adalah saya ingin menyimpan data saya secara lokal dan saya tidak ingin berlangganan paket langganan apa pun .

Jenis teknik apa yang digunakan perusahaan ini untuk mengorek halaman web dan membangun kumpulan data mereka? Saya menemukan beberapa web scraping frameworks pjscrape & Scrapy dapatkah mereka menyediakan fitur seperti itu

0x1ad2
sumber
4
PHP tentu tidak keluar dari pertanyaan, itu jelas salah, jelas. gist.github.com/krakjoe/b1526fcc828621e840cb
Joe Watkins
@ JoeWatkins yang terlihat sangat keren, apakah perlu konfigurasi PHP khusus untuk dijalankan? Dan bagaimana performace dibandingkan dengan alat / bahasa yang disediakan di bawah ini?
0x1ad2
1
Dibutuhkan thread build yang aman dari PHP, dan pthreads, baca github.com/krakjoe/pthreads/blob/master/README.md , Anda dapat menemukan saya di chat jika Anda butuh bantuan, saya atau siapa pun :)
Joe Watkins
@ 0x1ad2 Jika Anda ingin menyimpan data secara lokal maka Anda harus mencoba perangkat lunak ( datasetcraping.co ) alih-alih API Web. Sebagian besar alat menggunakan Xpath, pemilih CSS, dan REGEX untuk mengekstrak data dari situs web dan Data Scraping Studio mendukung ketiga fitur ini.
Vikash Rathee
Ada dua cara, salah satunya adalah meluncurkan milik Anda sendiri menggunakan pustaka gratis / sumber terbuka yang membutuhkan banyak usaha. Anda benar-benar dapat membuat perayap web ajax untuk situs apa pun menggunakan scrape.it Ini adalah alat berbayar tetapi berfungsi ketika alat gratis seperti import.io atau kimono tidak dapat merender.
Saya Suka Python

Jawaban:

271

Anda pasti ingin memulai dengan kerangka web scraping yang bagus. Nanti Anda mungkin memutuskan bahwa mereka terlalu membatasi dan Anda dapat mengumpulkan tumpukan perpustakaan Anda sendiri tetapi tanpa banyak pengalaman scraping desain Anda akan jauh lebih buruk daripada pjscrape atau scrapy.

Catatan: Saya menggunakan istilah merangkak dan mengikis yang pada dasarnya dapat dipertukarkan di sini. Ini adalah salinan jawaban saya atas pertanyaan Quora Anda, cukup panjang.

Alat

Biasakan diri Anda dengan Firebug atau alat dev Chrome tergantung pada browser pilihan Anda. Ini benar-benar diperlukan saat Anda menelusuri situs tempat Anda mengambil data dan memetakan url mana yang berisi data yang Anda cari dan format data apa yang membentuk tanggapannya.

Anda akan membutuhkan pengetahuan yang baik tentang HTTP serta HTML dan mungkin ingin mencari orang yang layak di perangkat lunak proxy tengah. Anda harus dapat memeriksa permintaan dan tanggapan HTTP serta memahami bagaimana cookie dan informasi sesi serta parameter kueri disebarkan. Fiddler ( http://www.telerik.com/fiddler ) dan Charles Proxy ( http://www.charlesproxy.com/ ) adalah alat yang populer. Saya sering menggunakan mitmproxy ( http://mitmproxy.org/ ) karena saya lebih menyukai pria keyboard daripada pria mouse.

Beberapa jenis lingkungan jenis konsol / shell / REPL di mana Anda dapat mencoba berbagai potongan kode dengan umpan balik instan akan sangat berharga. Tugas rekayasa terbalik seperti ini banyak trial and error sehingga Anda akan menginginkan alur kerja yang membuatnya mudah.

Bahasa

PHP pada dasarnya sudah keluar, tidak cocok untuk tugas ini dan dukungan perpustakaan / kerangka kerja buruk di area ini. Python (Scrapy adalah titik awal yang bagus) dan Clojure / Clojurescript (sangat kuat dan produktif tetapi kurva belajarnya besar) adalah bahasa yang bagus untuk masalah ini. Karena Anda lebih suka tidak belajar bahasa baru dan Anda sudah tahu Javascript, saya pasti akan menyarankan untuk tetap menggunakan JS. Saya belum pernah menggunakan pjscrape tetapi terlihat cukup bagus dari membaca singkat dokumen mereka. Ini sangat cocok dan menerapkan solusi yang sangat baik untuk masalah yang saya jelaskan di bawah.

Catatan tentang ekspresi reguler: JANGAN GUNAKAN EKSPRESI REGULER KE PARSE HTML. Banyak pemula melakukan ini karena mereka sudah terbiasa dengan regex. Ini adalah kesalahan besar, gunakan pemilih xpath atau css untuk menavigasi html dan hanya gunakan ekspresi reguler untuk mengekstrak data dari teks sebenarnya di dalam node html. Ini mungkin sudah jelas bagi Anda, menjadi jelas dengan cepat jika Anda mencobanya tetapi banyak orang membuang banyak waktu melalui jalan ini karena suatu alasan. Jangan takut dengan pemilih xpath atau css, mereka JAUH lebih mudah dipelajari daripada regex dan mereka dirancang untuk memecahkan masalah yang tepat ini.

Situs penuh JavaScript

Di masa lalu Anda hanya perlu membuat permintaan http dan mengurai tanggapan HTML. Sekarang Anda hampir pasti harus berurusan dengan situs yang merupakan campuran dari permintaan / tanggapan HTTP HTML standar dan panggilan HTTP asinkron yang dibuat oleh bagian javascript dari situs target. Di sinilah perangkat lunak proxy Anda dan tab jaringan firebug / devtools sangat berguna. Tanggapan untuk ini mungkin html atau mungkin json, dalam kasus yang jarang terjadi mereka akan menjadi xml atau yang lainnya.

Ada dua pendekatan untuk masalah ini:

Pendekatan tingkat rendah:

Anda dapat mengetahui url ajax apa yang dipanggil oleh javascript situs dan seperti apa tanggapan tersebut dan membuat permintaan yang sama itu sendiri. Jadi, Anda dapat menarik html dari http://example.com/foobar dan mengekstrak satu bagian data dan kemudian harus menarik respons json dari http://example.com/api/baz?foo=b ... ke dapatkan bagian data lainnya. Anda harus berhati-hati dalam menyampaikan cookie atau parameter sesi yang benar. Ini sangat jarang, tetapi terkadang beberapa parameter yang diperlukan untuk panggilan ajax akan menjadi hasil dari beberapa kalkulasi gila yang dilakukan di javascript situs, rekayasa balik ini dapat mengganggu.

Pendekatan browser tersemat:

Mengapa Anda perlu mengetahui data apa yang ada di html dan data apa yang masuk dari panggilan ajax? Mengelola semua sesi dan data cookie itu? Anda tidak perlu melakukan itu saat menjelajahi situs, browser, dan situs javascript. Itulah intinya.

Jika Anda hanya memuat halaman ke mesin browser tanpa kepala seperti phantomjs, halaman akan dimuat, jalankan javascript dan beri tahu Anda saat semua panggilan ajax telah selesai. Anda dapat menyuntikkan javascript Anda sendiri jika perlu untuk memicu klik yang sesuai atau apa pun yang diperlukan untuk memicu javascript situs memuat data yang sesuai.

Anda sekarang memiliki dua opsi, dapatkan untuk mengeluarkan html yang sudah selesai dan menguraikannya atau menyuntikkan beberapa javascript ke halaman yang melakukan penguraian dan pemformatan data dan mengeluarkan data (mungkin dalam format json). Anda juga dapat dengan bebas mencampur kedua opsi ini.

Pendekatan mana yang terbaik?

Itu tergantung, Anda harus terbiasa dan nyaman dengan pendekatan tingkat rendah. Pendekatan browser yang disematkan berfungsi untuk apa saja, akan lebih mudah untuk diterapkan dan akan membuat beberapa masalah tersulit dalam pengikisan menghilang. Ini juga merupakan bagian mesin yang cukup kompleks yang perlu Anda pahami. Ini bukan hanya permintaan dan tanggapan HTTP, itu juga permintaan, rendering browser yang disematkan, javascript situs, javascript yang disuntikkan, kode Anda sendiri dan interaksi 2 arah dengan proses browser yang disematkan.

Browser yang disematkan juga jauh lebih lambat dalam skala karena overhead rendering, tetapi itu hampir pasti tidak masalah kecuali Anda mengorek banyak domain yang berbeda. Kebutuhan Anda untuk membatasi permintaan Anda akan membuat waktu rendering dapat diabaikan sepenuhnya dalam kasus satu domain.

Pembatasan Nilai / Perilaku Bot

Anda harus sangat menyadari hal ini. Anda perlu mengajukan permintaan ke domain target Anda dengan harga yang wajar. Anda perlu menulis bot yang berperilaku baik saat merayapi situs web, dan itu berarti menghormati robots.txt dan tidak memenuhi permintaan server. Kesalahan atau kelalaian di sini sangat tidak etis karena ini dapat dianggap sebagai serangan penolakan layanan. Tingkat yang dapat diterima bervariasi tergantung pada siapa yang Anda tanya, 1req / s adalah nilai maksimum yang dijalankan crawler Google tetapi Anda bukan Google dan Anda mungkin tidak disambut seperti Google. Jaga agar selambat mungkin. Saya akan menyarankan 2-5 detik antara setiap permintaan halaman.

Identifikasi permintaan Anda dengan string agen pengguna yang mengidentifikasi bot Anda dan memiliki halaman web untuk bot Anda yang menjelaskan tujuannya. Url ini masuk dalam string agen.

Anda akan mudah memblokir jika situs tersebut ingin memblokir Anda. Seorang insinyur yang cerdas di pihak mereka dapat dengan mudah mengidentifikasi bot dan beberapa menit pekerjaan di pihak mereka dapat menyebabkan berminggu-minggu bekerja mengubah kode scraping Anda di pihak Anda atau membuatnya tidak mungkin. Jika hubungannya bersifat antagonis, maka insinyur yang cerdas di situs target dapat sepenuhnya menghalangi insinyur jenius yang menulis perayap. Kode scraping secara inheren rapuh dan ini mudah dieksploitasi. Sesuatu yang akan memprovokasi respons ini hampir pasti tidak etis, jadi tulislah bot yang berperilaku baik dan jangan khawatir tentang ini.

Menguji

Bukan seorang penguji unit / integrasi? Sangat buruk. Anda sekarang harus menjadi satu. Situs sering berubah dan Anda akan sering mengubah kode Anda. Ini adalah sebagian besar tantangannya.

Ada banyak bagian bergerak yang terlibat dalam scraping situs web modern, praktik pengujian yang baik akan sangat membantu. Banyak bug yang akan Anda temui saat menulis kode jenis ini adalah jenis yang hanya mengembalikan data yang rusak secara diam-diam. Tanpa tes yang baik untuk memeriksa regresi, Anda akan mengetahui bahwa Anda telah menyimpan data rusak yang tidak berguna ke database Anda untuk sementara waktu tanpa menyadarinya. Proyek ini akan membuat Anda sangat terbiasa dengan validasi data (temukan beberapa pustaka yang bagus untuk digunakan) dan pengujian. Tidak banyak masalah lain yang menggabungkan membutuhkan tes komprehensif dan menjadi sangat sulit untuk diuji.

Bagian kedua dari pengujian Anda melibatkan deteksi cache dan perubahan. Saat menulis kode Anda, Anda tidak ingin memalu server untuk halaman yang sama berulang kali tanpa alasan. Saat menjalankan pengujian unit, Anda ingin mengetahui apakah pengujian Anda gagal karena Anda memecahkan kode Anda atau karena situs web telah didesain ulang. Jalankan pengujian unit Anda terhadap salinan cache dari url yang terlibat. Proksi caching sangat berguna di sini tetapi sulit untuk dikonfigurasi dan digunakan dengan benar.

Anda juga ingin tahu apakah situs tersebut telah berubah. Jika mereka mendesain ulang situs dan perayap Anda rusak, pengujian unit Anda akan tetap lulus karena mereka menjalankan salinan yang disimpan dalam cache! Anda akan memerlukan rangkaian pengujian integrasi lain yang lebih kecil yang jarang dijalankan terhadap situs aktif atau pendeteksian yang baik dan deteksi kesalahan dalam kode perayapan Anda yang mencatat masalah yang sebenarnya, memperingatkan Anda tentang masalah tersebut dan menghentikan perayapan. Sekarang Anda dapat memperbarui cache Anda, menjalankan pengujian unit Anda dan melihat apa yang perlu Anda ubah.

Masalah hukum

Hukum di sini bisa sedikit berbahaya jika Anda melakukan hal-hal bodoh. Jika hukum terlibat, Anda berurusan dengan orang-orang yang secara teratur menyebut wget dan curl sebagai "alat hacking". Anda tidak menginginkan ini.

Realitas etis dari situasi tersebut adalah bahwa tidak ada perbedaan antara menggunakan perangkat lunak browser untuk meminta url dan melihat beberapa data dan menggunakan perangkat lunak Anda sendiri untuk meminta url dan melihat beberapa data. Google adalah perusahaan scraping terbesar di dunia dan mereka dicintai karenanya. Mengidentifikasi nama bot Anda di agen pengguna dan bersikap terbuka tentang tujuan dan maksud perayap web Anda akan membantu di sini karena hukum memahami apa itu Google. Jika Anda melakukan sesuatu yang teduh, seperti membuat akun pengguna palsu atau mengakses area situs yang tidak seharusnya Anda (baik "diblokir" oleh robots.txt atau karena semacam eksploitasi otorisasi), ketahuilah bahwa Anda melakukan sesuatu yang tidak etis dan ketidaktahuan hukum tentang teknologi akan sangat berbahaya di sini. Ini situasi yang konyol tapi ini nyata.

Sangat mungkin untuk mencoba dan membangun mesin pencari baru di atas dan atas sebagai warga negara yang terhormat, membuat kesalahan atau memiliki bug di perangkat lunak Anda dan dianggap sebagai peretas. Bukan sesuatu yang Anda inginkan mengingat realitas politik saat ini.

Siapakah saya yang menulis dinding teks raksasa ini?

Saya telah menulis banyak kode terkait perayapan web dalam hidup saya. Saya telah melakukan pengembangan perangkat lunak terkait web selama lebih dari satu dekade sebagai konsultan, karyawan, dan pendiri startup. Hari-hari awal menulis perl crawler / scrapers dan situs php. Saat kami menyematkan iframe tersembunyi yang memuat data csv ke halaman web untuk melakukan ajax sebelum Jesse James Garrett menamakannya ajax, sebelum XMLHTTPRequest adalah sebuah ide. Sebelum jQuery, sebelum json. Saya berusia pertengahan 30-an, itu tampaknya dianggap kuno untuk bisnis ini.

Saya telah menulis sistem perayapan / pengikisan skala besar dua kali, sekali untuk tim besar di perusahaan media (di Perl) dan baru-baru ini untuk tim kecil sebagai CTO dari mesin pencari startup (dengan Python / Javascript). Saat ini saya bekerja sebagai konsultan, kebanyakan membuat kode dalam Clojure / Clojurescript (bahasa ahli yang luar biasa secara umum dan memiliki perpustakaan yang membuat masalah perayap / pengikis menjadi menyenangkan)

Saya juga telah menulis sistem perangkat lunak anti-perayapan yang berhasil. Sangat mudah untuk menulis situs yang hampir tak tergores jika Anda ingin atau untuk mengidentifikasi dan menyabot bot yang tidak Anda sukai.

Saya suka menulis crawler, scrapers, dan parser lebih dari jenis perangkat lunak lainnya. Ini menantang, menyenangkan, dan dapat digunakan untuk membuat hal-hal menakjubkan.

Jesse Sherlock
sumber
4
Saya dulu setuju dengan Anda tentang PHP sebagai pilihan yang buruk, tetapi dengan perpustakaan yang tepat itu tidak terlalu buruk. Regex dan manipulasi array / sengatan kikuk tetapi di sisi positifnya cepat dan di mana-mana.
pguardiario
3
Dalam lingkungan di mana ada beberapa perpustakaan yang membuat ini menyenangkan dan banyak yang membuatnya cukup sederhana dan cukup mudah ... mengapa Anda puas dengan "tidak terlalu buruk". Saya setuju, ini bisa dilakukan di PHP (dan FORTRAN, C, VB, dll.) Tetapi kecuali masalah Anda benar-benar sederhana maka akan menjadi ide yang jauh lebih baik untuk menggunakan alat yang tepat untuk pekerjaan itu. Dan lagi, kecuali jika Anda memiliki masalah yang sangat sederhana untuk dipecahkan ... apa pentingnya regex ada di mana-mana? Memasang perpustakaan jauh lebih sederhana daripada hampir semua masalah pengikisan. Dan sebenarnya, regex seringkali cukup lambat untuk masalah ini.
Jesse Sherlock
5
Anda mungkin benar, tetapi saya tahu pasti bahwa saya tidak dapat melakukannya dengan mudah di PHP. Sebelum saya pindah dari PHP, saya memiliki pengalaman PHP profesional hampir satu dekade. Saya menghabiskan lebih dari satu tahun penuh waktu membangun sistem scraping dalam skala besar, dengan Python, dan saya tidak dapat membayangkan melakukannya tanpa beberapa perpustakaan bagus yang tidak tersedia di PHP atau melakukannya tanpa teknik meta-pemrograman ringkas yang tersedia di Python . Itu juga alasan saya pindah ke Clojure, untuk mendapatkan kemampuan meta-pemrograman yang lebih hebat.
Jesse Sherlock
4
Enlive, bersama dengan kekuatan Clojure itu sendiri untuk kode spesifik proyek, adalah pemenang terbesar. Skema adalah pustaka validasi yang hebat, yang merupakan bagian besar dari kode ekstraksi informasi. Saat ini saya sangat senang dengan interop mudah dengan dunia Java untuk hal-hal seperti Mahout serta Nashorn / Rhino untuk beberapa jenis eksekusi js. Dan orang Clojure adalah tipe orang yang menulis libs seperti ini github.com/shriphani/subotai sehingga Anda tidak perlu melakukannya. ... dilanjutkan di komentar berikutnya ...
Jesse Sherlock
3
Saya juga menemukan bahwa ketika Anda benar-benar membutuhkan browser nyata dan perlu menggunakan phantomjs / casperjs, sangat bagus menggunakan clojurescript (sering kali kode dibagikan antara clj dan cljs menggunakan cljx) untuk menulis js yang Anda masukkan ke halaman alih-alih clojurescript . Core.async sangat bagus untuk mengoordinasikan kode perayapan yang sangat bersamaan di server serta keluar dari neraka panggilan balik di dalam lingkungan js (mengoordinasikan otomatisasi browser dengan kode cljs core.async di dalam phantomjs adalah surga dibandingkan dengan alternatif lainnya).
Jesse Sherlock
21

Ya, Anda bisa melakukannya sendiri. Ini hanya masalah mengambil sumber halaman dan menguraikannya seperti yang Anda inginkan.

Ada berbagai kemungkinan. Kombo yang baik adalah menggunakan permintaan-python (dibangun di atas urllib2, itu urllib.requestdi Python3) dan BeautifulSoup4 , yang memiliki metode untuk memilih elemen dan juga mengizinkan pemilih CSS :

import requests
from BeautifulSoup4 import BeautifulSoup as bs
request = requests.get("http://foo.bar")
soup = bs(request.text) 
some_elements = soup.find_all("div", class_="myCssClass")

Beberapa akan lebih suka parsing xpath atau pyquery seperti jquery, lxml atau yang lainnya .

Saat data yang Anda inginkan dihasilkan oleh beberapa JavaScript , hal di atas tidak akan berfungsi. Anda juga membutuhkan python-ghost atau Selenium. Saya lebih suka yang terakhir dikombinasikan dengan PhantomJS , jauh lebih ringan dan lebih sederhana untuk diinstal, dan mudah digunakan:

from selenium import webdriver
client = webdriver.PhantomJS()
client.get("http://foo")
soup = bs(client.page_source)

Saya akan menyarankan untuk memulai solusi Anda sendiri. Anda akan memahami manfaat Scrapy dengan melakukan itu.

ps: lihat sekilas: https://github.com/scrapy/scrapely

pps: lihat Portia, untuk mulai mengekstrak informasi secara visual, tanpa pengetahuan pemrograman: https://github.com/scrapinghub/portia

Ehvince
sumber
Baiklah terima kasih untuk jawabannya, satu-satunya masalah adalah Python tidak ada dalam keahlian saya. Apakah ada bahasa pemrograman bagus lainnya yang dapat melakukan tugas yang sama? Saya terutama bekerja dengan PHP dan Javascript.
0x1ad2
Maaf atas kebingungannya (saya menyebutkan kerangka Python dalam pertanyaan saya), tetapi jika Python adalah cara terbaik untuk melakukannya, saya bisa mempelajarinya.
0x1ad2
Python membuat scrapy sangat mudah. Itu juga mudah dipelajari. Scraper terbaik yang berkinerja baik saat ini adalah scrapy. Mereka juga memiliki dokumentasi yang sangat bagus.
Abhishek