La première étape consiste à implémenter LinkQueue et le filtre et le stockage des URL.
import java.util.arraylist; Importer java.util.collections; import java.util.hashset; Importer java.util.list; import java.util.set; classe publique LinkQueue {// Collection d'URL accessible Set statique privé <string> visitedUrl = collections.SynchronizedSet (new HashSet <string> ()); // Liste statique privée URL non accessible <string> UnvisitedUrl = collections.SynchronizedList (new ArrayList <string> ()); // Les URL non visitées sont hors de la file d'attente publique statique UNVISITEDURLDEQUEUE () {if (unvisitedUrl.size ()> 0) {String url = unvisitedUrl.Remove (0); VisitedUrl.Add (URL); URL de retour; } return null; } // Vérifiez quand une nouvelle URL est ajoutée, en veillant à ce qu'elle ne soit ajoutée qu'une fois le public statique void addUnVisitedUrl (URL de chaîne) {if (url! = Null &&! Url.trim (). Égal ("") &&! VisitedUrl.ConTains (url) &&! Unvisitedurl.contains (url))) UnvisiTeurl) &&! Unvisitedurl. } // Déterminez si la file d'attente URL non visitée est vide publique statique booléenne UnvisitedUrlSempty () {return unvisitedUrl.Isempty (); }}La deuxième étape consiste à collecter les liens sous chaque URL et à filtrer pour générer de nouveaux liens.
import java.util.hashset; import java.util.set; import org.htmlparser.node; import org.htmlparser.nodeFilter; import org.htmlparser.parser; import org.htmlparser.filters.nodeclassFilter; import org.htmlparser.filters.orfilter; import org.htmlparser.tags.linktag; import org.htmlparser.util.nodelist; import org.htmlparser.util.parserexception; / ** * Filtrez URL de HTTP pour obtenir des URL qui peuvent se conformer aux règles * @Author Administrator * * / public class ParserHttpurl {// Obtenez un lien sur un site Web, le filtre est utilisé pour filtrer les liens publics static <string> extraclinks (String url, linkfilter filter) {set <Ratt> links = new Hashset <);); try {analyser parser = new parser (url); // Filtre le filtre de la balise <-frame> pour extraire le lien représenté par l'attribut SRC dans la balise de trame NodeFilter frameFilter = new nodeFilter () {public booléen accepte (node node) {if (node.getText (). StartSwith ("frame src =")) {return true; } else {return false; }}}}; // ORFILTER pour définir le filtrage <a> Tags et <trame> TAGS ORFILTER LinkFilter = new OrFilter (new NodeClassFilter (linktag.class), framefilter); // Obtenez toutes les balises filtrées nodelist list = parser.ExtractAllNodesthatMatch (linkFilter); for (int i = 0; i <list.size (); i ++) {node tag = list.elementat (i); if (tag instanceof linktag) // <a> tag {linktag link = (linktag) tag; String linkUrl = link.getLink (); // url if (filter.accept (linkUrl)) links.add (linkUrl); } else // <-frame> tag {// Extraire le lien vers l'attribut SRC dans le cadre, tel que <frame src = "test.html" /> String frame = tag.getText (); int start = frame.indexof ("src ="); frame = cadre.SubString (start); int end = frame.indexof (""); if (end == -1) end = frame.indexof (">"); String frameUrl = frame.substring (5, end - 1); if (filter.accept (frameurl)) links.add (frameurl); }} catch (parserexception e) {e.printStackTrace (); } return liens; }}Étape 3: Implémentez la fonction de téléchargement d'image
Importer java.io.file; Importer java.io.fileOutputStream; import java.io.inputStream; Importer java.net.url; import java.net.urlconnection; import java.util.arraylist; Importer java.util.list; import java.util.regex.matcher; import java.util.regex.pattern; / *** * Java Crawl Network Pictures * * @author swingLife * * / public class downloadPic {// Encoding private static final String ecoding = "utf-8"; // Obtenez la chaîne finale statique privée IMG régulière imgurl_reg = "<img. * Src = (. *?) [^>] *?>"; // Obtenez la chaîne finale statique privée régulière imgsrc_reg = "http: /"? (. *?) (/ "|> | // s +)"; public static void downloadPic (string url) {// Obtenez la chaîne de contenu de texte html html = null; try {html = downloadpic.gethtml (url); } catch (exception e) {e.printStackTrace (); } if (null! = html &&! "". equals (html)) {// Obtenez la liste des balises d'image <string> imgurl = downloadpic.getImageUrl (html); // Obtenez la liste d'adresses SRC d'image <string> imgsrc = téléchargement.getImagesrc (imgurl); // Téléchargez l'image downloadloadpic.download (IMGSRC); }} / *** * Obtenez le contenu HTML * * @param url * @return * @throws exception * / private static String gethtml (String url) lève exception {url uri = new URL (url); Connexion UrlConnection = URI.OpenConnection (); InputStream dans = connection.getInputStream (); octet [] buf = nouveau octet [1024]; int length = 0; StringBuffer sb = new StringBuffer (); while ((longueur = in.read (buf, 0, buf.length))> 0) {sb.append (new String (buf, ecoding)); } in.close (); return sb.toString (); } / *** * Obtenez l'adresse ImageUrl * * @param html * @return * / Liste statique privée <String> getImageUrl (String html) {Matcher Matcher = Pattern.Compile (imgurl_reg) .matcher (html); List <string> listImGurl = new ArrayList <string> (); while (Matcher.Find ()) {listImgurl.add (Matcher.Group ()); } return listImgurl; } / *** * Obtenez l'adresse ImagesRc * * @param listImageUrl * @return * / Liste statique privée <string> getImagesrc (list <string> listImageUrl) {list <string> listImgsrc = new ArrayList <string> (); for (String Image: listImageUrl) {Matcher Matcher = Pattern.Compile (imgsrc_reg) .matcher (image); while (Matcher.Find ()) {listImgsrc.Add (Matcher.Group (). substring (0, Matcher.Group (). Length () - 1)); }} return listImgsrc; } / *** * Télécharger l'image * * @param listImgsrc * / private static void download (list <string> listImgsrc) {for (String url: listImgsrc) {try {String ImageName = url.LengthD ()); URL URI = nouvelle URL (URL); InputStream dans = uri.openStream (); FileOutputStream fo = new FileOutputStream (nouveau fichier (ImageName)); octet [] buf = nouveau octet [1024]; int length = 0; while ((longueur = in.read (buf, 0, buf.length))! = -1) {fo.write (buf, 0, longueur); } in.close (); fo.close (); } catch (exception e) {e.printStackTrace (); }}}}Interface filtrante réelle, définir l'interface du filtre:
Filtre d'interface publique {public boolean accepte (URL de chaîne); }Étape 4: Mise en œuvre des règles de filtrage:
classe publique Crawler {/ ** * Processus de rampe * * @return * @param semers * / public void Crawling (URL de chaîne) {// définir filtre filtre filtre = nouveau filtre () {public booléen accepte (URL de chaîne) {// Les règles de filtrage ici sont modifiées selon les règles des sites Web qui doivent être rampantes. Il est recommandé d'utiliser une implémentation régulière. Je rampe sur le site Web Douban if (url.indexof ("douban.com/group/topic")! = -1 || url.indexof ("douban.com/group/haixiuzu/discussion?start")! = -1) return true; else return false; }}; // Initialiser la file d'attente URL LinkQueue.AddunVisitedUrl (URL); // Condition de boucle, le lien à ramper n'est pas vide tandis que (! LinkQueue.UnVisitedUrlSempty ()) {// L'URL de l'en-tête quitte la file d'attente STRACE VISTURL = (String) LinkQueue.UnVisitedUrlDequeue (); if (VisitUrl == null) continue; DownloadloadPic.DownloadPic (VisitUrl); // Extraire l'URL de la page Web téléchargée SET <string> links = ParserHttpurl.ExtracLinks (VisitUrl, filtre); // Nouvelle enquille URL non visitée pour (lien de chaîne: liens) {linkqueue.addunvisedUrl (lien); }}} // Entrée de méthode principale Public static void main (String [] args) {Crawler Crawler = new Crawler (); crawler.crawling ("http://www.douban.com/group/haixiuzu/discussion?start=0"); }}Résumer
Ce qui précède est l'exemple de code pour la mise en œuvre de Java des images de site Web rampantes introduites par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!