Langkah pertama adalah mengimplementasikan LinkQueue dan memfilter dan menyimpan URL.
impor java.util.arraylist; impor java.util.collections; impor java.util.hashset; impor java.util.list; impor java.util.set; Kelas Publik LinkQueue {// Diakses URL Collection Private Static Set <String> visitedUrl = collections.synchronizedset (hashset baru <string> ()); // URL Private Static List yang tidak diakses <String> unvisitedUrl = collections.synchronizedList (ArrayList baru <string> ()); // URL yang tidak divisited berada di luar antrian public static String UnvisitedUrldequeue () {if (unvisitedUrl.size ()> 0) {string url = unvisitedUrl.remove (0); visitedurl.add (url); URL pengembalian; } return null; } // Verify when a new url is added, ensuring that it is only added once public static void addUnvisitedUrl(String url) { if (url != null && !url.trim().equals("") && !visitedUrl.contains(url) && !unVisitedUrl.contains(url)) unVisitedUrl.add(url); } // Tentukan apakah antrian URL yang tidak dikunjungi adalah boolean statis public yang kosong tidak divisitasiurlsempty () {return unvisitedurl.isempty (); }}Langkah kedua adalah mengumpulkan tautan di bawah setiap URL dan filter untuk menghasilkan tautan baru.
impor java.util.hashset; impor java.util.set; impor org.htmlparser.node; impor org.htmlparser.nodefilter; impor org.htmlparser.parser; impor org.htmlparser.filters.nodeclassfilter; impor org.htmlparser.filters.orfilter; impor org.htmlparser.tags.linktag; impor org.htmlparser.util.nodelist; impor org.htmlparser.util.parserexception; /** * Filter http's url to get urls that can comply with the rules * @author Administrator * */ public class ParserHttpUrl { // Get a link on a website, filter is used to filter links public static Set<String> extracLinks(String url, LinkFilter filter) { Set<String> links = new HashSet<String>(); coba {parser parser = parser baru (url); // 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; }}Langkah 3: Menerapkan fungsi unduhan gambar
impor java.io.file; impor java.io.fileoutputStream; impor java.io.inputstream; impor java.net.url; impor java.net.urlconnection; impor java.util.arraylist; impor java.util.list; impor java.util.regex.matcher; impor java.util.regex.pattern; / *** * Java Crawl Network Pictures * * @author swinglife * */ class public downloadpic {// encoding private static final string ecoding = "utf-8"; // Dapatkan tag img string final statis privat reguler imgurl_reg = "<img.*Src = (.*?) [^>]*?>"; // Dapatkan string final statis privat reguler imgsrc_reg = "http:/"? (.*?) (/"|> | // s+)"; public static void downloadpic (string url) {// Dapatkan html Text Content String html = null; coba {html = downloadpic.getHtml (url); } catch (Exception e) {E.PrintStackTrace (); } if (null! = html &&! " // Dapatkan Daftar Alamat SRC Gambar <String> imgsrc = downloadpic.getImageSrc (imgurl); // Unduh gambar unduhloadpic.download (imgsrc); }} / *** * Dapatkan konten html * * @param url * @return * @throws Exception * / private static string getHtml (string url) melempar pengecualian {url uri = url baru (url); Koneksi UrlConnection = URI.Openconnection (); InputStream in = connection.getInputStream (); byte [] buf = byte baru [1024]; panjang int = 0; StringBuffer SB = StringBuffer baru (); while ((length = in.read (buf, 0, buf.length))> 0) {sb.append (string baru (buf, ecoding))); } in.close (); return sb.tostring (); } / *** * Dapatkan alamat ImageUrl * * @param html * @return * / Daftar statis privat <string> getImageUrl (string html) {matcher matcher = pola.compile (imgurl_reg) .matcher (html); Daftar <String> listImgUrl = ArrayList baru <string> (); while (matcher.find ()) {listImgurl.add (matcher.group ()); } return listImgurl; } / *** * Dapatkan alamat gambar * * @param listImageUrl * @return * / daftar statis privat <string> getImageSrc (Daftar <String> listImageUrl) {Daftar <string> listImgsrc = ArrayList baru <string> (); untuk (gambar string: listImageUrl) {matcher matcher = pola.compile (imgsrc_reg) .matcher (gambar); while (matcher.find ()) {listimgsrc.add (matcher.group (). substring (0, matcher.group (). length () - 1)); }} return listImgsrc; }/**** Unduh gambar** @param listImgsrc*/private static void download (daftar <string> listImgsrc) {for (string url: listImgsrc) {coba {string imageName = url.substring (url.lastIndexof ("/") + 1, url.length ()) ()); Url uri = URL baru (url); Inputstream in = uri.openstream (); FileOutputStream fo = new FileOutputStream (File baru (ImageName)); byte [] buf = byte baru [1024]; panjang int = 0; while ((length = in.read (buf, 0, buf.length))! = -1) {fo.write (buf, 0, panjang); } in.close (); fo.close (); } catch (Exception e) {E.PrintStackTrace (); }}}}Antarmuka Filter Nyata, Tentukan Antarmuka Filter:
filter antarmuka publik {public boolean accept (string url); }Langkah 4: Implementasi Aturan Penyaringan:
Crawler kelas publik { /** * Proses crawl * * @return * @param seeds * /public void merangkak (string url) {// tentukan filter filter = filter baru () {public boolean accept (string url) {// aturan penyaringan di sini diubah sesuai dengan aturan situs web yang perlu di -robek. Disarankan untuk menggunakan implementasi reguler. Saya merangkak situs web Douban jika (url.indexof ("douban.com/group/topic")! = -1 || url.indexof ("douban.com/group/haixiuzu/discussion?start")! = -1) kembali true; lain mengembalikan false; }}; // inisialisasi url antrian linkqueue.addunvisitedUrl (url); // Kondisi loop, tautan yang akan dirangkak tidak kosong sementara (! Linkqueue.unvisitedUrlSempty ()) {// URL header keluar dari string antrian visitUrl = (string) linkqueue.unvisitedUrldequeue (); if (VisitUrl == null) Lanjutkan; Downloadloadpic.downloadpic (VisitUrl); // Ekstrak URL dari set halaman web yang diunduh <string> tautan = parserhttpurl.extraclinks (visitUrl, filter); // URL ENQUEUE BARU yang Tidak Diketahui untuk (String Link: Links) {LinkQueue.AddunvisedUrl (Link); }}} // Metode utama entri public static void main (string [] args) {crawler crawler = new crawler (); crawler.crawling ("http://www.douban.com/group/haixiuzu/discussion?start=0"); }}Meringkaskan
Di atas adalah contoh kode untuk implementasi gambar situs web merangkak yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!