1. Anforderungen
Kürzlich habe ich meine eigene Nachrichten -App auf der Grundlage des Materialdesigns neu gestaltet, und die Quelle der Daten ist ein Problem.
Ein Vorgänger hat APIs wie Zhihu Daily und Phoenix News analysiert und kann die Nachrichten -JSON -Daten basierend auf der entsprechenden URL erhalten. Um das Schreibfähigkeiten des Code -Schreibens auszuüben, plant der Autor, die Nachrichtenseite zu kriechen und Daten selbst zu erhalten, um eine API zu erstellen.
2. Effekt Bild
Das Bild unten ist die Seite der ursprünglichen Website
Der Crawler erhielt die Daten und zeigte sie auf das App Mobile Terminal der App an
3. Crawler -Ideen
Für den Implementierungsprozess von App können Sie auf diese Artikel verweisen. In diesem Artikel wird hauptsächlich erläutert, wie Daten kriechen.
Der gesamte Prozess der Aufzeichnung von App -Operation auf Android, um GIF Dynamic Pictures zu generieren: //www.vevb.com/article/78236.htm
Lernen Sie Android Material Design (Recyclerview anstelle von ListView): //www.vevb.com/article/78232.htm
Android Project Practical Imitation of Netease News Seite (Recyclerview): //www.vevb.com/article/78230.htm
Einführung in JSOUP
JSOUP ist ein Open -Source -HTML -Parser für Java, der eine bestimmte URL -Adresse und einen HTML -Textinhalt direkt analysieren kann.
JSOUP hat hauptsächlich die folgenden Funktionen:
4. Krabbelprozess
Nehmen Sie die Anfrage ab, um eine Webseite HTML zu erhalten
Der DOM -Baum der News -Webseite HTML lautet wie folgt:
Der folgende Code verwendet den Code, um den von der GET -Anforderung zurückgegebenen HTML -Quellcode basierend auf der angegebenen URL zu erhalten.
public static String dagget (String urlstr) löst Commonexception {url url; String html = ""; try {url = new url (urlstr); HttpurlConnection connection = (httpurlConnection) url.openconnection (); Connection.SetRequestMethod ("get"); Connection.SetConnectTimeout (5000); Connection.SetDoInput (true); connection.setDooutput (true); if (Connection.getResponSCode () == 200) {inputStream in = connection.getInputStream (); html = streamtool.intoStringbyte (in); } else {neue commonexception ("News Server -Rückgabewert ist nicht 200"); }} catch (Ausnahme e) {e.printstacktrace (); Neue CommonException werfen ("Get Request fehlgeschlagen"); } return html;}InputStream in = connection.getInputStream (); Das Konvertieren des resultierenden Eingangsstroms in eine Zeichenfolge ist eine übliche Anforderung. Wir werden es abstrahieren und eine Werkzeugmethode schreiben.
public class streamtool {public static String IntoStringByByte (InputStream in) löst eine Ausnahme aus {bytearrayoutputStream outstr = new bytearrayoutputStream (); byte [] buffer = neues byte [1024]; int len = 0; StringBuilder content = new StringBuilder (); while ((len = in.read (puffer))! } outstr.close (); return content.toString (); }}5. HTML analysieren, um den Titel zu erhalten
Verwenden Sie das Zensurelement des Google -Browsers, um den HTML -Code für den News -Titel herauszufinden:
<div id = "acies_title"> <h1> <a href = "http://see.xidian.edu.cn/html/news/7428.html
Wir müssen den Teil von id = "article_title" aus der obigen HTML finden und die GetElementById (String -ID) -Methode verwenden
String htmlstr = httptool.doget (urlstr); // den erhaltenen HTML -Quellcode der Webseite in documentDocument doc = jSoup.Parse (htmlstr); Element artikele = doc.getElementById ("article"); // title elementtleElele.GetElement ("article_title");6. Erhalten Sie Veröffentlichungsdatum und Informationsquelle
Finden Sie auch den HTML -Code für heraus
<html> <Head> </head> <body> <div id = "article_detail"> <span> 2015-05-28 </span> <span> Quelle: </span> <span> Anzahl der Ansichten: <cript Language = "javascript" src = "http:/see.xidian </script> 477 </span> </div> </body> </html>
Die Idee ähnelt dem oben. Verwenden Sie die Methode GetElementById (String ID), um herauszufinden, dass ID = "acies_detail" ein Element ist, und verwenden Sie dann GetElementsByTag, um den Span -Teil zu erhalten. Da es insgesamt 3 <spann> ... </span> gibt, werden Elemente anstelle von Elementen zurückgegeben.
// article_detail enthält 2016-01-15 Quelle: Ansichten: 177Element Detaile = artikele.getElementById ("article_detail"); Elements Details = Detaile.GetElementsByTag ("span"); // Zeitstring datestr = details.gets (0) .Text (); // News Source String Sourcestrate ().7. Häufigkeit der Analysezeiten
Wenn Sie die oben genannten Details ausdrucken.get (2) .Text (), erhalten Sie nur
Anzahl der Ansichten:
Keine Ansichten? Warum?
Da die Anzahl der Ansichten von JavaScript gerendert wird, kann der JSOUP -Crawler nur HTML -Inhalte extrahieren und keine dynamisch gerenderten Daten erhalten.
Es gibt zwei Lösungen
Wenn Sie die oben genannten urlhttp: //see.xidian.edu.cn/index.php/news/click/id/7428 besuchen, erhalten Sie die folgenden Ergebnisse
document.write (478)
Dieser 478 ist die Anzahl der Ansichten, die wir benötigen. Wir stellen eine Get -Anfrage für die obige URL vor, erhalten die zurückgegebene Zeichenfolge und verwenden die Regulierung, um die Nummer darin zu finden.
// Beim Besuch dieser Nachrichtenseite beträgt die Anzahl der Ansichten +1, und die Anzahl der Male ist die von JSSSTR = httptool.doget (count_base_url + currentPage) gerendete Zeichenfolge; int redeTimes = integer.parseInt (jsstr.replaceAll ("// d+", ""); // oder verwenden Sie die folgende reguläre Methode // String ReadTimesTR = jsstr.replaceall ("[^0-9]", ");8. Analysieren Sie die Nachrichteninhalte
Ursprünglich war es eine Form, Nachrichteninhalte im Klartext zu erhalten, aber später wurde festgestellt, dass die Android -Seite auch das CSS -Format anzeigen konnte, sodass der Inhalt später im HTML -Format beibehalten wurde.
Element contentele = articleEele
9. Analysieren Sie die Bild -URL
Beachten Sie, dass es auf einer Webseite viele große und kleine Bilder gibt. Um den Inhalt nur im Nachrichtentext zu erhalten, ist es am besten, zuerst die Elemente des Nachrichteninhalts zu finden und dann GetElementsBytag ("IMG") zu verwenden, um die Bilder herauszufiltern.
Element contentele = articleele.getElementById ("article_content"); // News Body Content String contentStr = contentele.toString (); // Wenn die text () verwendet wird, wird das HTML -Tag des Nachrichtenkörperinhalts verloren //, um das html mit webview auf Android zu zeigen. contentele.getElementsByTag ("img"); String [] imageUrls = new String [images.size ()]; für (int i = 0; i <imageurlsgtal; i ++) {ImageUrls [i] = Images.get (i) .attr ("src");};};};};};};};};};};};};10. Nachrichtenentität Javaban
Das obige ist, den Titel, das Veröffentlichungsdatum, die Anzahl der Lesevorgänge, die Nachrichteninhalte usw. der Nachrichten zu erhalten. Wir müssen natürlich eine Javabäe konstruieren und den erhaltenen Inhalt in die Entitätsklasse einkapseln.
public class articleItem {private int index; private Zeichenfolge [] ImageRls; privater String -Titel; private String Publishdate; private String -Quelle; private int redeTimes; private Saitenkörper; public articleItem (int index, String [] ImageRls, String -Titel, String PublishDate, String Source, Int ReadTimes, String Body) {this.index = index; this.imageUrls = ImageRls; this.title = title; this.publishDate = publishDate; this.source = Quelle; this.readtimes = redeTimes; this.body = Körper; } @Override public String toString () {return "articleItem [index =" + index + ",/n imageurls =" + arrays.toString (ImageRls) + ",/n,/n publishdate =" + publishdate + ",/n Source =" + Quelle + ",/n redeTimes =" +). }}prüfen
public static articleItem getNewSeTem (int CurrentPage) löst Commonexception {// gemäß der Suffix -Nummer aus, speisen Sie die Nachrichten url String urlstr = article_base_url + currentPage + ".html"; String htmlstr = httptool.doget (urlstr); Document doc = jsoup.parse (htmlstr); Element articleele = doc.getElementById ("Artikel"); // Title Element titleele = aciese.getElementById ("article_title"); String titlestern = titleele.text (); // article_detail enthält 2016-01-15 Quelle: Ansichten: 177 Element Detailele = artikele.getElementById ("article_detail"); Elements Details = Detaile.getElementsByTag ("span"); // Time String datestr = details.get (0) .Text (); // News Source String Sourcestr = details.get (1) .Text (); // Besuchen Sie diese Nachrichtenseite und die Anzahl der Ansichten beträgt +1, was die Häufigkeit von JS ist. jsstr = httptool.doget (count_base_url + currentPage); int redeTimes = integer.parseInt (jsstr.replaceall ("// d+", "")); // oder verwenden Sie die folgende reguläre Methode // String readTimesstr = jsstr.replaceall ("[^0-9]", ""); Element contentele = artikele.getElementById ("article_content"); // News Body Content String String contentStr = contentele.toString (); // Wenn die text () -Methode verwendet wird, geht das HTML -Tag des Nachrichtenkörperinhalts verloren //, um das HTML mit WebView on Android anzuzeigen. Elements Images = contentele.getElementsByTag ("img"); String [] ImageUrls = new String [images.size ()]; für (int i = 0; i <imageurls.length; i ++) {imageurls [i] = images.get (i) .attr ("src"); } Neue Artikel zurückgeben (CurrentPage, ImageRls, Titlestern, DETESTR, Sourcestres, RedeTimes, ContentSTR);Ausgabeinformationen
ArtikelItem [INDEX = 7928, Imageurls = [/Uploads/Image/20160114/20160114225911_34428.png], Titel = Die School of Electrical Engineering startete die "let The Flower of Integrity Bloom über den Wintercampus" Bildungsaktivität, Publishdate = 2016-01-14, Quelle: Quelle: Quelle: Quelle: Quelle: Quelle: Quelle: Quelle: Quelle: Quell New News Network, Lettimes = 200, Modital = 200, 01-14, Quelle = Quelle: Quelle: Quelle: Quelle: Quelle: Quell-News Network, Lettimes, Lettimes = 200, Modital = 200, 01-14. id = "article_content"> <p style = "textindent: 2em;" Align = "Justify"> <strong> <span style = "Schriftgröße: 16px; Zeilenhöhe: 1,5;"> Xidian News Network </span> </strong> <span style = "Schriftgröße: 16px; Linienhöhe: 1,5;"> (COMRADEsperson </span> <strong> <span Style = "font-size: 16px; Dan </span> </strong> <span style = "Schriftgröße: 16px; Linienhöhe: 1,5;"> ...)
In diesem Artikel wird erläutert, wie JSOUP Web Crawler implementiert wird. Wenn der Artikel für Sie hilfreich ist, geben Sie mir einen Daumen hoch.