1. Requisitos
Recientemente, refactoré mi propia aplicación de noticias basada en el diseño de materiales, y la fuente de los datos es un problema.
Un predecesor ha analizado API como Zhihu Daily y Phoenix News, y puede obtener los datos de noticias JSON basados en la URL correspondiente. Para ejercer habilidades de redacción de código, el autor planea rastrear la página de noticias y obtener datos por sí mismo para construir una API.
2. Imagen de efecto
La imagen a continuación es la página del sitio web original
El rastreador obtuvo los datos y los mostró en la terminal móvil de la aplicación
3. Ideas de rastreador
Para el proceso de implementación de la aplicación, puede consultar estos artículos. Este artículo explica principalmente cómo rastrear los datos.
Todo el proceso de operación de la aplicación de grabación en Android para generar imágenes dinámicas GIF: //www.vevb.com/article/78236.htm
Aprenda el diseño de material de Android (RecyclerView en lugar de ListView): //www.vevb.com/article/78232.htm
Android Project Practice Imitation of NetEase News Page (Recyclerview): //www.vevb.com/article/78230.htm
Introducción a JSOUP
JSOUP es un analizador HTML de código abierto para Java, que puede analizar directamente una cierta dirección de URL y contenido de texto HTML.
JSoup tiene principalmente las siguientes funciones:
4. Proceso de rastreo
Obtenga solicitud para obtener la página web HTML
El árbol DOM de la página web de noticias HTML es el siguiente:
El siguiente código utiliza el código para obtener el código fuente HTML devuelto por la solicitud GET basada en la URL especificada.
public static string deget (string urlstr) lanza CommoneException {url url; Cadena html = ""; intente {url = new URL (urlstr); Httpurlconnection Connection = (httpurlconnection) url.openconnection (); Connect.SetRequestMethod ("Get"); Connection.SetConnectTimeOut (5000); Connect.SetDoInput (verdadero); Connect.SetDoOutput (verdadero); if (conexión.getResponseCode () == 200) {inputStream in = Connection.getInputStream (); html = streamtool.intostringbybyte (in); } else {Throw New CommonException ("El valor de retorno del servidor de noticias no es 200"); }} catch (Exception e) {E.PrintStackTrace (); arrojar una nueva Commonexception ("Falló la solicitud"); } return html;}InputStream in = Connection.getInputStream (); La conversión de la secuencia de entrada resultante en una cadena es un requisito común. Lo resumimos y escribimos un método de herramienta.
public class StreamTool {public static string intostringByByte (inputStream in) lanza la excepción {byteArRayOutputStream Outstr = new ByteArRayOutputStream (); byte [] buffer = new Byte [1024]; int len = 0; StringBuilder content = new StringBuilder (); while ((len = in.read (buffer))! = -1) {content.append (new String (buffer, 0, len, "UTF -8")); } Outstr.Close (); return content.toString (); }}5. Analización de HTML para obtener el título
Use el elemento de censura del navegador Google para averiguar el código HTML para el título de noticias:
<Div id = "Artículo_title"> <h1> <a href = "http://see.xidian.edu.cn/html/news/7428.html"> Aviso sobre celebrar una conferencia sobre "Apreciación de las obras musicales clásicas y la estética humana" </a> </h1> </iv>
Necesitamos encontrar la parte de id = "artículo_title" en el método HTML anterior, utilizando el método GetElementById (ID de cadena)
Cadena htmlstr = httptool.doget (urlstr); // Convertir el código fuente html obtenido de la página web en documentDocument doc = jSoup.Parse (htmlstr); elemento artículo = Doc.getElementById ("Artículo");/ Title Element TitleElee = Artículo.getEnementByid ("Artículo"); String titLestryAd6. Obtenga la fecha de lanzamiento y la fuente de información
También descubra el código HTML para
<html> <fead> </head> <body> <div id = "artículo_detail"> <span> 2015-05-28 </span> <span> fuente: </span> <span> número de vistas: <script language = "javascript" src = "http://see.xidian.edu.cn/index.php/news/cLicks/cLicks/cLick./74428" " </script> 477 </span> </div> </body> </html>
La idea es similar a la anterior. Use el método GetElementById (ID de cadena) para averiguar que id = "Artículo_Detail" es elemento y luego use GetElementsBytag para obtener la parte del tramo. Debido a que hay 3 <span> ... </span> en total, los elementos se devuelven en lugar de elemento.
// Artículo_detail incluye 2016-01-15 Fuente: Vistas: 177Element DetalleEle = Artículo.getElementById ("Artículo_Detail"); Detalles de elementos = DetalleElE.GetElementsByTag ("Span"); // Libere Time String DatStr.7. Número de veces de análisis
Si imprime los detalles anteriores. Get (2) .Text (), solo obtendrá
Número de vistas:
¿Sin vistas? ¿Por qué?
Debido a que JavaScript representa el número de puntos de vista, el Jsoup Crawler solo puede extraer contenido HTML y no puede obtener datos renderizados dinámicamente.
Hay dos soluciones
Si visita el urlhttp: //see.xidian.edu.cn/index.php/news/click/id/7428, obtendrá los siguientes resultados
document.write (478)
Este 478 es el número de vistas que necesitamos. Hacemos una solicitud GET para la URL anterior, obtenemos la cadena devuelta y usamos el normal para encontrar el número en ella.
// Al visitar esta página de noticias, el número de vistas será +1, y el número de veces es la cadena representada por js jsstr = httptool.doget (count_base_url + currentPage); int readTimes = Integer.ParseInt (jsstr.replaceAll ("// d+", "")); // o use el siguiente método regular // string readtimesstr = jsstr.replaceall ("[^0-9]", "");8. Analice el contenido de noticias
Originalmente, era una forma de obtener contenido de noticias en texto plano, pero luego se descubrió que el lado de Android también podía mostrar formato CSS, por lo que el contenido se retuvo en formato HTML más tarde.
Elemento contentele = artículoeLe.getElementById ("Artículo_content"); // Noticias Cadena de contenido de contenido ContentSTR = Contentele.ToString (); // Si se usa el método text (), la etiqueta HTML del contenido del cuerpo de noticias se perderá // para mostrar HTML con WebView en Android, use toString () // Cadena contenido de contenido.9. Analice la URL de la imagen
Tenga en cuenta que hay muchas imágenes grandes y pequeñas en una página web. Para obtener solo el contenido en el texto de las noticias, es mejor localizar primero los elementos del contenido de noticias y luego usar GetElementsBytag ("IMG") para filtrar las imágenes.
Elemento contentele = artículoeLe.getElementById ("Artículo_Content"); // Noticias Cadena de contenido de contenido ContentsTr = ContentEle.ToString (); // Si se usa el método text (), la etiqueta HTML de la etiqueta del contenido del cuerpo de noticias se perderá // para mostrar el html con WebView en android, use toString () // string contenido Contentele.getElementsBytag ("img"); string [] imageUrls = new String [images.size ()]; para (int i = 0; i <imageUrls.length; i ++) {imageUrls [i] = images.get (i) .attr ("src");}10. Entidad de noticias Javabean
Lo anterior se obtiene el título, la fecha de lanzamiento, el número de lecturas, el contenido de noticias, etc. de las noticias. Naturalmente, necesitamos construir un Javabean y encapsular el contenido obtenido en la clase de entidad.
Public Class ArtículoItem {private int index; cadena privada [] imageUrls; título de cadena privada; Private String PublishDate; fuente de cadena privada; Private int cuerpo de cuerda privada; Public ArtículoItem (int index, string [] imageUrls, title de cadena, string publishdate, string source, int readTimes, string body) {this.index = index; this.imageUrls = imageUrls; this.title = title; this.PublishDate = PublishDate; this.source = fuente; this.ReadTimes = ReadTimes; this.body = cuerpo; } @Override public String toString () {return "Artículo de artículo [index =" + index + ",/n imageUrls =" + arrays.toString (imageUrls) + ",/n,/n publishDate =" + publishDate + ",/n fuente =" + fuente + ",/n readTimes =" + readTimes + ",/n body =" + " +" }}prueba
Public Static Artículo de getNewsitem (int currentPage) lanza CommoneException {// Según el número de sufijo, emplome la cadena de url de noticias urlstr = artículo_base_url + currentPage + ".html"; Cadena htmlstr = httptool.doget (urlstr); Documento doc = JSoup.Parse (HTMLSTR); Elemento artículoeLE = doc.getElementById ("Artículo"); // Title Element titleELE = ArtemELE.GetElementById ("Artículo_title"); Cadena titlestr = titleELE.Text (); // Artículo_detail incluye 2016-01-15 Fuente: Vistas: 177 elemento detalleLe = Artículoe.getElementById ("Artículo_Detail"); Detalles de elementos = detalleLe.getElementsBytag ("Span"); // Libere Time String DatStr = Detalles.get (0) .Text (); // String String SourCestr = Detalles.get (1) .Text (); // Visite esta página de noticias y el número de vistas será +1, que es la cantidad de veces que Js. jsstr = httptool.doget (count_base_url + currentPage); int readTimes = Integer.ParseInt (jsstr.replaceall ("// d+", "")); // o use el siguiente método regular // string readtimesstr = jsstr.replacealll ("[^0-9]", ""); Elemento Contentele = ArtemELE.GetElementById ("Artículo_Content"); // Noticias de contenido de contenido de contenido contenido de contenido = contentele.ToString (); // Si se usa el método text (), la etiqueta HTML del contenido del cuerpo de noticias se perderá // para mostrar el HTML con WebView en Android, use toString () // string contenttr = contentElE.Text (); Elements imágenes = contentele.getElementsBytag ("img"); String [] imageUrls = new String [Image.Size ()]; for (int i = 0; i <imageUrls.length; i ++) {imageUrls [i] = images.get (i) .attr ("src"); } Devuelve nuevo artículo Artículo (CurrentPage, ImageUrls, Titlestr, Datestr, SourCestr, ReadTimes, ContentsTr);} public static void main (string [] args) lanza Commonexception {System.out.println (getNewsitem (7928));}Información de salida
Artículo de Artículo [index = 7928, imageUrls = [/uploads/image/20160114/20160114225911_34428.png], título = la escuela de ingeniería eléctrica lanzó la floración "deja que la flor de la integridad florezca en todo el campus de invierno" Actividad educativa, editor = 2016-01-14, fuente: fuente de noticias de películas, lectura de la red, el cuerpo = 200, el cuerpo <diver ", el cuerpo de invierno", PublishDate = 2016-01-14, fuente = fuente de noticias de películas, lectura de la red, el cuerpo = 200, el cuerpo de la casa = 200, el cuerpo de invierno. id = "artículo_content"> <p style = "text-indent: 2em;" align = "justify"> <strong> <span style = "font-size: 16px; line-height: 1.5;"> Xidian News Network </span> </strong> <span style = "font-size: 16px; line-He-Heje: 1.5;"> (Comradesperer </span> <strong> <strong> <span span style: 16px; line-height: 1.5; "Ding whing </span> <strong> <span span style =" Font-s-weeize: 16px; line-height: 1.5; "Ding whing </span> <strong> <span Style =" Font-wee-s-tise; Dan </span> </strong> <span style = "font-size: 16px; line-height: 1.5;"> ...)
Este artículo explica cómo implementar Jsoup Web Crawler. Si el artículo es útil para usted, entonces dame un pulgar hacia arriba.