Saya telah menulis banyak crawler ular python satu halaman sebelumnya, dan saya merasa bahwa ular python masih sangat berguna. Di sini saya menggunakan Java untuk merangkum perayap multi-halaman, secara iteratif merangkak semua tautan halaman benih, dan menyimpan semuanya di bawah jalur TMP.
1. Pendahuluan
Menerapkan crawler ini membutuhkan dukungan dari dua struktur data, antrian yang tidak dikunjungi (Prioritas: Dapat menghitung pentingnya URL) dan tabel yang dikunjungi (hashset: dapat dengan cepat mengetahui apakah ada URL); Antrian digunakan untuk menerapkan perayapan lebar-pertama, dan meja yang dikunjungi digunakan untuk merekam URL yang dirayapi, tidak lagi merangkak berulang kali, menghindari cincin. Toolkit yang diperlukan oleh Java Crawlers termasuk HTTPClient dan HTMLParser1.5, dan Anda dapat melihat unduhan versi spesifik dalam repo Maven.
1. Situs web target: Sina http://www.sina.com.cn/
2. Tangkapan layar hasil:
Mari kita bicara tentang implementasi crawler. Kode sumber akan diunggah ke GitHub nanti. Teman yang membutuhkannya dapat meninggalkan pesan:
2. Pemrograman crawler
1. Buat URL halaman benih
Mycrawler crawler = mycrawler baru ();
crawler.crawling (string baru [] {"http://www.sina.com.cn/"});
2. Inisialisasi tabel yang tidak dikunjungi sebagai URL benih di atas
Linkqueue.addunvisitedUrl (biji [i]);
3. Bagian Implementasi Logis yang Paling Penting: Keluarkan URL yang belum dikunjungi dalam antrian, unduh, lalu tambahkan tabel yang dikunjungi, purl URL lain pada halaman URL yang diubah, dan tambahkan antrian yang tidak diwakili ke antrian yang tidak dikunjungi; Iterasi sampai antriannya kosong, jadi jaringan URL ini masih sangat besar. Perhatikan bahwa unduhan halaman dan resolusi halaman di sini memerlukan implementasi Java Toolkit, dan penggunaan toolkit dijelaskan secara rinci di bawah ini.
while (! linkqueue.unvisitedUrlsempty () && linkqueue.getVisitedUrlnum () <= 1000) {// URL header keluar dari string antrian visitUrl = (string) linkqueue.unvisitedUrldequeue (); if (VisitUrl == null) Lanjutkan; Downloadfile downloadfile downloader = new downloadfile (); // unduh halaman web downloader.downloadfile (visitUrl); // URL ditempatkan di URL LinkQueue.addvisitedUrl (VisitUrl) yang dikunjungi; // Ekstrak URL dari set webpage set <string> tautan = htmlparserTool.extraclinks (visitUrl, filter); // URL baru yang belum divisitited untuk (string link: links) {linkqueue.addunvisitedUrl (link); }}4. Unduh toolkit untuk halaman HTML berikut
public string downloadfile (string url) {string filePath = null; / * 1. Hasilkan objek httpclinet dan atur parameter */ httpClient httpClient = httpclient baru (); // Atur batas waktu koneksi http untuk 5s httpclient.getHttpConnectionManager (). GetParams (). SetConnectionTimeout (5000); / * 2. Hasilkan objek getMethod dan atur parameter */ getMethod getMethod = baru getMethod (url); // Atur batas waktu GET untuk 5s getMethod.getParams (). SetParameter (httpmethodparams.so_timeout, 5000); // atur permintaan pemrosesan ulang getMethod.getParams (). SetParameter (httpmethodparams.retry_handler, DEFAULTHTTPMethodRetryHandler ()); /* 3. Jalankan http dapatkan permintaan*/ coba {int statusCode = httpclient.executeMethod (getMethod); // Tentukan kode status akses IF (statusCode! = httpstatus.sc_ok) {system.err.println ("Metode gagal:" + getMethod.getstatusLine ()); filepath = null; }/* 4. Proses konten respons http*/byte [] responseBody = getMethod.getResponseBody (); // dibaca sebagai array byte // menghasilkan nama file saat menyimpan sesuai dengan halaman web url filepath = "temp //" + getFileNamByUrl (url, getSponRod.getRetead ("contentead (url, getSponRod.getRetRead (" contentead (URL, getSponRod.getSead ("contentead (url, getSponRetRetRetRetRetRead (" getSePonRetRetRetRetREDEHEAD (URL, getSponRetRetRetRetRod.getSead. savetolocal (responsbody, filepath); } catch (httpException e) {// Pengecualian fatal terjadi, yang mungkin protokol salah atau ada masalah dengan sistem konten yang dikembalikan.out.println ("Silakan periksa alamat http yang disediakan!"); e.printstacktrace (); } catch (ioException e) {// Pengecualian jaringan terjadi e.printstacktrace (); } akhirnya {// lepaskan koneksi getMethod.releaseConnection (); } return filepath; }5. HTML Page Parsing Toolkit:
set statis public <string> ekstraclinks (string url, linkfilter filter) {set <string> links = new HashSet <String> (); coba {parser parser = parser baru (url); parser.setencoding ("GB2312"); // Filter filter tag <bingkai> untuk mengekstrak tautan yang diwakili oleh atribut src dalam tag frame nodefilter framefilter = nodefilter () {public boolean accept (simpul simpul) {if (node.getText (). Startswith ("frame src =") {return true.getText (). } else {return false; }}}}; // orfilter untuk mengatur penyaringan <a> tag, dan <pangka> tag orfilter linkfilter = orfilter baru (nodeclassfilter baru (linktag.class), framefilter); // Dapatkan semua tag yang difilter nodelist list = parser.extractAllNodestAtmatch (linkFilter); untuk (int i = 0; i <list.size (); i ++) {node tag = list.elementat (i); if (tag instanceof linktag) // <a> tag {linktag link = (linktag) tag; String linkurl = link.getLink (); // url if (filter.accept (linkurl)) links.add (linkurl); } else // <pangka> Tag {// Ekstrak tautan ke atribut SRC dalam frame, seperti <frame src = "test.html"/> string frame = tag.getText (); int start = frame.indexOf ("src ="); frame = frame.substring (start); int end = frame.indexof (""); if (end == -1) end = frame.indexof (">"); String frameUrl = frame.substring (5, end - 1); if (filter.accept (frameUrl)) links.add (frameUrl); }}} catch (parserException e) {e.printstacktrace (); } return link; }6. Halaman yang tidak dikunjungi disimpan menggunakan Prioritas dengan antrian pilihan, terutama untuk berlaku untuk algoritma seperti PageRank. Beberapa URL lebih setia; Tabel yang dikunjungi diimplementasikan menggunakan hashset, perhatikan dengan cepat menemukan apakah ada;
Kelas Publik LinkQueue {// Diakses URL Collection Private Static Set VisitedUrl = new HashSet (); // Diakses Koleksi URL Private Static Antrat UnvisitedUrl = new PriityqueueUe (); // Dapatkan URL antrian statis publik getUnvisitedUrl () {return unvisitedUrl; } // Tambahkan ke URL yang dikunjungi public static void addVisitedUrl (string url) {visitedUrl.add (url); } // Hapus URL yang diakses public static void removevisitedUrl (string url) {visitedUrl.remove (url); } // URL yang tidak divission berada di luar antrian objek statis publik UnvisitedUrldequeue () {return unvisitedUrl.poll (); } // Pastikan bahwa setiap URL diakses hanya sekali public static void addUnvisitedUrl (string url) {if (url! = Null &&! Url.trim (). Equals ("") &&! VisitedUrl.contains (url) &&! Unvisitedurl.contains (url)) unvisited. } // Dapatkan jumlah URL yang telah diakses public static int getVisitedUrlnum () {return visitedUrl.size (); } // menilai apakah antrian URL yang tidak dikunjungi adalah boolean statis public yang kosong tidak divisitedurlsempty () {return unvisitedurl.isempty (); }}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.