Ide Dasar
Asal: Master: Mulai dari kategori Wikipedia tertentu (seperti halaman kapal induk (kunci), cari tahu semua target yang berisi kunci (kapal induk) dalam atribut judul tautan, dan tambahkan ke dalam antrian yang akan dirangkak. Dengan cara yang terkait dengan semua halaman yang terkait dengan semua halaman yang terkait dengan semua halaman yang terkait dengan halaman web yang terkait dengan semua halaman yang terkait dengan. luas kelas untuk menyelesaikan tugas ini.
Ide 2 (Asal: Kucing): Merayap dengan Klasifikasi. Perhatikan bahwa di wikipedia, kategori dimulai dengan kategori:. Karena Wikipedia memiliki struktur dokumen yang baik, mudah untuk memulai dengan kategori apa pun dan selalu merangkak semua kategori di bawahnya. Algoritma ini mengekstraksi subkategoriasi untuk halaman klasifikasi dan mengambil semua halaman di bawahnya secara paralel. Ini cepat dan dapat menyimpan struktur klasifikasi, tetapi pada kenyataannya ada banyak halaman duplikat, tetapi ini dapat dengan mudah diproses dengan menulis skrip di tahap selanjutnya.
Pilihan perpustakaan
Saya mulai ingin menggunakan JSDOM. Meskipun saya merasa itu kuat, itu juga cukup "berat". Yang paling serius adalah bahwa dokumen penjelasannya tidak cukup baik. Saya hanya menyebutkan keuntungannya, tetapi tidak memiliki penjelasan yang komprehensif. Oleh karena itu, jika Anda berubah menjadi cheerio, itu ringan dan memiliki fungsi yang relatif lengkap. Setidaknya Anda dapat memiliki konsep komprehensif secara sekilas. Bahkan, setelah melakukannya, saya menyadari bahwa tidak perlu perpustakaan sama sekali, dan Anda dapat melakukan segalanya dengan ekspresi reguler! Saya baru saja menulis sedikit keteraturan di perpustakaan.
Poin -poin penting
Pengaturan Variabel Global:
var regkey = ['kapal induk', 'kapal induk', 'kapal induk']; // Jika kata kunci disertakan dalam tautan, itu adalah target var allkeys = []; // Judul tautan juga merupakan pengidentifikasi halaman, menghindari perayapan berulang var keys = ['Kategori:%E8%88%AA%E7%A9%BA%E6%AF%8D%E8%88%B0']; // menunggu antrian, halaman mulai
Unduh Gambar
Gunakan operasi streaming pustaka permintaan untuk membuat setiap pengoperasian pengunduhan dari penutupan. Perhatikan kemungkinan efek samping dari operasi asinkron. Selain itu, nama gambar perlu diatur ulang. Pada awalnya, saya mengambil nama aslinya. Untuk beberapa alasan, beberapa gambar jelas ada, tetapi tidak dapat ditampilkan; dan atribut SRCSET harus dibersihkan, jika tidak permukaan asli tidak dapat ditampilkan.
$ = cheer.load (downhtml); var rshtml = $ .html (); var imgs = $ ('#bodycontent .image'); // Gambar -gambar dimodifikasi oleh gaya ini untuk (img di imgs) {if (typeof imgs [img] .attribs === 'tidak terdefinisi' || typeof imgs [img] .attribs.href === 'tidak terdefinisi') {lanjutkan;} // strukturnya adalah gambar di bawah tautan, dan tautan tidak ada yang tidak ada. imgs [img] .Children [0] .attribs.src; // alamat gambar var dirs = picurl.split ('.'); var filename = berbasis+uuid.v1 ()+'.'+dirs [dir.length -1]; // ganti nama permintaan ("https:"+picurl) .pipe (fs.createWriteStream ('halaman/'+nama file)); // unduh rshtml = rshtml.replace (picurl, fileName); // ganti jalur lokal // console.log (picurl); }}Prioritas luas traversal
Pada awalnya, saya tidak sepenuhnya memahami konsep asinkron dan melakukannya dalam satu lingkaran. Saya berpikir bahwa menggunakan janji telah dikonversi menjadi sinkronisasi, tetapi pada kenyataannya, itu hanya memastikan bahwa operasi yang diserahkan kepada Promise akan dilakukan dengan cara yang tertib, dan operasi ini tidak dapat diperintahkan dengan operasi lain! Misalnya, kode berikut salah.
var keys = ['Aircraft Carrier']; var key = keys.shift (); while (key) {data.get ({url: encodeuri (key), qs: null}). Kemudian (function (downhtml) {... Keys.push (key); // (1)}}); keys = Keyshift.push (key); / /1 // (2)}Operasi di atas normal, tetapi pada kenyataannya (2) akan dijalankan antara (1)! Apa yang harus dilakukan?
Saya menggunakan rekursi untuk menyelesaikan masalah ini. Contoh kode berikut:
var key = keys.shift (); (function donext (key) {data.get ({url: key, qs: null}). Kemudian (function (downhtml) {... keys.push (href); ... key = keys.shift (); if (key) {donext (key);} lain {console. })}) (tombol);Pembersihan rutin
Gunakan ekspresi reguler untuk membersihkan kode halaman yang tidak berguna, karena ada banyak pola yang akan diproses, jadi saya menulis satu lingkaran untuk memprosesnya secara seragam.
var regs = [/<tautan rel =/"stylesheet/" href =/"? [^/"]*/">/g,/<script>? [^<]*<// script>/g,/<tyle>? [^<]*<// style>/g,/<a? [^>]*/G,/</a>/g,/g,/<a? [^"? regs.forEach(function(rs){ var mactches = rsHtml.match(rs); for (var i=0;i < mactches.length ; i++) { rsHtml = rsHtml.replace(mactches[i],mactches[i].indexOf('stylesheet')>-1?'<link rel="stylesheet" href = "wiki '+(i+1)+'. css" ':' ');Efek berjalan
Saya butuh FQ di wiki cina. Saya mencobanya dan mengambil klasifikasi kapal induk. Selama operasi, saya menemukan sekitar 300 tautan terkait (termasuk halaman klasifikasi. Saya hanya mengambil tautan yang valid dan tidak mengunduhnya). Akhirnya, saya mengunduh 209 dengan benar. Saya secara manual menguji beberapa tautan kesalahan dan menemukan bahwa itu adalah tautan yang tidak valid. Itu menunjukkan bahwa entri belum ditetapkan. Seluruh proses memakan waktu kurang dari lima belas menit. Setelah kompresi, hampir tiga puluh m dan rasanya efeknya cukup bagus.
Kode Sumber
https://github.com/zhoutk/wikispider
ringkasan
Pada saat saya pada dasarnya telah menyelesaikan tugas tadi malam, ide 1 dapat merangkak dengan konten yang relatif akurat, dan halaman tidak diulang, tetapi efisiensi merangkak tidak tinggi, dan informasi rahasia tidak dapat diperoleh secara akurat; Gagasan 2 dapat secara otomatis merangkak dan menyimpan file secara lokal dalam kategori menurut Wikipedia, yang sangat efisien (pengukuran aktual, merangkak [kapal perang], dan merangkak hampir 6.000 halaman secara total, yang membutuhkan waktu sekitar 50 menit, dan lebih dari 100 halaman dapat dirangkak per menit), dan dapat secara akurat menyimpan informasi rahasia.
Keuntungan terbesar adalah pemahaman yang mendalam tentang keseluruhan kontrol proses pemrograman asinkron.