He escrito muchos rastreadores de pitón de una sola página antes, y siento que Python sigue siendo muy útil. Aquí uso Java para resumir un rastreador de múltiples páginas, rastreando iterativamente todos los enlaces de la página de semillas y guardarlos todos debajo de la ruta TMP.
1. Prefacio
La implementación de este rastreador requiere soporte de dos estructuras de datos, cola no visitada (priorityqueue: puede calcular la importancia de la URL) y la tabla visitada (Hashset: puede averiguar rápidamente si la URL existe); La cola se utiliza para implementar el rastreo de ancho primero, y la tabla visitada se usa para registrar la URL rastreada, ya no se arrastra repetidamente, evitando los anillos. Los kits de herramientas requeridos por los rastreadores de Java incluyen httpclient y htmlparser1.5, y puede ver la descarga de la versión específica en el repositorio maven.
1. Sitio web de Target: Sina http://www.sina.com.cn/
2. Captura de pantalla de los resultados:
Hablemos sobre la implementación de rastreadores. El código fuente se cargará a GitHub más tarde. Amigos que lo necesitan pueden dejar un mensaje:
2. Programación de rastreadores
1. Cree la URL de la página de semillas
MyCrawler Crawler = nuevo mycrawler ();
crawler.crawling (nueva cadena [] {"http://www.sina.com.cn/"});
2. Inicializa la tabla no visitada como la URL de semilla anterior
Linkqueue.addunVisitedurl (semillas [i]);
3. La parte de implementación lógica más importante: elimine la URL que no se ha visitado en la cola, descargla, luego agregue la tabla visitada, analice otras URL en la página de URL cambiada y agregue la cola no leída a la cola no visitada; itera hasta que la cola esté vacía, por lo que esta red de URL sigue siendo muy grande. Tenga en cuenta que la descarga de la página y la resolución de la página aquí requieren la implementación del kit de herramientas Java, y el uso del kit de herramientas se explica en detalle a continuación.
while (! LinkQueue.UnVisitedUrlSempty () && LinkQueue.getVisitedurlnum () <= 1000) {// La url del encabezado sale de la cadena de cola visitUrl = (string) Linkqueue.unVisitedurldequeue (); if (visiturl == null) continuar; Downloadfile downloadfile downloader = new downloadFile (); // descargar la página web downloader.downloadFile (visitUrl); // La URL se coloca en la URL visitada LinkQueue.AddVisitedurl (visiturl); // Extraiga la URL del conjunto de página web de descarga <String> enlaces = htmlparserTool.extraclinks (visitUrl, filtro); // nueva URL no visitada se une para (enlace de cadena: enlaces) {linkQueue.addunVisitedUrl (enlace); }}4. Descargar Toolkit para la siguiente página HTML
public String downloadFile (String url) {String filePath = null; / * 1. Genere el objeto httpclinet y establezca los parámetros */ httpclient httpclient = new httpclient (); // Establezca el tiempo de espera de conexión HTTP para 5s httpclient.gethttpconnectionManager (). GetParams (). SetConnectionTimeOut (5000); / * 2. Genere el objeto getMethod y establezca los parámetros */ getMethod getMethod = new getMethod (url); // Establezca el tiempo de espera de solicitud Get para 5s getMethod.getParams (). SetParameter (httpmethodparams.so_timeout, 5000); // Establecer el procesamiento de reintento de solicitud getMethod.getParams (). SetParameter (httpmethodparams.retry_handler, nuevo defaulthttpmethodcryryHandler ()); /* 3. Ejecutar http get solicitud*/ try {int statuscode = httpclient.executemethod (getMethod); // Determinar el código de estado de acceso if (statuscode! = httpstatus.sc_ok) {system.err.println ("Método fallido:" + getMethod.getStatusline ()); filepath = nulo; }/* 4. Process Http Respuesta Content*/byte [] ResponseBody = getMethod.getResponseBody (); // Leer como una matriz de byte // Generar el nombre del archivo al guardar según la página web url filePath = "temp //" + getFileByUrl (url, getMethod.getResponseHeader ("content-type").). Savetolocal (ResponseBody, FilePath); } catch (httpexception e) {// ocurrió una excepción fatal, que puede ser que el protocolo es incorrecto o hay un problema con el contenido devuelto.out.println ("¡Verifique su dirección HTTP proporcionada!"); E.PrintStackTrace (); } catch (ioException e) {// ocurrió una excepción de red E.PrintStackTrace (); } Finalmente {// libera la conexión getMethod.ReleaseConnection (); } retorno filepath; }5. HTML Page Hool Toolkit:
Public static set <String> Extraclinks (String URL, LinkFilter Filter) {Set <String> Links = new Hashset <String> (); intente {parser parser = new Parser (URL); parser.setEncoding ("GB2312"); // 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; }6. La página no visitada se guarda utilizando priorityqueue con colas preferidas, principalmente para aplicar a algoritmos como PageRank. Algunas URL son más leales; La tabla visitada se implementa utilizando hashset, preste atención a encontrar rápidamente si existe;
Public Class Linkqueue {// COLECCIÓN URL CONSIGO SET estático privado VisitedUrl = new Hashset (); // colección de url de URL cola estática privada sin visitedurl = new priorityqueue (); // Obtener URL cola public static Queue getunVisitedUrl () {return UnVisitedUrl; } // Agregar a la cola de URL visitada public static void addVisitedurl (url de cadena) {visitedurl.add (url); } // Eliminar URL de URL accedido void estático público removeVisitedurl (url de cadena) {visitedurl.remove (url); } // Las URL no visitadas están fuera de la cola Public Static Object UnVisitedurldequeue () {return un visitedurl.poll (); } // Asegúrese de que cada URL se accede solo una vez que el público estático público addUnVisitedurl (String url) {if (url! = Null &&! Url.trim (). Equals ("") &&! Visitedurl.Contains (url) &&! Unvisedurl.contains (url)) sin visitedurl.add (url); } // Obtenga el número de URL a las que se ha accedido a public static int getVisitedurlnum () {return visitedurl.size (); } // juzga si la cola de URL no visitada está vacía pública estática booleana no visitedurlsEmpty () {return no visitedurl.isEmpty (); }}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.