Siempre he tenido curiosidad por Internet. Solía pensar en escribir un rastreador, pero era demasiado vago para implementarlo. Sentí que esto era algo muy problemático. Si ocurriera un pequeño error, tendría que depurar mucho tiempo, lo cual fue una pérdida de tiempo.
Más tarde, pensé que, dado que me había dado una garantía temprano, debo implementarla primero, comenzar con simplicidad, agregar lentamente funciones, implementar una si tengo tiempo y optimizar el código en cualquier momento.
A continuación se muestra una implementación simple de rastrear una página web especificada y guardarla. De hecho, hay varias formas de implementarlo. Aquí hay varias implementaciones de esta función lentamente.
Implementación de rastreo de urlconnection
paquete html; import java.io.bufferedReader; import java.io.fileOutputStream; import java.io.filewriter; import java.io.ioxception; import java.io.inputStreamreader; import java.io.outputStreamwriter; import java.net.net.malformedurexception; import java.net; java.net.url; import java.net.urlconnection; public class Spider {public static void main (string [] args) {String filePath = "d: /124.html"; Cadena url_str = "http://www.hao123.com/"; Url url = nulo; intente {url = new url (url_str); } catch (malformedurexception e) {E.PrintStackTrace (); } String charset = "utf-8"; int sec_cont = 1000; intente {urlconnection url_con = url.openconnection (); url_con.setDoOutput (verdadero); url_con.setreadtimeout (10 * SEC_CONT); url_con.setRequestProperty ("AGENT USER", "Mozilla/4.0 (Compatible; MSIE 7.0; Windows NT 5.1)"); InputStream htm_in = url_con.getInputStream (); Cadena htm_str = inputStream2String (htm_in, charset); saveHtml (filepath, htm_str); } catch (ioException e) {E.PrintStackTrace (); }} /** * Método: SaveHtml * Descripción: Guardar cadena en archivos * @param filepath * ruta de archivo que debe guardar * @param str * string guardado * /public static void savoDHtml (string filepath, string str) {try { / * @supressWarnings ("recursos") Filewriter fw = newwriter (filePath); fw.write (str); fw.flush ();*/ outputStreamWriter outs = new OutputStreamWriter (new FileOutputStream (FilePath, True), "UTF-8"); outs.write (str); System.out.print (STR); outs.close (); } catch (ioException e) {System.out.println ("Error al guardar html ..."); E.PrintStackTrace (); }} / ** * Método: InputStream2String * Descripción: Realice InputStream en String * @param in_st * InputStream que debe convertirse * @param charset * codificador de valor * @throws ioException * Si se produjo un error * / public static string inputStream2String (inputStream in_st, string charetset) lanza iOexception {buffeDeaderader Bufferer Bufferer Bufferer (nie InputStreamReader (in_st, charset)); StringBuffer res = new StringBuffer (); Línea de cadena = ""; while ((línea = buff.readline ())! = null) {res.append (línea); } return res.ToString (); }}Durante el proceso de implementación, el problema de los códigos chinos confusos de las páginas web rastreadas es algo relativamente problemático.
Implementación de rastreo httpclient
HttpClient encontró muchos problemas al rastrear páginas web. Primero, hay dos versiones de httpclient. Uno es Sun incorporado y el otro es un proyecto de código abierto para Apache. Parece que Sun no está incorporado, por lo que no lo implementé, pero adopté el proyecto de código abierto Apache (el httpclient mencionado más tarde se refiere a la versión de código abierto de Apache); En segundo lugar, cuando se usa httpclient, la última versión es diferente de la versión anterior. Después de la versión httpclient 4.x, los paquetes importados son diferentes. Muchas piezas que se encuentran en Internet son la versión httpclient 3.x, por lo que si usa la última versión, es mejor mirar el archivo de ayuda.
Estoy usando Eclipse y necesito configurar el entorno para importar el paquete de referencia.
Primero, descargue httpclient, la dirección es: http://hc.apache.org/downloads.cgi, estoy usando httpclient versión 4.2.
Luego, unzip, encuentre commons-codec-1.6.jar, commons-logging-1.1.jar, httpclient-4.2.5.Jar, httpcore-4.2.4.jar en la carpeta /liber (el número de versión varía dependiendo de la versión descargada, y hay otros archivos jares, que no puedo usar para el momento, por lo tanto, importar las primeras necesarias);
Finalmente, agregue el archivo jar anterior al classpath, es decir, haga clic con el botón derecho en el archivo del proyecto => ruta bulid => configure la ruta de compilación => Agregar jar externo .. y luego agregue el paquete anterior.
Otro método es copiar directamente el paquete anterior a la carpeta lib en la carpeta del proyecto.
Aquí está el código de implementación:
paquete html; import java.io.bufferedReader; import java.io.fileOutputStream; import java.io.ioException; import java.io.inputstreamreader; import java.io.inputStreamReader; import java.io.outputStreamwriter; import org.apache.http.httpentity; org.apache.http.httpesponse; import org.apache.http.client.*; import org.apache.http.client.methods.httpget; import org.apache.http.impl.client.defaulthttttpClient; public class SpiderHttpClient {public static veoid principal (strings). // TODO Método Generado automático String String url_str = "http://www.hao123.com"; String Charset = "UTF-8"; Cadena filepath = "d: /125.html"; HttpClient hc = new DeFaUsTHTTPClient (); Httpget hg = new httpget (url_str); Respuesta httpResponse = Hc.Execute (Hg); Httpentity entity = respuesta.getEntity (); InputStream htm_in = null; if (entity! = null) {system.out.println (entity.getContentLength ()); htm_in = entity.getContent (); Cadena htm_str = inputStream2String (htm_in, charset); saveHtml (filepath, htm_str); }} /** * Método: SaveHtml * Descripción: Guardar cadena en archivos * @param filepath * ruta de archivo que debe guardar * @param str * string guardado * /public static void savoDHtml (string filepath, string str) {try { / * @supressWarnings ("recursos") Filewriter fw = newwriter (filePath); fw.write (str); fw.flush ();*/ outputStreamWriter outs = new OutputStreamWriter (new FileOutputStream (FilePath, True), "UTF-8"); outs.write (str); outs.close (); } catch (ioException e) {System.out.println ("Error al guardar html ..."); E.PrintStackTrace (); }} / ** * Método: InputStream2String * Descripción: Realice InputStream en String * @param in_st * InputStream que debe convertirse * @param charset * codificador de valor * @throws ioException * Si se produjo un error * / public static string inputStream2String (inputStream in_st, string charetset) lanza iOexception {buffeDeaderader Bufferer Bufferer Bufferer (nie InputStreamReader (in_st, charset)); StringBuffer res = new StringBuffer (); Línea de cadena = ""; while ((línea = buff.readline ())! = null) {res.append (línea); } return res.ToString (); }}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.