1. Требования
Недавно я рефактовал свое собственное новостное приложение на основе дизайна материала, и источник данных является проблемой.
Предшественник проанализировал API, такие как Zhihu Daily и Phoenix News, и может получить данные новостей JSON на основе соответствующего URL. Чтобы воспользоваться навыками написания кода, автор планирует ползти страницы новостей и самостоятельно получить данные для создания API.
2. Эффект изображения
На картинке ниже страница оригинального сайта
Груплер получил данные и отобразил их на мобильный терминал приложения
3. Идеи хлистого
Для процесса реализации приложения вы можете обратиться к этим статьям. Эта статья в основном объясняет, как ползать данных.
Весь процесс записи приложения на Android для генерации GIF Dynamic Pictures: //www.vevb.com/article/78236.htm
Узнайте дизайн материала Android (Recyclerview вместо ListView): //www.vevb.com/article/78232.htm
Android Project Практическая имитация страницы Netease News (Recyclerview): //www.vevb.com/article/78230.htm
Введение в JSoup
JSoup - это диапазон HTML с открытым исходным кодом для Java, который может непосредственно анализировать определенный адрес URL -адреса и HTML -контент.
JSoup в основном имеет следующие функции:
4. Процесс ползания
Получить запрос, чтобы получить веб -страницу HTML
Дерево DOM на веб -странице новостей HTML выглядит следующим образом:
В следующем коде используется код для получения исходного кода HTML, возвращаемого запросом GET на основе указанного URL.
Public Static String Doget (String urlstr) бросает Commonexception {url url; String html = ""; try {url = new url (urlstr); Httpurlconnection connection = (httpurlconnection) url.openconcenection (); connection.setrequestmethod ("Get"); connection.setConnecttimeout (5000); connection.setDoinput (true); connection.setDoOutput (true); if (connection.getResponsecode () == 200) {inputStream in = connection.getInputStream (); html = Streamtool.intoStringBybyte (in); } else {бросить новое Commonexception («Возвращение новостного сервера не составляет 200»); }} catch (Exception e) {e.printstackTrace (); бросить новое Commonexception («GET запрос не удался»); } return html;}InputStream in = connection.getInputStream (); Преобразование полученного входного потока в строку является распространенным требованием. Мы абстрагируем это и пишем метод инструмента.
Public Class Streamtool {public Static String IntoStringBybyte (InputStream In) Throws Exception {BytearRayOutputStream outstr = new BytearRayOutputStream (); Byte [] buffer = новый байт [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. диапазон HTML, чтобы получить заголовок
Используйте элемент цензуры браузера Google, чтобы узнать код HTML для названия новостей:
<div id = "article_title"> <h1> <a href = "http://see.xidian.edu.cn/html/news/7428.html"> Обратите внимание на проведение лекции по «оценке классических музыкальных работ и гуманистических эстетиков» </a> </h1> </div>
Нам нужно найти часть id = "article_title" из приведенного выше HTML, используя метод GetElementByID (идентификатор строки)
String htmlstr = httptool.doget (urlstr); // преобразование полученного исходного кода HTML на веб -странице в DocumentDocument doc = jsoup.parse (htmlstr); element articleele = doc.getelementbyid ("article"); // title element = articleele.getelementbyid ("article_title");6. Получить дату выпуска и источник информации
Также узнайте HTML -код для
<html> <head> </head> <body> <div id = "article_detail"> <pan> 2015-05-28 </span> <pran> Источник: </span> <pan> Количество просмотров: <script language = "javascript" src = "http://see.xidian.edu.cnex.prc =" </script> 477 </span> </div> </body> </html>
Идея похожа на вышесказанное. Используйте метод GetElementByID (идентификатор строки), чтобы узнать, что id = "article_detail" является элементом, а затем используйте GetElementsBytag, чтобы получить часть SPAN. Поскольку в общей сложности есть 3 <pan> ... </span>, вместо элемента возвращаются элементы.
// article_detail включает в себя 2016-01-15 Источник: Просмотры: 177Element defitele = articleele.getelementbyid ("article_detail"); elements detail = defintele.getelementsbytag ("span"); // Строка времени выпуска DatestR = Details.get (0) .Text (); // Новости исходная строка sourcest = detasts.get (1) .ext ();7. Количество случаев анализа
Если вы распечатаете вышеупомянутые детали.
Количество просмотров:
Нет взглядов? Почему?
Поскольку количество представлений отображается JavaScript, Crawler JSoup может извлечь только содержание HTML и не может получить динамически отображаемые данные.
Есть два решения
Если вы посетите вышеупомянуту
Document.Write (478)
Это 478 - количество просмотров, которые нам нужны. Мы делаем запрос на получение приведенного выше URL, получаем возвращенную строку и используем обычный, чтобы найти номер в нем.
// При посещении этой новостной страницы количество просмотров будет +1, а количество раз - это строка, отображаемая js jsstr = httptool.doget (count_base_url + currentpage); int readtime = integer.parseint (jsstr.replaceall ("// d+", "")); // или использовать следующий обычный метод // string readtimesstr = jsstr.replaceall ("[^0-9]", "");8. Проанализируйте контент новостей
Первоначально это была форма получения контента новостей в простом тексте, но позже было обнаружено, что сторона Android также может отображать формат CSS, поэтому контент сохранялся в формате HTML позже.
Element contentele = articleeele.getelementbyid ("article_content"); // Содержимое новостного содержимого тела contentstr = contentele.tostring (); // Если используется метод Text (), HTML -тег содержимого новостного тела будет потерян // для отображения html с WebView на Android, используйте toString () string contentstr = content.textele.9. Проанализируйте URL -адрес картинки
Обратите внимание, что на веб -странице есть много больших и маленьких изображений. Чтобы получить только контент в тексту новостей, лучше сначала найти элементы новостного контента, а затем использовать GetElementsBytag («IMG»), чтобы отфильтровать фотографии.
Element contentele = articleeele.getelementbyid ("article_content"); // новость содержимого содержимого тела. Содержимое содержимого = contentele.tostring (); // Если используется метод Text (), html Tag содержимого тела новостей будет потеряно // для отображения html с webview на Android, используйте tostring () string contentstr. contentele.getelementsbytag ("img"); string [] imageUrls = new String [image.Size ()]; for (int i = 0; i <ImageUrls.length; i ++) {ImageUrls [i] = Images.get (i) .attr ("src");};10. Новости Javabean
Выше приведено название, дата выпуска, количество чтения, контент новостей и т. Д. Новостей. Нам, естественно, нужно построить Javabean и инкапсулировать полученный контент в класс объектов.
Public Class articleItem {private int index; Private String [] ImageUrls; Приватная строка название; Private String PublishDate; частный источник строки; частное прочтение; частное тело; public articleItem (int index, string [] imageUrls, название строки, строка PublishDate, String Source, int readtime, string body) {this.index = index; this.imageurls = imageurls; this.title = заголовок; this.publishdate = publishdate; this.source = source; this.readtimes = readtime; this.body = body; } @Override public String toString () {return "articleItem [index =" + index + ",/n ImageUrls =" + arrays.toString (imageUrls) + ",/n,/n publishdate =" + publishdate + ",/n source =" + source + ",/n readtime =" + readtimes + ",/n body =" + " +" + " +" + " +" + "; }}тест
public static articleItem getNewSitem (int currentPage) Throws Commonexception {// Согласно номеру суффикса, сплачивайте новость url string urlstr = article_base_url + currentpage + ".html"; String htmlstr = httptool.doget (urlstr); Документ doc = jsoup.parse (htmlstr); Element articleele = doc.getelementbyid ("article"); // Title Element Titleele = articleEle.getElementById ("article_title"); String tittleStr = titleele.text (); // article_detail включает в себя 2016-01-15 Источник: Просмотры: 177 Element Defitele = articleEle.getElementById ("article_detail"); Elements detail = deftainele.getelementsbytag ("span"); // Время выпуска строки dateStr = details.get (0) .Text (); // Новости источник строки sourcest = details.get (1) .text (); // Посетите эту новостную страницу, и количество просмотров будет +1, что является количеством раз, отображаемое JS. jsstr = httptool.doget (count_base_url + currentpage); int readtime = integer.parseint (jsstr.replaceall ("// d+", "")); // или использовать следующий обычный метод // string readtimesstr = jsstr.replaceall ("[^0-9]", ""); Element contentele = articleeele.getelementbyid ("article_content"); // Новости содержимое тела Stringtr = contentele.toString (); // Если используется метод Text (), HTML -тег содержания тела новостей будет потерян // Чтобы отобразить HTML с WebView на Android, используйте toString () // String ContentStr = contentele.text (); Elements Images = contentele.getElementsBytag ("IMG"); String [] imageUrls = new String [image.Size ()]; for (int i = 0; i <imageUrls.length; i ++) {imageUrls [i] = image.get (i) .attr ("src"); } вернуть New articleItem (CurrentPage, ImageUrls, TitleStr, Datestr, Sourcestr, Readtimes, contentStr);} public static void main (string [] args) Throws Commonexception {System.out.println (getNewSitem (7928);}Вывода информация
ArticleItem [index = 7928, imageUrls = [/uploads/image/20160114/20160114225911_34428.png], название = Школа электротехники запустила «Let the Flower of Fellight Bloom по всему зимнему кампусу», Publishdate = 2016-01-14, Source Source News, News, News Compuse = 200, Divis = 200, Divis = 200, Divis = 200, Divis = 200, Divis = 200, Divis = 200, Divis = 200, Divis = 200, Divis = 200, Divis = 200. id = "article_content"> <p style = "text-indent: 2em;" align = "useify"> <strong> <span style = "font-size: 16px; line-height: 1,5;"> News News Network </span> </strong> <span style = "font-size: 16px; line-hight: 1,5;"> (товарищесченник </span> <strong> <span = "font-size: 16px; Dan </span> </strong> <span style = "font-size: 16px; line-height: 1,5;"> ...)
В этой статье объясняется, как реализовать веб -гусеницу JSoup. Если статья полезна для вас, то дайте мне большие пальцы.