|
|
Publicēts 30.11.2014 16:56:56
|
|
|
|

[mw_shl_code=java,true]/** * @author Jack.Wang
* */ importēt java.io.BufferedReader; importēt java.io.InputStreamReader; importēt java.net.URL; importēt java.util.ArrayList; importēt java.util.HashMap; importēt java.util.HashSet; importēt java.util.LinkedHashSet; importēt java.util.regex.Matcher; importēt java.util.regex.Pattern;
Tīmekļa rāpuļprogrammu meklēšana publiskā klase SearchCrawler implements Runnable {
/* * disallowListCache kešatmiņas robots neļauj meklētos URL. Robota protokols vietnes saknes direktorijā iestata robots.txt failu, * Norāda, kuras vietnes lapas ir meklējamas ierobežotai meklēšanai. * Meklēšanas programmai meklēšanas laikā vajadzētu izlaist šīs jomas, šeit ir robots.txt piemērs: * # robots.txt http://somehost.com/ lietotāja aģentam: * Aizliegt: /cgi-bin/ * Neatļaut: /registration # Neatļaut robotus reģistrācijas lapā * Neatļaut: /login */
private HashMap<String, ArrayList<String>> disallowListCache = new HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = jauns ArrayList<String>(); Kļūdas ziņojums ArrayList<String> rezultāts = jauns ArrayList<String>(); Meklētie rezultāti Virknes startUrl; Sākumpunkts, lai sāktu meklēšanu int maxUrl; Maksimālais apstrādāto URL skaits Virkne searchString; Meklējamās virknes būla caseSensitive = false; Vai reģistrjutīgums Būla limitsHost = false; Vai meklēt ierobežotā resursdatorā
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { atgriezt rezultātu;
}
public void run() { // Sāciet meklēšanas pavedienu crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
URL formatējuma noteikšana private URL verifyUrl(String url) { Tiek apstrādāti tikai HTTP URL. if (!url.toLowerCase().startsWith("http://")) atgriezt null; URL verifiedUrl = null; izmēģināt { verifiedUrl = jauns URL(url); } nozveja (e izņēmums) { atgriezt null; } atgriezt verifiedUrl;
}
Nosaka, vai robots ļauj piekļūt norādītajam URL. private boolean isRobotAllowed(URL urlToCheck) { Virknes resursdators = urlToCheck.getHost().toLowerCase(); Iegūstiet saimnieku, kas dod RUL System.out.println("host="+host);
Iegūstiet kešatmiņu ar URL, kurus jūsu resursdators neļauj meklēt ArrayList<String> disallowList = disallowListCache.get(host);
Ja jums vēl nav kešatmiņas, lejupielādējiet un saglabājiet to kešatmiņā. if (disallowList == null) { disallowList = jauns ArrayList<String>(); izmēģināt { URL robotsFileUrl = jauns URL("http://" + resursdators + "/robots.txt"); BufferedReader lasītājs = jauns BufferedReader( jauns InputStreamReader(robotsFileUrl.openStream()));
Izlasiet robota failu, lai izveidotu sarakstu ar ceļiem, kuriem nav atļauts piekļūt. Stīgu līnija; kamēr ((line = reader.readLine()) != null) { if (line.indexOf("Neatļaut:") == 0) {// Vai tas satur "Neatļaut:" Virkne disallowPath = line.substring("Neatļaut:" .garums()); Ceļš uz neatļautu piekļuvi
Pārbaudiet anotācijas. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, komentāru indekss); Noņemt komentāru }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Kešatmiņas ceļi, kuriem šim resursdatoram nav atļauts piekļūt. disallowListCache.put(resursdators, disallowList); } nozveja (e izņēmums) { atgriešanās true; Vietnes saknes direktorijā nav robots.txt failu, un tas atgriež true } }
Virknes fails = urlToCheck.getFile(); System.out.println("Fails getFile()="+fails); for (int i = 0; i < disallowList.size(); i++) { Virkne neatļaut = disallowList.get(i); if (fails.startsWith(neatļaut)) { atgriešanās nepatiesa; } }
atgriešanās true;
}
private String downloadPage(URL pageUrl) { izmēģināt { Atveriet savienojumu ar URL lasīšanai. BufferedReader reader = jauns BufferedReader(jauns InputStreamReader( pageUrl.openStream()));
Lasīt lapu buferī. Stīgu līnija; StringBuffer pageBuffer = jauns StringBuffer(); kamēr ((line = reader.readLine()) != null) { pageBuffer.append(rinda); }
atgriezties pageBuffer.toString(); } nozveja (e izņēmums) { }
atgriezt null;
}
"www" noņemšana no URL private String removeWwwFromUrl(String url) { int indekss = url.indexOf("://www."); if (indekss != -1) { atgriezt url.substring(0, indekss + 3) + url.substring(indekss + 7); }
atgriešanās (URL);
}
Analizējiet lapu un atrodiet saiti private ArrayList<String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { Sastādiet saites atbilstības modeli ar regulārajām izteiksmēm. Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
ArrayList<String> linkList = jauns ArrayList<String>(); kamēr (m.find()) { Virknes saite = m.group(1).trim();
if (link.length() < 1) { turpināt; }
Izlaidiet saiti uz šo lapu. if (link.charAt(0) == '#') { turpināt; }
if (link.indexOf("mailto:") != -1) { turpināt; }
if (link.toLowerCase().indexOf("javascript") != -1) { turpināt; }
if (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// rīkojas absolūti link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + saite; } citādi { Virknes fails = pageUrl.getFile(); if (file.indexOf('/') == -1) {// apstrādā relatīvās adreses link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + saite; } citādi { Virknes ceļš = file.substring(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + ceļš + saite; } } }
int index = link.indexOf('#'); if (indekss != -1) { saite = link.substring(0, indekss); }
link = removeWwwFromUrl(saite);
URL verifiedLink = verifyUrl(saite); if (verifiedLink == null) { turpināt; }
/* Ja ierobežojat resursdatorus, izslēdziet tos URL, kas neatbilst kritērijiem */ if (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { turpināt; }
Izlaidiet tās saites, kas jau ir apstrādātas. if (crawledList.contains(link)) { turpināt; }
linkList.add(saite); }
atgriešanās (linkList);
}
Meklējiet lejupielādētās tīmekļa lapas saturu, lai noteiktu, vai lapā ir norādīta meklēšanas virkne
private Boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive) { String searchContents = pageContents; if (!caseSensitive) {// ja reģistrjutīgs searchContents = pageContents.toLowerCase(); }
Modelis p = Pattern.compile("[\\s]+"); String[] terms = p.split(searchString); for (int i = 0; i < terminus.garums; i++) { if (reģistrjutīgs) { if (searchContents.indexOf(terms) == -1) { atgriešanās nepatiesa; } } citādi { if (searchContents.indexOf(terms.toLowerCase()) == -1) { atgriešanās nepatiesa; } } }
atgriešanās true;
}
Veiciet faktisko meklēšanas darbību public ArrayList<String> crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = jauns HashSet<String>(); LinkedHashSet<String> toCrawlList = jauns LinkedHashSet<String>();
if (maxUrls < 1) { errorList.add("Nederīga maksimālā URL vērtība."); System.out.println("Nederīga maksimālā URL vērtība."); }
if (searchString.length() < 1) { errorList.add("Trūkst meklēšanas virknes."); System.out.println("Trūkst meklēšanas virknes"); }
if (errorList.size() > 0) { System.out.println("kļūda!!"); atgriezties errorList; }
Pārvietot www no sākuma URL startUrl = removeWwwFromUrl(startUrl);
toCrawlList.add(startUrl); kamēr (toCrawlList.size() > 0) {
if (maxUrls != -1) { if (crawledList.size() == maxUrls) { pārtraukums; } }
Iegūstiet URL saraksta apakšā. Virknes url = toCrawlList.iterator().next();
Noņemiet URL no pārmeklēšanas saraksta. toCrawlList.remove(url);
Konvertējiet virknes URL uz URL objektu. URL verifiedUrl = verifyUrl(url);
Izlaist URL, ja robotiem nav atļauts tam piekļūt. if (!isRobotAllowed(verifiedUrl)) { turpināt; }
Apstrādāto URL pievienošana pārmeklētajam sarakstam crawledList.add(url); String pageContents = downloadPage(verifiedUrl);
if (pageContents != null && pageContents.length() > 0) { Derīgas saites iegūšana no lapas ArrayList<String> saites = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
uzCrawlList.addAll(saites);
if (searchStringMatches(pageContents, searchString, reģistrjutīgs)) { result.add(URL); System.out.println(url); } }
} atgriezt rezultātu;
}
Galvenā funkcija public static void main(String[] args) { SearchCrawler rāpuļprogramma = jauns SearchCrawler("http://www.itsvse.com/", 100,"Delver_Si"); Thread search = new Thread(crawler); System.out.println("Sākt meklēt..."); System.out.println("rezultāts:"); meklēt.sākt(); izmēģināt { search.join(); } nozveja (InterruptedException e) { TODO Automātiski ģenerēts nozvejas bloks e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Lejupielādes skaits: 591)
-
2.png
(72.18 KB, Lejupielādes skaits: 596)
-
3.png
(188.46 KB, Lejupielādes skaits: 606)
Iepriekšējo:PHP veido 82.2% no populārākajām 100 W vietnēmNākamo:Java Edition tīmekļa avota koda skatītājs
|