|
|
Yayınlandı 30.11.2014 16:56:56
|
|
|
|

[mw_shl_code=java,doğru]/** * @author Jack.Wang
* */ java.io.BufferedReader'i import et; java.io.InputStreamReader içe aktar; java.net.URL içe aktar; java.util.ArrayList içe aktar; java.util.HashMap içe aktar; java.util.HashSet'i içe aktarmak; java.util.LinkedHashSet'i içe aktarmak; java.util.regex.Matcher'ı içe aktarmak; java.util.regex.Pattern içe aktar;
Web tarayıcıları için arama public class SearchCrawler implements Runnable {
/* * disallowListCache önbellek robotu aranan URL'lere izin vermez. Robot protokolü, web sitesinin kök dizininde bir robots.txt dosyası belirler, * Sitedeki hangi sayfaların kısıtlı arama için aranabileceğini belirtir. * Arama programı arama sırasında bu alanları atlamalı, işte robots.txt bir örnek: * # http://somehost.com/ User-agent için robots.txt: * İcaze verme: /cgi-bin/ * Kayıt sayfasında yasaklanan /kayıt # Robotları yasakla * Girişi engelleme: */
private HashMap<String, <String>ArrayList> disallowListCache = yeni HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = yeni ArrayList<String>(); Hata mesajı ArrayList<String> result = yeni ArrayList<String>(); Aranan sonuçlar String startUrl; Aramanıza başlamak için bir başlangıç noktası int maxUrl; İşlenen maksimum URL sayısı Dizi searchString; Aranan dizgiler boolean caseSensitive = yanlış; Küçük harf hassasiyeti olup olmama boolean limitHost = yanlış; Kısıtlı bir konak içinde arama yapıp yapılmaması
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { geri dönüş sonucu;
}
public void run() { // Arama dizisini başlat crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
URL biçimlendirmesini tespit et private URL verifyUrl(String url) { Sadece HTTP URL'leri işleniyor. if (!url.toLowerCase().startsWith("http://")) return null; URL verifiedUrl = null; Try { verifiedUrl = yeni URL(url); } yakalama (İstisna e) { return null; } return verifiedUrl;
}
Robotun verilen URL'ye erişim izni verip vermediğini tespit eder. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); RUL veren hostu alın System.out.println("host="+host);
Sunucunuzun arama yapmasına izin vermediği URL önbelleği alın ArrayList<String> disallowList = disallowListCache.get(host);
Eğer zaten önbelleğiniz yoksa, indirin ve önbelleyin. if (disallowList == null) { disallowList = yeni ArrayList<String>(); Try { URL robotsFileUrl = yeni URL("http://" + host + "/robots.txt"); BufferedReader okuyucu = yeni BufferedReader( new InputStreamReader(robotsFileUrl.openStream()));
Erişilmeyen yolların listesini oluşturmak için robot dosyasını okuyun. String line; while ((line = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {// "Disallow:" içeriyor mu? String disallowPath = line.substring("Disallow:" .length()); Yasaklanan erişime giden yolu alın
Açıklamaları kontrol edin. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Yorumu kaldır }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Bu ana bilgisayarın erişemediği önbellek yolları. disallowListCache.put(host, disallowList); } yakalama (İstisna e) { True döner; Web sitesinin kök dizininde robots.txt dosya yok ve gerçek dosya döner. } }
String file = urlToCheck.getFile(); System.out.println("Dosya getFile()="+file); için (int i = 0; i disallowList.size() <; i++) { String disallow = disallowList.get(i); if (file.startsWith(disallow)) { yanlış döndür; } }
True döner;
}
private String downloadPage(URL pageUrl) { Try { Okumak için URL'ye açık bağlantı. BufferedReader okuyucu = yeni BufferedReader(yeni InputStreamReader( pageUrl.openStream()));
Sayfayı tampona oku. String line; StringBuffer pageBuffer = yeni StringBuffer(); while ((line = reader.readLine()) != null) { pageBuffer.append(line); }
pageBuffer.toString() döndür; } yakalama (İstisna e) { }
return null;
}
URL'den "www" harfini kaldırın private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); if (indeks != -1) { return url.substring(0, index + 3) + url.substring(index + 7); }
return (URL);
}
Sayfayı analiz et ve bağlantıyı bulun private ArrayList<String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { Bağlantının eşleşme desenini düzenli ifadelerle derleyin. Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Eşleşen m = p.matcher(pageContents);
ArrayList<String> linkList = yeni ArrayList<String>(); while (m.find()) { Dizi bağlantısı = m.group(1).trim();
if (link.length() < 1) { devam et; }
Bu sayfanın bağlantısını atlayın. if (link.charAt(0) == '#') { devam et; }
if (link.indexOf("mailto:") != -1) { devam et; }
if (link.toLowerCase().indexOf("javascript") != -1) { devam et; }
if (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// kesinlikle link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + bağlantı; } else { String file = pageUrl.getFile(); if (file.indexOf('/') == -1) {// göreli adresleri işliyor link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + bağlantı; } else { Dizi yolu = file.substring(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + yol + bağlantı; } } }
int index = link.indexOf('#'); if (indeks != -1) { link = link.substring(0, index); }
link = kaldırmaWwwFromUrl(link);
URL verifiedLink = verifyUrl(link); if (verifiedLink == null) { devam et; }
/* Eğer ana bilgisayarları kısıtlarsanız, kriterleri karşılamayan URL'leri hariç tutun */ if (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { devam et; }
Zaten işlenmiş olan bağlantıları atlayın. if (crawledList.contains(link)) { devam et; }
linkList.add(link); }
return (linkList);
}
İndirilmiş bir web sayfasının içeriğinde arama yapın ve sayfada belirli bir arama dizisi olup olmadığını belirleyin
private boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive) { Dizi aramasıContents = pageContents; if (!caseSensitive) {// if case insensitive searchContents = pageContents.toLowerCase(); }
Pattern p = Pattern.compile("[\\s]+"); String[] termleri = p.split(searchString); için (int i = 0; < terim.uzunluk; i++) { if (caseSensitive) { if (searchContents.indexOf(terms) == -1) { yanlış döndür; } } else { if (searchContents.indexOf(terms.toLowerCase()) == -1) { yanlış döndür; } } }
True döner;
}
Gerçek arama işlemini gerçekleştirin public ArrayList<String> crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = yeni HashSet<String>(); LinkedHashSet<String> toCrawlList = yeni LinkedHashSet<String>();
if (maxUrls < 1) { errorList.add("Geçersiz maksimum URL'ler değeri."); System.out.println ("Geçersiz Maksimum URL değeri."); }
if (searchString.length() < 1) { errorList.add("Eksik Arama Dizesi."); System.out.println ("Eksik arama dizisi"); }
if (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
www'yi başlangıç URL'sinden çıkar startUrl = removeWwwFromUrl(startUrl);
toCrawlList.add(startUrl); while (toCrawlList.size() > 0) {
if (maxUrls != -1) { if (crawledList.size() == maxUrls) { mola; } }
Listenin en altına URL verin. String url = toCrawlList.iterator().next();
URL'yi tarama listesinden kaldırın. toCrawlList.remove(url);
Dizinin URL'sini URL nesnesine dönüştür. URL verifiedUrl = verifyUrl(url);
Robotların erişmesine izin verilmiyorsa URL'yi atlayın. if (!isRobotAllowed(verifiedUrl)) { devam et; }
İşlenen URL'leri crawledList'e ekleyin crawledList.add(url); Dizi pageContents = downloadPage(verifiedUrl);
if (pageContents != null && pageContents.length() > 0) { Sayfadan geçerli bir bağlantı alın ArrayList<String> links = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(bağlantılar);
if (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(URL); System.out.println(url); } }
} geri dönüş sonucu;
}
Ana işlev public static void main(String[] args) { SearchCrawler tarayıcısı = yeni SearchCrawler("http://www.itsvse.com/", 100,"Delver_Si"); Thread search = yeni Thread (tarayıcı); System.out.println ("Aramaya başla..."); System.out.println("result:"); search.start(); Try { search.join(); } yakalama (Kesilen İstisna e) { TODO Otomatik olarak oluşturulan yakalama bloğu e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, İndirme sayısı: 591)
-
2.png
(72.18 KB, İndirme sayısı: 596)
-
3.png
(188.46 KB, İndirme sayısı: 606)
Önceki:PHP, en iyi 100W web sitelerinin %82,2'sini oluşturuyorÖnümüzdeki:Java Edition Web Kaynak Kodu Görüntüleyicisi
|