Ich habe schon viele einseitige Python-Crawler geschrieben und ich bin der Meinung, dass Python immer noch sehr nützlich ist. Hier verwende ich Java, um einen mehrseitigen Crawler zusammenzufassen, alle Links der Samenseite iterativ zu kriechen und sie alle unter dem TMP-Pfad zu speichern.
1. Vorwort
Die Implementierung dieses Crawlers erfordert Unterstützung durch zwei Datenstrukturen, die nicht besuchte Warteschlange (PriorityQueue: Kann die Bedeutung der URL berechnen) und besuchte Tabelle (Hashset: Kann schnell herausfinden, ob die URL existiert); Die Warteschlange wird zum Implementieren von Breiten-First-Crawl verwendet, und die besuchte Tabelle wird verwendet, um die krabble URL aufzuzeichnen, die nicht mehr wiederholt krabbelt und Ringe vermeiden. Zu den von Java -Crawlern erforderlichen Toolkits gehören Httpclient und HTMLParser1.5, und Sie können den Download der spezifischen Version im Maven -Repo anzeigen.
1. Zielwebsite: Sina http://www.sina.com.cn/
2. Screenshot der Ergebnisse:
Lassen Sie uns über die Implementierung von Crawlers sprechen. Der Quellcode wird später auf GitHub hochgeladen. Freunde, die es brauchen, können eine Nachricht hinterlassen:
2. Crawler -Programmierung
1. Erstellen Sie die URL der Samenseite
MyCrawler Crawler = New MyCrawler ();
crawler.crawling (new String [] {"http://www.sina.com.cn/"});
2. Initialisieren Sie die nicht besuchte Tabelle wie die obige Samen -URL
LinkQueue.addunvisedUrl (Samen [i]);
3.. Der wichtigste logische Implementierungsteil: Nehmen Sie die URL heraus, die in der Warteschlange nicht besucht wurde, laden Sie sie herunter, fügen Sie die besuchte Tabelle hinzu, analysieren Sie andere URLs auf der geänderten URL -Seite und fügen Sie die ungehelte Warteschlange zur nicht besuchten Warteschlange hinzu; Iterieren Sie, bis die Warteschlange leer ist, sodass dieses URL -Netzwerk immer noch sehr groß ist. Beachten Sie, dass die Seite "Seits" und "Seitenauflösung hier" für die Implementierung von Java Toolkit erforderlich ist und die Verwendung des Toolkits im Detail erläutert wird.
while (! if (VisitUrl == NULL) Weiter; DownloadFile downloadFile downloader = new DownloadFile (); // Die Webseiten -Downloader.DownloadFile (besuchen) herunterladen; // Die URL wird in die besuchte URL linkqueue.addvisedUrl (VisitUrl) platziert; // Die URL aus dem Download -Webseite set <string> links = htmlParSertool.extracts (VisitUrl, Filter) extrahieren; // Neue nicht besuchte URL -Join für (String -Link: Links) {linkQueue.addunvisedUrl (Link); }}4. Download Toolkit für die folgende HTML -Seite
public String downloadFile (String url) {String filepath = null; / * 1. generieren Sie das httpclinet -Objekt und setzen Sie die Parameter */ httpclient httpclient = new httpclient (); // Setzen Sie das HTTP -Verbindungszeitlimit für 5S httpclient.gethttpConnectionManager (). GetParams (). SetConnectionTimeout (5000); / * 2. generieren Sie das GetMethod -Objekt und setzen Sie die Parameter */ getMethod getMethod = new GetMethod (URL); // Setzen Sie das Get Request Timeout für 5S getMethod.getParams (). SetParameter (httpMethodParams.so_timeout, 5000); // Anfrage RETRY RECY -Verarbeitung getMethod.getParams (). SetParameter (httpMethodParams.retry_handler, New DefaulthttpMethodryHandler ()); /* 3.. Http GET -Anforderung ausführen*/ try {int statusCode = httpclient.executemethod (getMethod); // Bestimmen Sie den Statuscode von Access if (StatusCode! filepath = null; }/* 4. Process http Antwortinhalt*/byte [] responseBody = getMethod.getResponseBody (); // als Byte-Array lesen // den Dateinamen generieren, wenn Sie nach dem Webseiten-URL-Filepath = "temp //" + getFilenAmyurl (url, getMeth.GetRespath) (content-ttype) (GetMeth.GetRespath) (content-ttype) (GetMeth.GetRespath) ("content-ttype"). Savetolocal (Reaktionsbody, Filepath); } catch (httpexception e) {// Es trat eine fatale Ausnahme auf, die sein kann, dass das Protokoll falsch ist oder ein Problem mit dem zurückgegebenen Inhaltssystem.out.println ("Bitte überprüfen Sie Ihre bereitgestellte HTTP -Adresse!"); E. printstacktrace (); } catch (ioException e) {// Eine Netzwerkausnahme ist E. printstacktrace (); } endlich {// die Verbindung getMethod.releaseconnection () freigeben; } return filepath; }5. HTML -Seite Parsing Toolkit:
public static set <string> extraclinks (String -URL, Linkfilter -Filter) {set <string> links = new HashSet <String> (); Versuchen Sie {Parser Parser = New Parser (URL); Parser.SetEnCoding ("GB2312"); // Filter des <Ream> -Tags filtern, um den durch das SRC -Attribut dargestellten Link im Frame -Tag NodeFilter FrameFilter = new nodeFilter () {public boolean Accept (Node Node) {if (node.getText () zu extrahieren. } else {return false; }}}}; // Orfilter zum Festlegen von Filterung <a> Tags und <Ream> Tags Orfilter linkFilter = new orfilter (neuer nodeclassfilter (linktag.class), FrameFilter); // Alle gefilterten Tags nodelist liste = parser.extractAllnodesthatMatch (linkFilter); für (int i = 0; i <list.size (); i ++) {node tag = list.elementat (i); if (Taginstanceof linkTag) // <a> Tag {linkTag link = (linktag) tag; String linkurl = link.getLink (); // url if (filter.accept (linkUrl)) links.add (linkUrl); } else // <Ream> Tag {// extrahieren Sie den Link zum SRC -Attribut im Bild, z. int start = Frame.Indexof ("src ="); Frame = Frame.Substring (Start); int End = Frame.Indexof (""); if (end == -1) end = Frame.Indexof (">"); String Frameurl = Frame.Substring (5, Ende - 1); if (filter.accept (Frameurl)) links.add (Frameurl); }}} catch (parsexception e) {e.printstacktrace (); } Return Links; }6. Die nicht besuchte Seite wird unter Verwendung von Prioritätsqueue mit bevorzugten Warteschlangen gespeichert, die hauptsächlich für Algorithmen wie PageRank gelten. Einige URLs sind loyaler; Die besuchte Tabelle wird mit Hashset implementiert. Achten Sie darauf, schnell festzustellen, ob sie existiert.
public class linkqueue {// Zugriff auf URL -Sammlung private statische Set VisitedUrl = new Hashset (); // Zugriff auf URL -Sammlung private statische Warteschlange UnvidedUrl = New PriorityQueue (); // URL -Warteschlange öffentliche statische Warteschlange erhalten, GetunvisedUrl () {return UnvisedUrl; } // zur besuchten URL -Warteschlange öffentlich statische statische void addvisedUrl (String url) {VisitedUrl.add (URL); } // Zugriff auf URL entfernen public static void removevidedUrl (String url) {VisitedUrl.remove (URL); } // nicht genannte URLs sind aus der Warteschlange, die das öffentliche statische Objekt nicht besucht hat. } // Stellen Sie sicher, dass auf jede URL zugegriffen wird. } // Erhalten Sie die Anzahl der URLs, auf die auf öffentliches statisches int zugegriffen wurde. } // Beurteilen Sie, ob die nicht besuchte URL -Warteschlange leer ist, öffentlich statische booleanische nicht besucht, unde, {return unvisedUrl.isempty (); }}Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.