Hoy, la compañía tiene la necesidad de hacer algunos datos de datos después de consultar en el sitio web especificado, por lo que tomó algún tiempo escribir una demostración para el uso de la demostración.
La idea es muy simple: es acceder al enlace a través de Java, luego obtener la cadena HTML y luego analizar los datos requeridos como el enlace. Técnicamente, JSoup es conveniente para el análisis de la página. Por supuesto, Jsoup es muy conveniente y simple. Puede saber cómo usarlo con una sola línea de código:
Documento doc = jSoup.Connect ("http://www.oschina.net/") .data ("Query", "java") // solicitar parámetros.useragent ("i 'm jsoup") // set user-agent .cookie ("auth", "token") // set Cookie. // Use el método de publicación para acceder a la URL Todo el proceso de implementación se describe a continuación:
1. Analice las páginas que deben analizarse:
Sitio web: http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicIndexQuery
página:
Primero haga una consulta en esta página: Observe la URL, los parámetros, el método, etc. solicitados, etc.
Aquí usamos la herramienta de desarrollador incorporada (clave de acceso directo F12), y los siguientes son los resultados de la consulta:
Podemos ver la URL, el método y los parámetros. Después de saber cómo o la URL de consulta, comenzaré el código a continuación. Para reutilizar y extender, he definido varias clases:
1. Regla.java se usa para especificar URL de consulta, método, parámetros, etc.
paquete com.zhy.spider.rule; / ** * clase de reglas * * @author zhy * */ public class regla {/ ** * link */ private string url; / ** * colección de parámetros */ string private [] params; / *** Valores correspondientes al parámetro*/ valores de cadena privada []; / ** * Para el HTML devuelto, establezca el tipo de tipo */ private String resulttagName; / ** * class / id / selección * Establezca el tipo de resultado TaultagName, predeterminado a id * / private int type = id; / ** *get / post *el tipo de solicitud, predeterminado get * / private int requestMoethod = get; Public final estática int get = 0; Public final static int post = 1; Public final static int class = 0; Public final estática int id = 1; Public final static int selección = 2; Regla pública () {} Regla pública (String url, string [] params, string [] valores, string resultTagName, int type, int requestMoethod) {super (); this.url = url; this.params = params; this.values = valores; this.ResultTagName = resulttagName; this.type = type; this.RequestMoethod = requestMoethod; } public String getUrl () {return url; } public void seturl (url de cadena) {this.url = url; } public String [] getParams () {return params; } public void setParams (string [] params) {this.params = params; } public String [] getValues () {valores de retorno; } public void setValues (string [] valores) {this.values = valores; } public String getResultTagName () {return denteTagName; } public void setResultTagName (String dulteTagName) {this.ResultTagName = resulttagName; } public int getType () {Tipo de retorno; } public void settype (int type) {this.type = type; } public int getRequestMoethod () {return requestMoethod; } public void setRequestMoethod (int requestMoethod) {this.RequestMoethod = requestMoethod; }}Permítanme poner brevemente: esta clase de reglas define toda la información que necesitamos durante el proceso de consulta, lo que facilita nuestra extensión y reutilización de código. Es imposible para nosotros escribir un conjunto de código para cada sitio web que debe arrastrarse.
2. El objeto de datos requerido, actualmente solo necesita enlaces, linkypedata.java
paquete com.zhy.spider.bean; clase pública linktypedata {private int id; / *** Dirección de enlace*/ String private LinkHref; / *** Título del enlace*/ private String LinkText; / *** Resumen*/ Resumen de cadena privada; / *** Contenido*/ Contenido de cadena privada; public int getId () {return id; } public void setid (int id) {this.id = id; } public String getLinkHref () {return LinkHref; } public void setLinkHref (String LinkHref) {this.linkhref = linkhref; } public String getLinkText () {return LinkText; } public void setLinkText (String LinkText) {this.linkText = LinkText; } public String getSumMary () {resumen de retorno; } public void setSummary (resumen de cadena) {this.summary = sumario; } public String getContent () {return content; } public void setContent (contenido de cadena) {this.content = content; }} 3. Clase de consulta principal: ExtractService.java
paquete com.zhy.spider.core; import java.io.ioException; import java.util.arrayList; import java.util.list; import java.util.map; import javax.swing.plaf.textui; importar org.jsoup.connection; importar org.jsoup.jsoup; importar org.jsoup.nodes.document; importar org.jsoup.nodes.element; importar org.jsoup.select.elements; import com.zhy.spider.bean.linktypedata; import com.zhy.spider.rule.rule; import com.zhy.spider.rule.ruleException; import com.zhy.spider.util.textutil; / ** * * * @author zhy * */ public class ExtractService {/ ** * @param regla * @return */ public static list <linkypedata> extracto (regla regla) {// realizar verificación necesaria de regla validaterule (regla); Lista <LinkTypedata> DataS = New ArrayList <LinkTyPedata> (); LinkTypedata data = null; Pruebe { / ** * regla de parse * / string url = rule.getUrl (); Cadena [] params = regla.getParams (); Cadena [] valores = regla.getValues (); Cadena resulttagName = regla.getResultTagName (); int type = regla.gettype (); int requestType = regla.getRequestMoethod (); Conexión conn = JSoup.Connect (URL); // Establecer parámetros de consulta if (params! = Null) {for (int i = 0; i <params.length; i ++) {conn.data (params [i], valores [i]); }} // Establecer el tipo de solicitud documento doc = null; switch (requestType) {caso regla.get: doc = conn.timeout (100000) .get (); romper; Regla de casos.post: doc = conn.timeout (1000000) .post (); romper; } // Process Devuelve Data Elements Results = new Elements (); switch (type) {case regla.class: resultados = doc.getElementsByClass (resultTagName); romper; Regla de casos.id: elemento resultado = doc.getElementById (resulttagName); results.Add (resultado); romper; regla de caso.selection: resultados = doc.select (resulttagName); romper; predeterminado: // Cuando resulttagname está vacío, la etiqueta del cuerpo está en desuso si (textUtil.isEmpty (resulttagName)) {resultados = doc.getElementsBytag ("cuerpo"); }} for (resultado de elemento: resultados) {elementos enlaces = resultado.getElementsBytag ("A"); for (enlace de elemento: enlaces) {// String de filtro requerido linkhref = link.attr ("href"); String LinkText = Link.Text (); data = new LinkTyPedata (); data.setLinkHref (linkhref); data.setLinkText (LinkText); data.add (datos); }}} Catch (ioException e) {E.PrintStackTrace (); } datos de retorno; } / *** Realice la verificación necesaria en los parámetros aprobados* / private static void Validaterule (regla de regla) {String url = regla.getUrl (); if (textUtil.isEmpty (url)) {tirar nueva RuleException ("¡URL no puede estar vacía!"); } if (! url.startswith ("http: //")) {throw new RuleException ("Url es incorrecto!"); } if (regla.getParams ()! = null && regla.getValues ()! = null) {if (regla.getParams (). longitud! = reglas.getValues (). longitud) {tire nueva reglaexception ("El valor clave del parámetro no coincide con el número de claves y valores!"); }}}}} 4. Se utiliza una clase de excepción: Ruleexception.java
paquete com.zhy.spider.rule; public class RuleException extiende RuntimeException {public RuleException () {super (); // TODO STUB AUTO GENERADO} Public RuleException (mensaje de cadena, causa de lanzamiento) {super (mensaje, causa); // TODO STUB AUTO GENERADO} Public RuleException (mensaje de cadena) {super (mensaje); // TODO Auto Generado Constructor Stub} Public RuleException (causa de lanzamiento) {super (causa); // TODO STUB del constructor generado automático}} 5. Finalmente, es una prueba: se utilizan dos sitios web para probar aquí, y se utilizan diferentes reglas. Consulte el código para más detalles.
paquete com.zhy.spider.test; import java.util.list; import com.zhy.spider.bean.linktypedata; import com.zhy.spider.core.extractService; import com.zhy.spider.rule.rule; Prueba de clase pública { @org.junit.test public void getDataSbyClass () {regla regla = nueva regla ("http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicIndExquery", New String [] {"Query.enterprisename", "Query.Exter.Emer String[] { "Xingwang"," }, "cont_right", Rule.CLASS, Rule.POST); List<LinkTypeData> extracts = ExtractService.extract(rule); printf(extracts); } @org.junit.Test public void getDatasByCssQuery() { Rule rule = new Rule("http://www.11315.com/search", nueva cadena [] {"Nombre"}, nueva cadena [] {"Xingwang"}, "Div.g-Mn Div.Con-Model", Regla.Selection, Rule.get); System.out.println (data.getLinkText ()); Resultado de salida:
Shenzhen Netxing Technology Co., Ltd. http://14603257.11315.com *******************************************************************************************************************************************************************************************************************encarcarcarcarcarcar trabajocardondgor contrapplesa. Café de Internet de Quanxing# ***************************** El condado de Zichang Xinxing Net City# ********************************* La tercera rama de Shaanxi Tongxing Network Information Co., Ltd.# ******************************************************** XIA Gaoxing Technology Co., Ltd.. ***************************************** SHAANXI Tongxing Network Information Co., Ltd. Xi'an Branch# ******************************************************************************************************************************************************************************************************************anza
Finalmente, use una noticia de Baidu para probar nuestro código: significa que nuestro código es universal.
/** * Use Baidu News, only set the url and keywords and return types*/ @org.junit.Test public void getDatasByCssQueryUserBaidu() { Rule rule = new Rule("http://news.baidu.com/ns", new String[] { "word" }, new String[] { "Alipay" }, null, -1, Regla.get); Lista <NinkTypedata> Extracts = ExtractService.extract (regla); printf (extractos); } Solo establecemos enlaces, palabras clave y tipos de solicitudes, y no establecemos condiciones de filtro específicas.
Resultado: es cierto que hay ciertos datos basura, pero los datos requeridos deben estar rastreados. Podemos establecer reglas. Sección, así como límites adicionales en las condiciones de filtrado.
Sort by time/ns?word=Alipay&ie=utf-8&bs=Alipay&sr=0&cl=2&rn=20&tn=news&ct=0&clk=sortbytime ********************************* x javascript:void(0) ********************************************* Alipay will jointly build a security Fondo con múltiples partes para invertir 40 millones en el primer lote http://finance.ifeng.com/a/20140409/12081871_0.shtml ***************************************** news/ns?word=%E6%94%AF%E4%BB%98%E5%AE%9D+cont:2465146414%7C697779368%7C3832159921&same=7&cl=1&tn=news&rn=30&fm=sd *************************************** Baidu instantánea http://cache.baidu.com/c?m=9d78d513d9d437ab4f9e91697d1cc0161d4381132ba7d3020cd0870fd33a541 B0120A1AC26510D19879E20345DFE1E4BEA876D26605F75A09BBFD91782A6C1352F8A2432721A844A0FD019ADC 1452fc423875d9dad0ee7cdb168d5f18c & p = c96ec64ad48b2def49bd9b780b64 & newp = c4769a4790934ea95ea28e28e 281C4092695912C10E3DD796 & USER = Baidu & fm = SC & Query =%D6%A7%B8%B6%B1%A6 & QID = A400F3660007A6C5 & P1 = 1 **************************************************** OpenSSL vulnerability involves many websites Alipay says there is no data leakage yet http://tech.ifeng.com/internet/detail_2014_04/09/35590390_0.shtml ******************************************* 26 mismas noticias/ns? Palabra =%e6%94%af%e4%bb%98%e5%ae%9d+cont: 3869124100 & mismo = 26 & cl = 1 & tn = news & rn = 30 & fm = Sd ************************************************** http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece7631050803743438014678387492ac3933fc239045C1C3AA5EC 677E4742CE932B2152F4174Bed843670340537B0EFCA8E57DFB08F29288F2C367117845615A71BBB8CB31649B66CF04FDEA44 A7ECFF25E5AAC5A0DA4323C044757E97F1FB4D7017DD1CF4 & P = 8B2A970D95DF11A05AA4C32013 & Newp = 9E39C64AD4DD50FA40 BD9B7C5253D8304503C52251D5CE042ACC & USER = Baidu & fm = SC & Query =%D6%A7%B8%B6%B1%A6 & QID = A400F36660007A6C5 & P1 = 2 ******************************************* La Japón Japón comienza a apoyar los pagos de Alipay de junio http://www.techweb.com.cn/ucweb/news/id/2025843 ******************************************************************************************************************
Si hay deficiencias, puede señalarlas; Si cree que es útil para usted, pruébelo ~~ jaja
Descargue el código fuente, haga clic aquí.
Lo anterior es un ejemplo de información de Java Crawler Rawling. Continuaremos agregando información relevante en el futuro. ¡Gracias por su apoyo para este sitio!