1. Exigences
Récemment, j'ai refactorisé ma propre application d'actualités en fonction de la conception des matériaux, et la source des données est un problème.
Un prédécesseur a analysé les API telles que Zhihu Daily et Phoenix News, et peut obtenir les données JSON de News sur la base de l'URL correspondante. Afin d'exercer des compétences en rédaction de code, l'auteur prévoit d'explorer la page d'information et d'obtenir des données par lui-même pour construire une API.
2. Image d'effet
L'image ci-dessous est la page du site Web d'origine
Le robot a obtenu les données et l'a affichée au terminal mobile de l'application
3. Idées de chenilles
Pour le processus de mise en œuvre de l'application, vous pouvez vous référer à ces articles. Cet article explique principalement comment ramper les données.
L'ensemble du processus d'enregistrement de l'application sur Android pour générer des images dynamiques GIF: //www.vevb.com/article/78236.htm
Apprenez Android Material Design (recyclerView au lieu de ListView): //www.vevb.com/article/78232.htm
Android Project Imitation Practical of NetEase News Page (RecyclerView): //www.vevb.com/article/78230.htm
Introduction à JSoup
JSoup est un analyseur HTML open source pour Java, qui peut analyser directement une certaine adresse URL et un contenu texte HTML.
JSoup a principalement les fonctions suivantes:
4. Processus rampant
Obtenez une demande pour obtenir la page Web HTML
L'arbre Dom de la page Web des nouvelles HTML est le suivant:
Le code suivant utilise le code pour obtenir le code source HTML renvoyé par la demande GET en fonction de l'URL spécifiée.
public static String doGet (String urlstr) lève Commonexception {url url; String html = ""; essayez {url = new url (urlstr); HttpurlConnection Connection = (httpurlConnection) url.openconnection (); connection.setRequestMethod ("get"); connection.setConnectTimeout (5000); connection.setDoInput (true); connection.setDoOutput (true); if (connection.getResponSECODE () == 200) {inputStream dans = connection.getInputStream (); html = streamtool.intoStringByte (in); } else {Throw New CommonException ("La valeur de retour du serveur d'information n'est pas 200"); }} catch (exception e) {e.printStackTrace (); lancer une nouvelle commonexception ("Get Demande a échoué"); } return html;}InputStream dans = connection.getInputStream (); La conversion du flux d'entrée résultant en une chaîne est une exigence commune. Nous l'abstrons et écrivons une méthode d'outil.
classe publique StreamTool {public static String IntoStringByte (InputStream in) lève l'exception {byTearrayOutputStream outstr = new ByTearRayOutputStream (); octet [] tampon = nouveau octet [1024]; int len = 0; StringBuilder Content = new StringBuilder (); while ((len = in.read (buffer))! = -1) {content.append (new String (tampon, 0, len, "utf-8")); } outstr.close (); return content.toString (); }}5. Paning HTML pour obtenir le titre
Utilisez l'élément de censure du navigateur Google pour découvrir le code HTML pour le titre d'actualités:
<div id = "Article_title"> <h1> <a href = "http://see.xidian.edu.cn/html/news/7428.html"> Remarque sur la conférence sur "Appréciation des œuvres de musique classique et de l'esthétique humaine" </a> </h1> </v>
Nous devons trouver la partie de id = "article_title" à partir du HTML ci-dessus, et utiliser la méthode GetElementById (String ID)
String htmlstr = httptool.doget (URLStr); // convertir le code source HTML obtenu de la page Web en documentDocument Doc = jsoup.parse (htmlstr); élément articlelele = doc.getElementById ("Article"); // Title Element TitleElele = ArticleEle.EntelementyId ("Article_Title");6. Obtenir la date de publication et la source d'information
Découvrez également le code HTML pour
<html> <éad- head> </ head> <body> <div id = "article_detail"> <span> 2015-05-28 </span> <span> source: </span> <span> nombre de vues: <script linguisse = "javascript" src = "http://see.xidian.edu.cn/index.php/news/click/7428"> </index.php/news/click/7428 "> </ Script> 477 </span> </div> </ body> </html>
L'idée est similaire à ce qui précède. Utilisez la méthode GetElementById (String ID) pour découvrir que id = "article_detail" est un élément, puis utilisez GetElementsByTag pour obtenir la partie de span. Parce qu'il y a 3 <span> ... </span> au total, les éléments sont retournés au lieu de l'élément.
// Article_Detail inclut 2016-01-15 Source: vues: 177Element de détaillele = articlelele.getElementById ("Article_Detail"); Elements Details = Detaillele.getElementsByTag ("Span"); // Release Time String Datestr = Details.get (0) .Text (); // News Source String Sourcestr = DetailS.get (1) .Text ();7. Nombre de fois d'analyse
Si vous imprimez les détails ci-dessus.
Nombre de vues:
Pas de vues? Pourquoi?
Étant donné que le nombre de vues est rendu par JavaScript, le robot mignon de JSoup ne peut extraire que du contenu HTML et ne peut pas obtenir de données rendues dynamiquement.
Il y a deux solutions
Si vous visitez le ci-dessus urlhttp: //see.xidian.edu.cn/index.php/news/click/id/7428, vous obtiendrez les résultats suivants
Document.Write (478)
Ce 478 est le nombre de vues dont nous avons besoin. Nous faisons une demande GET pour l'URL ci-dessus, obtenons la chaîne retournée et utilisons le régulier pour y trouver le numéro.
// Lors de la visite de cette page d'information, le nombre de vues sera +1, et le nombre de fois est la chaîne rendue par JS jsstr = httptool.doget (count_base_url + currentPage); int readTimes = Integer.ParseInt (jsstr.replaceAll ("// d +", "")); // ou utiliser la méthode régulière suivante // String readtimestr = jsstr.replaceAll ("[^ 0-9]", "");8. Analyser le contenu des nouvelles
À l'origine, il s'agissait d'une forme d'obtention du contenu d'actualités en texte brut, mais plus tard, il a été constaté que le côté Android pouvait également afficher le format CSS, de sorte que le contenu a été conservé au format HTML plus tard.
Element Contentele = Articlelele.getElementById ("Article_Content"); // News Contest String Contestr = Contentele.ToString (); // Si la méthode Text () est utilisée, la balise HTML du contenu du corps de l'information sera perdue // afin d'afficher HTML avec WebView on Android, use toSTring () // String ContentsTr = Contealle.Text ();9. Analyser l'URL de l'image
Notez qu'il existe de nombreuses images grandes et petites sur une page Web. Afin d'obtenir uniquement le contenu du texte des nouvelles, il est préférable de localiser d'abord les éléments du contenu d'actualités, puis d'utiliser GetElementsByTag ("IMG") pour filtrer les images.
Element Contentele = Articlelele.getElementById ("Article_Content"); // News Body Content String ContentsTr = Contentele.ToString (); // Si la méthode Text () est utilisée, la balise HTML du contenu du corps de l'information sera perdue // afin d'afficher le HTML avec webview on android, use toSTring () // String ContentsTr = Contealle.Text () Contentele.getElementsByTag ("img"); string [] imageUrls = new String [images.size ()]; for (int i = 0; i <imageUrls.length; i ++) {imageUrls [i] = images.get (i) .attr ("src");}10. Entité de nouvelles Javabean
Ce qui précède est d'obtenir le titre, la date de sortie, le nombre de lectures, le contenu des nouvelles, etc. de l'actualité. Nous devons naturellement construire un Javabean et encapsuler le contenu obtenu dans la classe d'entité.
classe publique Articletem {private int index; chaîne privée [] ImageUrls; titre de chaîne privée; Private String PublishDate; source de chaîne privée; private int readTimes; corps de cordes privées; public Articletem (int index, string [] ImageUrls, String Title, String PublishDate, String Source, int ReadTimes, String Body) {this.index = index; this.imageUrls = imageUrls; this.title = title; this.publishDate = publihDate; this.source = source; this.readTimes = readTimes; this.body = corps; } @Override public String toString () {return "articletem [index =" + index + ", / n imageurls =" + arrays.tostring (imageUrls) + ", / n, / n publishDate =" + publihDate + ", / n source =" + source + ", / n readTimes =" + readTimes + ", / n body =" + body + "; }}test
public static Articletem getNewSitem (int currentPage) lève Commonexception {// Selon le numéro de suffixe, épissez la chaîne de nouvelles URL URLstr = article_base_url + currentPage + ".html"; String htmlstr = httptool.doget (urlstr); Document doc = jsoup.parse (htmlstr); Élément Articlelele = doc.getElementById ("article"); // Title Element TitleElele = Articlelele.getElementById ("Article_Title"); String titlestr = titleele.text (); // Article_Detail inclut 2016-01-15 Source: Vues: 177 Element DetailEle = Articlelele.getElementById ("Article_Detail"); Détails des éléments = détaillele.getElementsByTag ("Span"); // Release Time String Datestr = Detards.get (0) .Text (); // News Source String Sourcestr = Detards.get (1) .Text (); // Visitez cette page de nouvelles et le nombre de vues sera +1, ce qui est le nombre de fois rendu par JS. jsstr = httptool.doget (count_base_url + currentPage); int readTimes = Integer.ParseInt (jsstr.replaceAll ("// d +", "")); // ou utiliser la méthode régulière suivante // String readtimestr = jsstr.replaceAll ("[^ 0-9]", ""); Element ContentEle = Articlelele.getElementById ("Article_Content"); // News Body Content String contentstr = contentlele.toString (); // Si la méthode Text () est utilisée, la balise HTML du contenu du corps de presse sera perdue // Pour afficher le HTML avec WebView sur Android, utilisez toString () // String ContentsTR = Contentele.Text (); Elements Images = Contentele.getElementsByTag ("IMG"); String [] imageUrls = new String [images.size ()]; for (int i = 0; i <imageUrls.length; i ++) {imageUrls [i] = images.get (i) .attr ("src"); } return New Articletem (CurrentPage, ImageUrls, Titlestr, Datestr, Sourcestr, ReadTimes, ContentsTR);} public static void main (String [] args) lance ComMonexception {System.out.println (getNewSitem (7928));};Informations sur la sortie
Articletem [index = 7928, ImageUrls = [/ uploads / image / 20160114 / 20160114225911_34428.png], title = The School of Electrical Engineering a lancé la "Flower of Integrity Bloom partout dans le campus d'hiver", ReadTimes = 2001 id = "article_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-height: 1.5;"> (Comradeperson </span> <strong> <Span style = "Font-Size: 16px; Line-Height: 1.5;" Dan </span> </strong> <span style = "Font-Size: 16px; Line-Height: 1.5;"> ...)
Cet article explique comment implémenter JSoup Web Crawler. Si l'article vous est utile, donnez-moi un coup de pouce.