|
|
Közzétéve 2014. 11. 30. 16:56:56
|
|
|
|

[mw_shl_code=java,true]/** * @author Jack.Wang
* */ importál java.io.BufferedReader; importál java.io.InputStreamReader; importál java.net.URL; importál java.util.ArrayList; importál java.util.HashMap; importál java.util.HashSet; importál java.util.LinkedHashSet; importál java.util.regex.Matcher; importál java.util.regex.Pattern;
Webes crawlerek keresése public class SearchCrawler implements Runnable {
/* * disallowListCache gyorsítótár robot nem engedélyezi a keresési URL-eket. A Robot protokoll egy robots.txt fájlt állít be a weboldal gyökérkönyvtárában, * Megadja, hogy az oldalon mely oldalak kereshetők korlátozott kereséshez. * A keresőprogramnak ki kell hagynia ezeket a területeket a keresés során, íme egy példa robots.txt: * # robots.txt http://somehost.com/ User-agent: * Tilts: /cgi-bin/ * Tiltsd meg: /regisztráció # Tiltsd meg robotokat a regisztrációs oldalon * Tilts: /bejelentkezés */
private HashMap<String, ArrayList<String>> disallowListCache = új HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = new ArrayList<String>(); Hibaüzenet ArrayList<String> result = új ArrayList<String>(); Keresési eredmények String startUrl; Egy kiindulópont a keresés elindításához int maxUrl; A feldolgozott URL-ek maximális száma String searchString; Keresésre szánt stringek boolean haszus Sensitive = hamis; Hogy legyen esetérzékeny vagy sem boolean limitHost = hamis; Hogy keressünk-e korlátozott gazdagépen belül
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { visszaadási eredmény;
}
public void run() { // Indítsa el a keresési szálat crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
URL formázás észlelése private URL verifyUrl(String url) { Csak HTTP URL-eket dolgoznak fel. if (!url.toLowerCase().startsWith("http://")) return null; URL verifiedUrl = null; try { verifiedUrl = új URL(url); } fogás (Kivétel e) { return null; } return verifiedUrl;
}
Megállapítja, hogy a robot engedélyezi-e a megadott URL-hez való hozzáférést. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Szerezd meg azt a gazdagépet, aki megadja a RUL-t System.out.println("host="+host);
Szerezz egy olyan URL-gyorsítótárt, amit a hostod nem enged keresni ArrayList<String> disallowList = disallowListCache.get(host);
Ha még nincs gyorsítótárod, töltsd le és gyorsítsd el. if (disallowList == null) { disallowList = új ArrayList<String>(); try { URL robotsFileUrl = new URL("http://" + host + "/robots.txt"); BufferedReader olvasó = új BufferedReader( new InputStreamReader(robotsFileUrl.openStream()));
Olvasd el a robot fájlt, hogy létrehozz egy listát azokról az utakról, amelyekhez nem lehet hozzáférni. Húrvonal; míg ((line = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {// Tartalmazza-e a "Disallow:" String disallowPath = line.substring("Disallow:" .length()); Szerezd meg az útvonalat a tiltott hozzáféréshez
Ellenőrizd az annotációkat. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Töröld a hozzászólást }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Gyorsítótár útvonalak, amelyekhez ez a hoszt nem férhet hozzá. disallowListCache.put(host, disallowList); } fogás (Kivétel e) { return true; A weboldal gyökérkönyvtárában nincs robots.txt fájl, és az igaz értéket adja vissza } }
String file = urlToCheck.getFile(); System.out.println("Fájl getFile()="+file); for (int i = 0; i < disallowList.size(); i++) { String disallow = disallowList.get(i); if (file.startsWith(disallow)) { hamis; } }
return true;
}
private String downloadPage(URL pageUrl) { try { Nyiss kapcsolatot az URL-re olvasáshoz. BufferedReader olvasó = új BufferedReader(új InputStreamReader( pageUrl.openStream()));
Olvasd el az oldalt a bufferbe. Húrvonal; StringBuffer pageBuffer = új StringBuffer(); míg ((line = reader.readLine()) != null) { pageBuffer.append(line); }
return pageBuffer.toString(); } fogás (Kivétel e) { }
return null;
}
Távolítsa el az "www" kifejezést az URL-ről private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); if (index != -1) { return url.substring(0, index + 3) + url.substring(index + 7); }
return (URL);
}
Elemzd az oldalt, és keresd meg a linket private ArrayList<String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { Állítsd össze a link párosítási mintázatát rendszeres kifejezésekkel. Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
ArrayList<String> linkList = új ArrayList<String>(); míg (m.find()) { String link = m.group(1).trim();
if (link.length() < 1) { folytasd; }
Ugrasd ki ennek az oldalnak a linkjét. if (link.charAt(0) == '#') { folytasd; }
if (link.indexOf("mailto:") != -1) { folytasd; }
if (link.toLowerCase().indexOf("javascript") != -1) { folytasd; }
if (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// abszolút kezeli link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + link; } más { String file = pageUrl.getFile(); if (file.indexOf('/') == -1) {// kezeli a relatív címeket link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + link; } más { String path = file.substring(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + path + link; } } }
int index = link.indexOf('#'); if (index != -1) { link = link.substring(0, index); }
link = eltávolít WwwFromUrl(link);
URL verifiedLink = verifyUrl(link); if (verifiedLink == null) { folytasd; }
/* Ha korlátozod a hósztehelyeket, kizárd azokat az URL-eket, amelyek nem felelnek meg a kritériumoknak */ ha (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { folytasd; }
Hagyd ki azokat a linkeket, amelyek már fel vannak dolgozva. if (crawledList.contains(link)) { folytasd; }
linkList.add(link); }
return (linkList);
}
Keresd meg a letöltött weboldal tartalmát, hogy megállapítsd, van-e meghatározott keresési láncszál az oldalon
private boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive) { String searchContents = pageContents; if (!caseSensitive) {// if kiskitűzésmentes searchContents = pageContents.toLowerCase(); }
Pattern p = Pattern.compile("[\\s]+"); String[] termek = p.split(searchString); for (int i = 0; < a hossz; i++) { if (caseSensitive) { if (searchContents.indexOf(terms) == -1) { hamis; } } más { if (searchContents.indexOf(terms.toLowerCase()) == -1) { hamis; } } }
return true;
}
Végezze el a tényleges keresési műveletet public ArrayList<String> crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = új HashSet<String>(); LinkedHashSet<String> toCrawlList = új LinkedHashSet<String>();
if (maxUrls < 1) { errorList.add("Invalid Max URLs érték."); System.out.println ("Érvénytelen maximális URL-érték."); }
if (searchString.length() < 1) { errorList.add("Hiányzó keresési string."); System.out.println ("Hiányzó kereső lánc"); }
if (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Mozgasd ki a www-t a kezdő URL-ből startUrl = removeWwwFromUrl(startUrl);
toCrawlList.add(startUrl); while (toCrawlList.size() > 0) {
if (maxUrls != -1) { if (crawledList.size() == maxUrls) { szünet; } }
A lista alján találd az URL-t. String url = toCrawlList.iterator().next();
Távolítsa el az URL-t a crawl listáról. toCrawlList.remove(url);
Konvertáld a string URL-t URL objektummá. URL verifiedUrl = verifyUrl(url);
Hagyd ki az URL-t, ha a robotok nem férhetnek hozzá. if (!isRobotAllowed(verifiedUrl)) { folytasd; }
Feldolgozott URL-ek hozzáadása a crawledList-hez crawledList.add(url); String pageContents = downloadPage(verifiedUrl);
if (pageContents != null && pageContents.length() > 0) { Szerezz érvényes linket az oldalról ArrayList<String> links = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(links);
ha (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(URL); System.out.println(url); } }
} visszaadási eredmény;
}
Fő funkció public static void main(String[] args) { SearchCrawler crawler = új SearchCrawler("http://www.itsvse.com/", 100,"Delver_Si"); Szálkeresés = új Thread (crawler); System.out.println ("Keresés indítása..."); System.out.println("eredmény:"); search.start(); try { search.join(); } catch (InterruptedException e) { TODO Automatikusan generált fogóblokk e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Letöltések száma: 591)
-
2.png
(72.18 KB, Letöltések száma: 596)
-
3.png
(188.46 KB, Letöltések száma: 606)
Előző:A PHP a legjobb 100 wattos weboldalak 82,2%-át teszi kiKövetkező:Java Edition Web Source Code Viewer
|