1. Requisitos
Recentemente, refatorei meu próprio aplicativo de notícias com base no design de materiais, e a fonte dos dados é um problema.
Um antecessor analisou APIs como Zhihu Daily e Phoenix News e pode obter os dados JSON News com base no URL correspondente. Para exercer habilidades de redação de código, o autor planeja rastejar a página de notícias e obter dados por si mesmo para criar uma API.
2. Imagem do efeito
A imagem abaixo é a página do site original
O rastreador obteve os dados e os exibiu para o terminal móvel do aplicativo
3. Idéias de rastreador
Para o processo de implementação do aplicativo, você pode consultar esses artigos. Este artigo explica principalmente como rastejar dados.
Todo o processo de gravação de operação do aplicativo no Android para gerar imagens dinâmicas gif: //www.vevb.com/article/78236.htm
Aprenda o Android Material Design (RecyclerView em vez de ListView): //www.vevb.com/article/78232.htm
Projeto Android Imitação Prática da Página de Notícias da NetEase (RecyclerView): //www.vevb.com/article/78230.htm
Introdução ao JSUP
O JSOUP é um analisador HTML de código aberto para Java, que pode analisar diretamente um determinado endereço de URL e conteúdo de texto HTML.
O JSOUP tem principalmente as seguintes funções:
4. Processo de rastejamento
Obtenha solicitação para obter a página da web html
A árvore Dom da página de notícias HTML é a seguinte:
O código a seguir usa o código para obter o código -fonte HTML retornado pela solicitação GET com base no URL especificado.
Public Static String Doget (URLSTR) lança CommOnexception {URL URL; String html = ""; tente {url = novo url (urlstr); Conexão httpurlConnection = (httpurlConnection) url.openconnection (); Connection.SetRequestMethod ("Get"); Connection.SetConnectTimeout (5000); Connection.SetDoinput (true); Connection.SetDoOutput (true); if (conexão.getResponsecode () == 200) {inputStream in = Connection.getInputStream (); html = streamtool.intostringbybyte (in); } else {throw new CommOnexception ("O valor de retorno do servidor de notícias não é 200"); }} catch (Exceção e) {e.printStackTrace (); lançar uma nova commOnexception ("Obter solicitação falhou"); } retornar html;}InputStream in = Connection.getInputStream (); A conversão do fluxo de entrada resultante em uma string é um requisito comum. Abstrantamos e escrevemos um método de ferramenta.
public class StreamTool {public static string IntoStringByByte (inputStream in) lança Exceção {byteArrayOutputStream Outstr = new ByteArrayOutputStream (); byte [] buffer = novo byte [1024]; int len = 0; StringBuilder Content = new StringBuilder (); while ((len = in.read (buffer))! = -1) {content.append (new String (buffer, 0, len, "utf -8")); } supert.close (); retornar content.toString (); }}5. Analisando HTML para obter o título
Use o elemento de censura do navegador do Google para descobrir o código HTML para o título de notícias:
<div id = "artigo_title"> <H1> <a href = "http://see.xidian.edu.cn/html/news/7428.html"> Observe com uma palestra sobre "Apreciação de obras de música clássica e estéticas humanas" </a> </h1>
Precisamos encontrar a parte de id = "article_title" do html acima, usando o método getElementById (string id)
String htmlstr = httptool.Doget (urlstr); // converte o código -fonte HTML obtido da página da web em documentDocument doc = jsoup.parse (htmlstr); elemento stractEleLeSTyELeLeLelementById ("Artigo"); // title6. Obtenha a data de lançamento e fonte de informação
Descubra também o código HTML para
<html> <head> </ad> <body> <div id = "article_detail"> <pan> 2015-05-28 </span> <pan> Fonte: </span> <pan> Número de visualizações: <script) </script> 477 </span> </div> </body> </html>
A ideia é semelhante ao acima. Use o método getElementById (String ID) para descobrir que id = "artigo_detail" é elemento e use o getElementsByTag para obter a parte do span. Como existem 3 <span> ... </span> no total, os elementos são retornados em vez do elemento.
// Artigo_detail inclui 2016-01-15 Fonte: Visualizações: 177Element detalhele = Artigolele.getElementById ("Artigo_detail"); elementos Detalhes = detalhele.getElementsByTag ("span"); // Libere o tempo de string datest = detalhe.get (0) .Text () ;x);7. Número de vezes de análise
Se você imprimir os detalhes acima.
Número de visualizações:
Sem visualizações? Por que?
Como o número de visualizações é renderizado pelo JavaScript, o JSoup Crawler pode extrair apenas o conteúdo HTML e não pode obter dados renderizados dinamicamente.
Existem duas soluções
Se você visitar o URLHTTP: //see.xidian.edu.cn/index.php/news/click/id/7428, você receberá os seguintes resultados
Document.Write (478)
Este 478 é o número de visualizações de que precisamos. Fizemos uma solicitação de obter o URL acima, obtemos a string devolvida e usamos o regular para encontrar o número nela.
// Ao visitar esta página de notícias, o número de visualizações será +1 e o número de vezes é a string renderizada pelo JS JSSTR = httptool.Doget (count_base_url + currentpage); int readTimes = Integer.parseInt (jsstr.replaceall ("// d+", "" ")); // ou use o seguinte método regular // string readtimesstr = jsStr.ReplaceAll (" [^0-9] "," ");8. Analise o conteúdo de notícias
Originalmente, era uma forma de obtenção de conteúdo de notícias em texto simples, mas depois foi descoberto que o lado do Android também poderia exibir formato CSS, de modo que o conteúdo foi retido no formato HTML posteriormente.
Elemento contentele = artyele.getElementById ("artigo_content"); // News Body Content String contentStr = contentEle.ToString (); // Se o método text () for usado, a tag html do conteúdo do corpo de notícias será perdida // para exibir html com webview no android, uso () // string string strin9. Analise o URL da imagem
Observe que existem muitas imagens grandes e pequenas em uma página da web. Para obter apenas o conteúdo do texto do News, é melhor localizar primeiro os elementos do conteúdo de notícias e depois usar o GetElementsByTag ("IMG") para filtrar as imagens.
Element contentEle = articleEle.getElementById("article_content");// News body content String contentStr = contentEle.toString();// If the text() method is used, the html tag of the news body content will be lost// In order to display the html with WebView on Android, use toString()// String contentStr = contentEle.text();Elements images = contentEle.getElementsByTag ("img"); string [] imageurls = new String [imagens.size ()]; for (int i = 0; i <imageurls.length; i ++) {imageurls [i] = imagens.get (i) .attr ("src");}10. Entidade de notícias Javabean
O acima é obtido o título, data de lançamento, número de leituras, conteúdo de notícias etc. das notícias. Naturalmente, precisamos construir um Javabean e encapsular o conteúdo obtido na classe de entidade.
classe pública ArticleItem {private int index; String privada [] imageurls; título de sequência privada; Private String PublishDate; fonte de string privada; Private int ReadTimes; corpo de cordas privadas; public ArtigoItem (Int Index, String [] ImageUrls, String Title, String PublishDate, String Fonte, int ReadTimes, String Body) {this.index = index; this.imageurls = imageurls; this.title = title; this.publishdate = publishdate; this.source = fonte; this.readTimes = ReadTimes; this.body = body; } @Override public string tostring () {return "articleItem [index =" + index + ",/n imageurls =" + Arrays.ToString (imageurls) + ",/n,/n publishdate =" + publishdate + ",/n fonte/" + fonte ",/n, ledTimes" + " +"; }}teste
public static artigoItem getNewsItem (int currentPage) lança commOnexception {// De acordo com o número do sufixo, use a notícia url string urlstr = article_base_url + currentpage + ".html"; String htmlstr = httptool.Doget (urlstr); Documento doc = jsoup.parse (htmlstr); Element Artigole = Doc.getElementById ("Artigo"); // elemento do título titleEle = articleEle.getElementById ("artigo_title"); String titleSt = titleEle.text (); // Artigo_detail Inclui 2016-01-15 Fonte: Views: 177 Element detalhele = Artigolele.getElementById ("Artigo_detail"); Detalhes dos elementos = detalhe.getElementsByTag ("span"); // tempo de liberação string string datestr = detalheS.get (0) .text (); // fonte de notícias String SourCest = detalhe.get (1) .Text (); // Visite esta página de notícias e o número de visualizações será +1, que é o número de vezes renderizado pela JS. JSSTR = httptool.Doget (count_base_url + currentpage); int readTimes = Integer.parseint (jsstr.replaceall ("// d+", "")); // ou use o seguinte método regular // string readtimesstr = jsstr.replaceall ("[^0-9]", ""); Elemento contentele = artpleEle.getElementById ("artigo_content"); // News Body Content String contentStr = contentEle.toString (); // Se o método text () for usado, a tag html do conteúdo do corpo de notícias será perdida // para exibir o html com o webview no Android, use tostring () // string contentStr = contentEle.text (); Elementos imagens = contentEle.getElementsByTag ("img"); String [] imageurls = new String [imagens.size ()]; for (int i = 0; i <imageurls.length; i ++) {imageurls [i] = imagens.get (i) .attr ("src"); } Retorne novo ArtigoItem (CurrentPage, ImageUrls, TitleST, DATESTS, Sourcestr, ReadTimes, contentStr);} public static void main (string [] args) lança commOnexception {System.out.Println (getNewsitem (7928);}}Informações de saída
ArtigoTem [índice = 7928, imageurls = [/uploads/image/20160114/20160114225911_34428.png], title = A Escola de Engenharia Elétrica lançou o "Let the Flower of Integrity Bloom em todo o campus de inverno" Educação, Publishdate = 2016-01-14,, Fonte ", Fonte de BodyTeath = 2001-14-14-14-14-14-10). id = "artigo_content"> <p style = "text-indent: 2em;" align = "Justify"> <strong> <span style = "font-size: 16px; altura de linha: 1.5;"> Rede de notícias xidiana </span> </strong> <span style = "font-size: 16px; line-height: 1.5;"> (linhagem </span> <strony); Dan
Este artigo explica como implementar o JSUP Web Rastyler. Se o artigo for útil para você, me dê um polegar para cima.