El primer paso es implementar LinkQueue y filtrar y almacenar URL.
import java.util.arrayList; import java.util.collections; import java.util.hashset; import java.util.list; import java.util.set; Public Class LinkQueue {// COLECCIÓN URL CONSIGADA SET ESTÁTICO PRIVADO <String> VisitedUrl = Collections.SynChronizedSet (new Hashset <String> ()); // Lista estática privada de URL no accesible <String> UnVisitedUrl = Collections.synchronizedList (new ArrayList <String> ()); // Las URL no visitadas están fuera de la cola public Public static String UnVisitedurDequeue () {if (unvisiturl.size ()> 0) {string url = unvisiturl.remove (0); visitedurl.add (url); URL de retorno; } return null; } // Verifique cuándo se agrega una nueva URL, asegurando que solo se agrega una vez que el público estático público void adunVisitedurl (url de cadena) {if (url! = Null &&! Url.trim (). Equals ("") &&! Visitedurl.contains (url) &&! Unvisiturl.contains (Url) sin visisiturl.Add (url) &&! Unvisiturl.contains (Url) no visitados (url); } // Determinar si la cola de URL no visitada es vacía pública estática booleana no visitedurlsEmpty () {return un visitedurl.isEmpty (); }}El segundo paso es recopilar los enlaces en cada URL y filtrar para generar nuevos enlaces.
import java.util.hashset; import java.util.set; importar org.htmlparser.node; importar org.htmlparser.nodeFilter; importar org.htmlparser.parser; importar org.htmlparser.filters.nodeClassFilter; importar org.htmlparser.filters.orfilter; importar org.htmlparser.tags.linktag; importar org.htmlparser.util.nodelist; importar org.htmlparser.util.parserexception; / ** * Filtrar la URL de HTTP para obtener URL que puedan cumplir con las reglas * @Author Administrator * */ public class ParserHttpurl {// Obtenga un enlace en un sitio web, Filter se usa para filtrar enlaces públicos Estatic Set <StracLinks (StracLinks (String URL, LinkFilter Filter) intente {parser parser = new Parser (URL); // filtra el filtro de la etiqueta <Frame> para extraer el enlace representado por el atributo SRC en la etiqueta de cuadro NodeFilter FrameFilter = new NodeFilter () {public Boolean Acept (nodo nodo) {if (node.getText (). Startswith ("frame src =")) {return true; } else {return false; }}}}; // Orfilter para establecer etiquetas de filtrado <a> y <Frame> etiquetas orfilter linkfilter = new Orfilter (new NodeClassFilter (LinkTag.Class), FrameFilter); // Obtenga todas las etiquetas filtradas Nodelist list = parser.extractallNodeStHatMatch (LinkFilter); for (int i = 0; i <list.size (); i ++) {nodo tag = list.elementat (i); if (etiqueta instanciaf linktag) // <a> etiqueta {linktag link = (linktag) etiqueta; String Linkurl = Link.getLink (); // url if (filter.accept (linkurl)) links.Add (linkurl); } else // <Frame> Tag {// Extraiga el enlace al atributo SRC en el marco, como <marco src = "test.html"/> string marrume = tag.gettext (); int start = Frame.IndexOf ("src ="); Frame = Frame.Substring (Start); int end = Frame.IndexOf (""); if (end == -1) end = frame.indexof (">"); String FrameUrl = Frame.Substring (5, final - 1); if (filter.accept (frameUrl)) links.Add (frameUrl); }} Catch (ParSerException e) {E.PrintStackTrace (); } enlaces de retorno; }}Paso 3: Implemente la función de descarga de imágenes
import java.io.file; import java.io.fileOutputStream; import java.io.inputstream; import java.net.url; import java.net.urlconnection; import java.util.arrayList; import java.util.list; import java.util.regex.matcher; import java.util.regex.pattern; / *** * Java Crawl Network Pictures * * @author SwingLife * */ public class downloadPic {// codificación de cadena final estática privada ECODING = "UTF-8"; // Obtenga la etiqueta IMG String final privada Final String imgurl_reg = "<img.*Src = (.*?) [^>]*?>"; // Obtenga la cadena final estática privada regular imgsrc_reg = "http:/"? (.*?) (/"|> | // s+)"; public static void downloadPic (url de cadena) {// Obtener la cadena de contenido de texto html html = null; intente {html = downloadPic.gethtml (url); } catch (Exception e) {E.PrintStackTrace (); } if (null! = html &&! "". Equals (html)) {// Obtenga la lista de etiquetas de imagen <String> imgurl = downloadPic.getImageUrl (html); // Obtenga la lista de direcciones SRC de imagen <String> imgsrc = downloadPic.getImagesRC (imgurl); // Descargar la imagen descargarloadPic.download (imgsrc); }} / *** * Obtener contenido html * * @param url * @return * @throws excepción * / private static string gethtml (string url) arroja excepción {url uri = new url (url); URLConnection Connection = uri.openconnection (); InputStream in = Connection.getInputStream (); byte [] buf = nuevo byte [1024]; int longitud = 0; StringBuffer sb = new StringBuffer (); while ((longitud = in.read (buf, 0, buf.length))> 0) {sb.append (new String (buf, ecoding)); } in.close (); return sb.ToString (); } / *** * Get ImageUrl Dirección * * @param html * @return * / private static list <String> getImageUrl (string html) {matcher matcher = patrón.compile (imgurl_reg) .matcher (html); List <String> ListimGurl = New ArrayList <String> (); while (matcher.find ()) {listimgurl.add (matcher.group ()); } return listImGurl; } / *** * Obtenga la dirección de IMOSSRC * * @param listImageUrl * @return * / private static list <String> getImageSrc (list <string> listImageUrl) {list <String> listimgSrc = new ArrayList <String> (); for (imagen de cadena: listImageUrl) {matcher matcher = patrón.compile (imgsrc_reg) .matcher (imagen); while (matcher.find ()) {listImgSrc.Add (matcher.group (). substring (0, matcher.group (). longitud () - 1)); }} return listImgSrc; }/**** Descargar imagen** @param listimgSrc*/private static void download (list <string> listimgsrc) {for (string url: listimgsrc) {try {string imageName = url.substring (url.lastindexof ("/") + 1, url.length ()); URL uri = nueva URL (URL); InputStream in = uri.openStream (); FileOutputStream fo = new FileOutputStream (nuevo archivo (ImageName)); byte [] buf = nuevo byte [1024]; int longitud = 0; while ((longitud = in.read (buf, 0, buf.length))! = -1) {fo.write (buf, 0, longitud); } in.close (); fo.close (); } catch (Exception e) {E.PrintStackTrace (); }}}}Interfaz de filtro real, definir la interfaz de filtro:
Public Interface Filter {public boolean Acept (URL de cadena); }Paso 4: Implementación de reglas de filtrado:
Public Class Crawler { /** * Crawl Process * * @return * @param Seeds * /public void Crawling (String URL) {// Definir filtro filtro filtro = nuevo filtro () {public boolean acepte (url de cadena) {// Las reglas de filtrado aquí se cambian de acuerdo con las reglas de los sitios web que deben ser rastreados. Se recomienda utilizar la implementación regular. Estoy rastreando el sitio web de Douban if (url.indexof ("doucan.com/group/topic")! = -1 || url.indexof ("doucan.com/group/haixiuzu/discussion?start")! = -1) return verdadero; else devuelve falso; }}; // Inicializar la cola URL LinkQueue.addunVisitedurl (URL); // condición de bucle, el enlace a rastrear no está vacío, mientras que (! LinkQueue.unVisitedurLSEmpty ()) {// La url del encabezado sale de la cadena de cola visitUrl = (string) Linkqueue.unVisitedurldequeue (); if (visiturl == null) continuar; DescargarloadPic.downloadPic (visitUrl); // Extraiga la URL de la página web descargada Conjunto de <string> enlaces = parserhttpurl.extraclinks (visitUrl, filtro); // nuevo enqueue de URL no visitado para (enlace de cadena: enlaces) {linkQueue.addunVisedUrl (enlace); }}} // Entrada de método principal public static void main (string [] args) {Crawler Crawler = new Crawler (); crawler.crawling ("http://www.douban.com/group/haixiuzu/discussion?start=0"); }}Resumir
El anterior es el código de ejemplo para la implementación de Java de las imágenes del sitio web de rastreo presentadas por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!