|
|
Δημοσιεύτηκε στις 30/11/2014 4:56:56 μ.μ.
|
|
|
|

[mw_shl_code=java,true]/** * @author Jack.Wang
* */ εισαγωγή java.io.BufferedReader; εισαγωγή java.io.InputStreamReader; εισαγωγή java.net.URL; εισαγωγή java.util.ArrayList; εισαγωγή java.util.HashMap; εισαγωγή java.util.HashSet; εισαγωγή java.util.LinkedHashSet; εισαγωγή java.util.regex.Matcher; εισαγωγή java.util.regex.Pattern;
Αναζήτηση για προγράμματα ανίχνευσης ιστού δημόσια τάξη SearchCrawler υλοποιεί το Runnable {
/* * Το ρομπότ προσωρινής μνήμης disallowListCache δεν επιτρέπει διευθύνσεις URL αναζήτησης. Το πρωτόκολλο Robot ορίζει ένα αρχείο robots.txt στον ριζικό κατάλογο του ιστότοπου, * Καθορίζει ποιες σελίδες στον ιστότοπο μπορούν να αναζητηθούν για περιορισμένη αναζήτηση. * Το πρόγραμμα αναζήτησης θα πρέπει να παραλείψει αυτές τις περιοχές κατά τη διάρκεια της αναζήτησης, εδώ είναι ένα παράδειγμα robots.txt: * # robots.txt για http://somehost.com/ User-agent: * Απαγόρευση: /cgi-bin/ * Απαγόρευση: /registration # Απαγόρευση ρομπότ στη σελίδα εγγραφής * Απαγόρευση: /login */
private HashMap<String, ArrayList<String>> disallowListCache = new HashMap<String, ArrayList<String>>(); ArrayList<String> errorList = νέα ArrayList<String>(); Μήνυμα σφάλματος Αποτέλεσμα ArrayList<String> = new ArrayList<String>(); Αναζήτηση αποτελεσμάτων Συμβολοσειρά startUrl; Ένα σημείο εκκίνησης για να ξεκινήσετε την αναζήτησή σας int maxUrl; Ο μέγιστος αριθμός διευθύνσεων URL που υποβάλλονται σε επεξεργασία Συμβολοσειρά searchString; Συμβολοσειρές για αναζήτηση boolean caseSensitive = false; Διάκριση πεζών-κεφαλαίων ή όχι boolean limitHost = false; Αν θα γίνει αναζήτηση σε έναν περιορισμένο κεντρικό υπολογιστή
public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { αποτέλεσμα επιστροφής?
}
public void run() { // Ξεκινήστε το νήμα αναζήτησης crawl(startUrl, maxUrl, searchString, limitHost, caseSensitive);
}
Εντοπισμός μορφοποίησης URL private URL verifyUrl(String url) { Γίνεται επεξεργασία μόνο των διευθύνσεων URL HTTP. if (!url.toLowerCase().startsWith("http://")) επιστροφή null; URL verifiedUrl = null; δοκιμάστε { verifiedUrl = νέα διεύθυνση URL(url); } catch (Εξαίρεση e) { επιστροφή null; } επιστροφή verifiedUrl;
}
Ανιχνεύει εάν το ρομπότ επιτρέπει την πρόσβαση στη δεδομένη διεύθυνση URL. private boolean isRobotAllowed(URL urlToCheck) { Συμβολοσειρά κεντρικού υπολογιστή = urlToCheck.getHost().toLowerCase(); Αποκτήστε τον οικοδεσπότη που δίνει το RUL System.out.println("host="+host);
Λάβετε μια κρυφή μνήμη με διευθύνσεις URL που ο κεντρικός υπολογιστής σας δεν επιτρέπει την αναζήτηση ArrayList<String> disallowList = disallowListCache.get(host);
Εάν δεν έχετε ήδη προσωρινή μνήμη, κατεβάστε την και αποθηκεύστε την στην κρυφή μνήμη. αν (disallowList == null) { disallowList = νέα ArrayList<String>(); δοκιμάστε { URL robotsFileUrl = νέα διεύθυνση URL("http://" + κεντρικός υπολογιστής + "/robots.txt"); BufferedReader reader = νέο BufferedReader( νέο InputStreamReader(robotsFileUrl.openStream()));
Διαβάστε το αρχείο robot για να δημιουργήσετε μια λίστα διαδρομών στις οποίες δεν επιτρέπεται η πρόσβαση. Γραμμή χορδών; ενώ ((γραμμή = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) {// Περιέχει "Disallow:" String disallowPath = line.substring("Απαγόρευση:" .length()); Λήψη της διαδρομής προς μη επιτρεπόμενη πρόσβαση
Ελέγξτε για σχολιασμούς. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, commentIndex); Κατάργηση του σχολίου }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Διαδρομές προσωρινής αποθήκευσης στις οποίες δεν επιτρέπεται η πρόσβαση αυτού του κεντρικού υπολογιστή. disallowListCache.put(host, disallowList); } catch (Εξαίρεση e) { επιστροφή αληθής? Δεν υπάρχουν αρχεία robots.txt στον ριζικό κατάλογο του ιστότοπου και επιστρέφει true } }
Αρχείο συμβολοσειράς = urlToCheck.getFile(); System.out.println("Αρχείο getFile()="+αρχείο); για (int i = 0; i < disallowList.size(); i++) { Συμβολοσειρά disallow = disallowList.get(i); if (file.startsWith(disallow)) { επιστροφή ψευδής? } }
επιστροφή αληθής?
}
private String downloadPage(URL pageUrl) { δοκιμάστε { Ανοίξτε τη σύνδεση στη διεύθυνση URL για ανάγνωση. BufferedReader reader = νέος BufferedReader(new InputStreamReader( pageUrl.openStream()));
Διαβάστε τη σελίδα στο buffer. Γραμμή χορδών; StringBuffer pageBuffer = νέο StringBuffer(); ενώ ((γραμμή = reader.readLine()) != null) { pageBuffer.append(γραμμή); }
επιστροφή pageBuffer.toString(); } catch (Εξαίρεση e) { }
επιστροφή null;
}
Καταργήστε το "www" από τη διεύθυνση URL private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); αν (δείκτης != -1) { επιστροφή url.substring(0, ευρετήριο + 3) + url.substring(ευρετήριο + 7); }
επιστροφή (url);
}
Αναλύστε τη σελίδα και βρείτε τον σύνδεσμο private ArrayList<String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList, boolean limitHost) { Μεταγλωττίστε το μοτίβο αντιστοίχισης του συνδέσμου με κανονικές εκφράσεις. Μοτίβο p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
ArrayList<String> linkList = νέα ArrayList<String>(); ενώ (m.find()) { Σύνδεσμος συμβολοσειράς = m.group(1).trim();
αν (link.length() < 1) { να συνεχίσει; }
Παραλείψτε τον σύνδεσμο προς αυτήν τη σελίδα. if (link.charAt(0) == '#') { να συνεχίσει; }
if (link.indexOf("mailto:") != -1) { να συνεχίσει; }
if (link.toLowerCase().indexOf("javascript") != -1) { να συνεχίσει; }
if (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// χειρίζεται απολύτως σύνδεσμος = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + σύνδεσμος; } αλλιώς { Αρχείο συμβολοσειράς = pageUrl.getFile(); if (file.indexOf('/') == -1) {// χειρίζεται σχετικές διευθύνσεις σύνδεσμος = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + σύνδεσμος; } αλλιώς { Διαδρομή συμβολοσειράς = file.substring(0, file.lastIndexOf('/') + 1); σύνδεσμος = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + διαδρομή + σύνδεσμος; } } }
int index = link.indexOf('#'); αν (δείκτης != -1) { σύνδεσμος = link.substring(0, ευρετήριο); }
σύνδεσμος = removeWwwFromUrl(σύνδεσμος);
URL verifiedLink = verifyUrl(σύνδεσμος); αν (verifiedLink == null) { να συνεχίσει; }
/* Αν περιορίσετε τους κεντρικούς υπολογιστές, εξαιρέστε τις διευθύνσεις URL που δεν πληρούν τα κριτήρια */ αν (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { να συνεχίσει; }
Παραλείψτε τους συνδέσμους που έχουν ήδη υποβληθεί σε επεξεργασία. if (crawledList.contains(link)) { να συνεχίσει; }
linkList.add(σύνδεσμος); }
επιστροφή (linkList);
}
Αναζητήστε το περιεχόμενο μιας ιστοσελίδας που έχετε λάβει για να προσδιορίσετε εάν υπάρχει μια καθορισμένη συμβολοσειρά αναζήτησης στη σελίδα
private boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive) { Συμβολοσειρά searchContents = pageContents; if (!caseSensitive) {// if χωρίς διάκριση πεζών-κεφαλαίων searchContents = pageContents.toLowerCase(); }
Μοτίβο p = Pattern.compile("[\\s]+"); Όροι συμβολοσειράς[] = p.split(searchString); για (int i = 0; I < όροι.μήκος; i++) { if (διάκριση πεζών-κεφαλαίων) { if (searchContents.indexOf(terms) == -1) { επιστροφή ψευδής? } } αλλιώς { if (searchContents.indexOf(terms.toLowerCase()) == -1) { επιστροφή ψευδής? } } }
επιστροφή αληθής?
}
Εκτελέστε την πραγματική λειτουργία αναζήτησης public ArrayList<String> crawl(String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = νέο HashSet<String>(); LinkedHashSet<String> toCrawlList = νέο LinkedHashSet<String>();
if (maxUrls < 1) { errorList.add("Μη έγκυρη τιμή μέγιστου αριθμού διευθύνσεων URL."); System.out.println("Μη έγκυρη τιμή μέγιστου αριθμού διευθύνσεων URL."); }
αν (searchString.length() < 1) { errorList.add("Λείπει η συμβολοσειρά αναζήτησης."); System.out.println("Λείπει η συμβολοσειρά αναζήτησης"); }
αν (errorList.size() > 0) { System.out.println("err!!"); επιστροφή errorList; }
Μετακίνηση του www από τη διεύθυνση URL έναρξης startUrl = κατάργησηWwwFromUrl(startUrl);
toCrawlList.add(startUrl); ενώ (toCrawlList.size() > 0) {
αν (maxUrls != -1) { if (crawledList.size() == maxUrls) { διάλειμμα; } }
Λήψη διεύθυνσης URL στο κάτω μέρος της λίστας. url συμβολοσειράς = toCrawlList.iterator().next();
Καταργήστε τη διεύθυνση URL από τη λίστα ανίχνευσης. toCrawlList.remove(url);
Μετατροπή url συμβολοσειράς σε αντικείμενο URL. URL verifiedUrl = verifyUrl(url);
Παραλείψτε τη διεύθυνση URL εάν δεν επιτρέπεται στα ρομπότ να έχουν πρόσβαση σε αυτήν. αν (!isRobotAllowed(verifiedUrl)) { να συνεχίσει; }
Προσθήκη επεξεργασμένων διευθύνσεων URL στο crawledList crawledList.add(url); Συμβολοσειρά pageContents = downloadPage(verifiedUrl);
if (pageContents != null && pageContents.length() > 0) { Λάβετε έναν έγκυρο σύνδεσμο από τη σελίδα ArrayList<String> links = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(σύνδεσμοι);
if (searchStringMatches(pageContents, searchString, caseSensitive)) { result.add(url); System.out.println(url); } }
} αποτέλεσμα επιστροφής?
}
κύρια λειτουργία public static void main(String[] args) { SearchCrawler crawler = νέο SearchCrawler("http://www.itsvse.com/", 100,"Delver_Si"); Αναζήτηση νήματος = νέο νήμα (ανιχνευτής); System.out.println("Ξεκινήστε την αναζήτηση..."); System.out.println("αποτέλεσμα:"); search.start(); δοκιμάστε { search.join(); } catch (InterruptedException e) { TODO Μπλοκ σύλληψης που δημιουργείται αυτόματα e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Αριθμός λήψεων: 591)
-
2.png
(72.18 KB, Αριθμός λήψεων: 596)
-
3.png
(188.46 KB, Αριθμός λήψεων: 606)
Προηγούμενος:Η PHP αντιπροσωπεύει το 82.2% των κορυφαίων ιστότοπων 100WΕπόμενος:Πρόγραμμα προβολής πηγαίου κώδικα Web Java Edition
|