Android實戰:手把手實現“捧腹網”APP(一)-----捧腹網網頁分析、數據獲取

“捧腹網”頁面結構分析

捧腹網M站地址:?http://m.pengfu.com/

捧腹網M站部分截圖:?
這里寫圖片描述?
這里寫圖片描述?
從截圖中(可以直接去網站看下),我們可以看出,該網站相對簡單,一共分為四個模塊:最新笑話、捧腹段子、趣圖、神回復。 然后頁面的顯示形式有兩種,一是單純的文字(段子),二是單純的圖片(趣圖)。其中趣圖又分為靜態圖片和動態圖片(gif圖),且趣圖的顯示比段子多了“標簽”。

“捧腹網”網頁源碼分析

在網頁中點擊右鍵,點擊彈出菜單中的“查看網頁代碼”,就可以查看到當前網頁的源代碼。查看源代碼,我們可以看出,每一個笑話,都是一個list-item。我截取部分代碼,給大家略作分析。?
這里寫圖片描述
這里寫圖片描述
這里寫圖片描述
我在上圖中已經進行了標注,整個捧腹網的數據大體也就這三部分:段子、靜態圖、動態圖。其中,每個list-item中的數據包括:用戶頭像、用戶昵稱、笑話的標題、笑話內容(段子內容、靜態圖、動態圖),標簽。

“捧腹網”數據列表請求URL分析

最新笑話列表:http://m.pengfu.com/index_num.html, 其中num為第幾頁。?
捧腹段子列表:http://m.pengfu.com/xiaohua_num.html?, 其中num為第幾頁。?
趣圖列表:http://m.pengfu.com/qutu_num.html?, 其中num為第幾頁。?
神回復列表:http://m.pengfu.com/shen_num.html?, 其中num為第幾頁。

使用Jsoup解析網頁

Jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數據。?
關于如何使用Jsoup并不是本章重點,它并不難使用,具體可以參考jsoup開發指南http://www.open-open.com/jsoup/?,相信你瀏覽一遍就知道它的使用方式了。

下面,我們通過Jsoup解析上圖網頁中的數據list-item 。?
首先,我們需要首先獲取網頁源代碼,jsoup提供了一個相當簡單的方法,可以直接獲取網頁源代碼,并把它轉為Document對象。?
Document doc = Jsoup.connect(“http://m.pengfu.com/index_1.html“).get();?
當然,你也可以自己通過httpurlconnection獲取到網頁的數據流,然后通過 Document doc = Jsoup.parse(result);方法把它轉為Document對象。

在實際開發中,我們需要用過異步任務,獲取、解析網絡數據,所以,在這里,我通過httpurlconnection來獲取網頁源碼。

1.封裝HTTP請求工具類

package com.lnyp.joke.http;import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;/*** Http請求的工具類**/
public class HttpUtils {private static final int TIMEOUT_IN_MILLIONS = 10000;public interface CallBack {void onRequestComplete(String result);}/*** 異步的Get請求** @param urlStr* @param callBack*/public static void doGetAsyn(final String urlStr, final CallBack callBack) {new Thread() {public void run() {try {String result = doGet(urlStr);if (callBack != null) {callBack.onRequestComplete(result);}} catch (Exception e) {e.printStackTrace();}};}.start();}/*** Get請求,獲得返回數據** @param urlStr* @return* @throws Exception*/public static String doGet(String urlStr) {URL url = null;HttpURLConnection conn = null;InputStream is = null;ByteArrayOutputStream baos = null;try {url = new URL(urlStr);conn = (HttpURLConnection) url.openConnection();conn.setReadTimeout(TIMEOUT_IN_MILLIONS);conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);conn.setRequestMethod("GET");conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("User-Agent", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52");if (conn.getResponseCode() == 200) {is = conn.getInputStream();baos = new ByteArrayOutputStream();int len = -1;byte[] buf = new byte[128];while ((len = is.read(buf)) != -1) {baos.write(buf, 0, len);}baos.flush();//                System.out.print("str : " + baos.toString());return baos.toString();} else {throw new RuntimeException(" responseCode is not 200 ... ");}} catch (Exception e) {e.printStackTrace();} finally {try {if (is != null)is.close();} catch (IOException e) {}try {if (baos != null)baos.close();} catch (IOException e) {}conn.disconnect();}return null;}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108

2.查詢網頁源碼,轉化為Document對象。

private void qryJokes() {final String url = "http://m.pengfu.com/index_1.html";System.out.println(url);HttpUtils.doGetAsyn(url, new HttpUtils.CallBack() {@Overridepublic void onRequestComplete(String result) {if (result == null) {return;}Document doc = Jsoup.parse(result);}});}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3.通過Jsoup解析網頁源碼,封裝列表數據

import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import java.util.ArrayList;
import java.util.List;/*** 笑話工具類*/
public class JokeUtil {public List<JokeBean> getNewJokelist(Document doc) {//class等于list-item的div標簽Elements list_item_elements = doc.select("div.list-item");List<JokeBean> jokeBeanList = new ArrayList<>();if (list_item_elements.size() > 0) {for (int i = 0; i < list_item_elements.size(); i++) {JokeBean jokeBean = new JokeBean();Element list_item_element = list_item_elements.get(i);Elements head_name_elements = list_item_element.select("div.head-name");if (head_name_elements.size() > 0) {Element head_name_element = head_name_elements.first();if (head_name_element != null) {String userAvatar = head_name_element.select("img").first().attr("src");String userName = head_name_element.select("a[href]").get(1).text(); //帶有href屬性的a元素String lastTime = head_name_element.getElementsByClass("dp-i-b").first().text(); //帶有href屬性的a元素String shareUrl = head_name_element.select("a[href]").get(1).attr("href");jokeBean.setUserAvatar(userAvatar);jokeBean.setUserName(userName);jokeBean.setLastTime(lastTime);jokeBean.setShareUrl(shareUrl);}}Element con_img_elements = list_item_element.select("div").get(2);if (con_img_elements != null) {if (con_img_elements.select("img") != null) {Element img_element = con_img_elements.select("img").first();JokeBean.DataBean dataBean = new JokeBean.DataBean();if (img_element != null) {String showImg = img_element.attr("src");String gifsrcImg = img_element.attr("gifsrc");String width = img_element.attr("width");String height = img_element.attr("height");dataBean.setShowImg(showImg);dataBean.setGifsrcImg(gifsrcImg);dataBean.setWidth(width);dataBean.setHeight(height);} else {String content = con_img_elements.text().replaceAll(" ", "\n");dataBean.setContent(content);}jokeBean.setDataBean(dataBean);}}Element tagwrap_clearfix_elements = list_item_element.select("div").get(3);if (tagwrap_clearfix_elements != null) {Elements clearfixs = tagwrap_clearfix_elements.select("a[href]"); //帶有href屬性的a元素List<String> tags = new ArrayList<>();for (int j = 0; j < clearfixs.size(); j++) {String tag = clearfixs.get(j) != null ? clearfixs.get(j).text() : "";tags.add(tag);}jokeBean.setTags(tags);}jokeBeanList.add(jokeBean);}}return jokeBeanList;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100

本章小結:?
本章主要介紹了如何通過解析網頁源碼獲取網頁中的數據,其實不難,靜下心來,一點點分析,利用jsoup便可以輕而易舉的拿到我們想要的數據。?
獲取到了數據之后,接下我們便可以設計、實現“捧腹”APP。?
更多內容,下面會繼續詳解。

如果你迫不及待的想看源碼,請前往https://github.com/zuiwuyuan/Joke查看。謝謝大家的支持。

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 http://blog.csdn.net/zuiwuyuan/article/details/52551809

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286558.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

專題2-通過按鍵玩中斷\第1課-中斷處理流程深度剖析-lesson1

中斷概念 1、中斷生命周期 串口先產生一個事件&#xff0c;該事件傳送到中斷控制器里面&#xff0c;中斷控制器會進行相應過濾&#xff0c;能通過過濾&#xff0c;那么就交給CPU去處理。 2、中斷源 2440芯片手冊 6410芯片手冊 3、中斷過濾 4、中斷處理 cpu處理方式有兩種&#…

Android之okdownload下載提示奔潰Expected URL scheme ‘http‘ or ‘https‘ but was ‘data‘

1 問題 客戶現場奔潰在firebase上面提示錯誤信息如下 Fatal Exception: java.lang.IllegalArgumentException: Expected URL scheme http or https but was dataat okhttp3.t$a.a(HttpUrl.kt:38)at okhttp3.t$b.b(HttpUrl.kt:8)at okhttp3.y$a.b(Request.kt:5)at com.liulish…

mysql語法學習(一)__Instances__表

2019獨角獸企業重金招聘Python工程師標準>>> ---建表 CREATE TABLE temp( id INT ); ----查詢表 SELECT * FROM temp_t; ---刪表 DROP TABLE temp; ---修改表名 ALTER TABLE temp_tt RENAME temp; ALTER TABLE temp RENAME TO temp_t; ALTER TABLE temp RENAME AS t…

【ArcGIS遇上Python】python批量獲取柵格數據四至(top,bottom,left,right)坐標代碼

上圖所示為ArcGIS自帶的影像數據,存放路徑為C:\Program Files (x86)\ArcGIS\Desktop10.6\ArcGlobeData\wsiearth.tif",在源中可以查看該數據的四至坐標,那么,怎樣用python批量獲取多個柵格數據的四至坐標呢? 參考閱讀:【ArcGIS風暴】ArcGIS求一個矢量圖層中多個圖斑…

使用 C# 讀取 zip 壓縮包解壓文件的方法及注意事項

從 .NET Framework 4.5 版本開始&#xff0c;微軟為 .NET 類庫增加了一個名為 ZipFile 的類型。該類型在 System.IO.Compression 命名空間下&#xff0c;提供創建、解壓縮和打開 zip 存檔的靜態方法。若要在 .NET Framework 應用中使用 ZipFile 類&#xff0c;必須添加對程序集…

CenterOS x64安裝serv-U

1、下載serv-Usu - root cd / cd /src wget http://www.rhinosoft.com.cn/download/14.0.1.0/SU-MFTS-Linux-64bit.zip # 64bit下載地址wget http://www.rhinosoft.com.cn/download/14.0.1.0/SU-MFTS-Linux-32bit.zip # 32bit下載地址2、解壓serv-U安裝包unzip SU-MF…

Android實戰:手把手實現“捧腹網”APP(二)-----捧腹APP原型設計、實現框架選取

APP原型設計在APP的開發過程中&#xff0c;原型設計是必不可少的。用戶界面原型必須在先啟階段的初期或在精化階段一開始建立。整個系統&#xff08;包括它的“實際”用戶界面&#xff09;的分析、設計和實施必須在原型建立后進行。 如何設計“捧腹網”APP呢&#xff1f;我們先…

【前端就業課 第一階段】HTML5 零基礎到實戰(七)文字及圖片詳解

注意&#xff1a;手機&#xff08;APP&#xff09;打開&#xff0c;內容顯示更佳&#xff0c;不會的私聊博主即可 想要拿代碼或加入學習計劃&#xff08;** 博主會監督你并且教你寫文章 **&#xff09;的拉到最下面&#xff08;PC端Web打開&#xff09;加博主即可&#xff0c;目…

自定義桌面右鍵菜單

一 編寫自定義右鍵菜單要執行的程序 只要是在 Windows 平臺上的可執行應用程序即可。 二 修改注冊表添加自定義右鍵菜單 添加位置如下&#xff1a; HKEY_CLASSES_ROOT\Directory\Background\shell 如下圖&#xff1a;轉載于:https://www.cnblogs.com/jRoger/articles/5799664.h…

Android之giide加載失敗提示You can‘t start or clear loads in RequestListener or Target callbacks If you‘re t

1 問題 用glide進行加載視頻數據的時候,加載錯誤了再用glide進行加載一次,代碼如下 var iv = helper.getView<ImageView>(R.id.download_iv)iv?.let {val transform = RoundedCornersTransform(mContext, UnitUtils.dip2px(mContext, 12.toFloat()).toFloat())transf…

本地工程提交github

1. 首先在github上創建一個新的Repository 2. 在本地windows機器上裝上git 3. 建立一個文件夾&#xff0c;以后就用這個文件夾作為與Repository對應的庫文件夾 4. 輸入一下命令&#xff0c;建立文件夾與Repository的連接關系 touch README.md git init git add README.md git c…

【ArcGIS遇上Python】ArcGIS python計算長時間序列多個柵格數據的平均值

通常&#xff0c;我們需要將多個柵格求平均&#xff0c;例如&#xff0c;將一年中每個月的NDVI值加起來除以12&#xff0c;就會等到月均NDVI&#xff0c;該過程雖然在柵格計算器中可以實現&#xff0c;但是當時間序列較長時就比較費事&#xff0c;此時&#xff0c;python代碼是…

統信 Deepin為什么要擺脫Ubuntu和Debian?

文 | 大東出品 | OSC開源社區&#xff08;ID&#xff1a;oschina2013&#xff09;Deepin 出走 Debian 。近日&#xff0c;統信軟件宣布旗下 Linux 社區發行版 Deepin 將脫離上游 Debian&#xff0c;從 Linux Kernel 開始構建的新聞在社區引發了熱議。其實早在 7 年前&#xff0…

解決筆記本重裝問題(VISTA系統改為XP系統)

今天一位同事要我幫她的上網本重裝一下系統&#xff0c;經查看發現只是開機后一個出錯問題&#xff0c;是安裝酷狗軟件引起的&#xff0c;用360軟件管家徹底刪除就行了。這時&#xff0c;老大拿了一臺筆記本過來讓我幫忙裝XP操作系統&#xff0c;嘿~這下我的桌子擺滿了電腦&…

Android實戰:手把手實現“捧腹網”APP(三)-----UI實現,邏輯實現

APP頁面實現根據原型圖&#xff0c;我們可以看出&#xff0c;UI分為兩部分&#xff0c;底部Tab導航上方列表顯示。 所以此處&#xff0c;我們通過 FragmentTabHostFragment&#xff0c;來實現底部的導航頁面&#xff0c;通過RecyclerView來實現列表頁面。 因為篇幅原因&#xf…

【前端就業課 第一階段】HTML5 零基礎到實戰(八)表單詳解

注意&#xff1a;手機&#xff08;APP&#xff09;打開&#xff0c;內容顯示更佳&#xff0c;不會的私聊博主即可 想要拿代碼或加入學習計劃&#xff08;** 博主會監督你并且教你寫文章 **&#xff09;的拉到最下面&#xff08;PC端Web打開&#xff09;加博主即可&#xff0c;目…

【ArcGIS遇上Python】ArcGIS10.6 python批量將柵格中的特定值替換Setnull為NoData

案例一: 如下圖所示為蘭州市dem,將圖一中高程大于1600m的像元值設置為無效(Setnull)之后的效果如圖二所示。 實現過程: 柵格計算器參考文章:《【ArcGIS風暴】ArcGIS 10.2柵格計算器實用公式大全(經典珍藏版)》,該文章中主要以ArcGIS102.為平臺講解柵格計算器的…

Android之實現Room升級需要給一個表增加一個字段

1、需求 實現Room升級需要給一個表增加一個字段。 2、Room升級介紹 Room 持久化庫中通過使用 Migration 類保存用戶數據。每個 Migration 類指定起始版本和結束版本。在運行時,Room 運行每個 Migration 類的 migrate() 方法,使用正確的順序將數據庫遷移到后面的版本 1、An…

開源力量:微軟竟開源 PowerShell

導讀曾經有段時間&#xff0c;微軟稱 Linux 是“癌癥”&#xff0c;但是隨著時光流逝&#xff0c;現在微軟已經認識到了開源世界的不斷增長&#xff0c;除了在這個領域加大投入之外別無選擇。微軟已經啟動了幾個開源項目&#xff0c;希望能吸引一些 Linux 用戶&#xff0c;其中…

為何gpio_to_irq不能靜態使用?【轉】

之前在調試傳感器模塊的時候發現&#xff0c;在結構體聲明的時候irq成員使用gpio_to_irq會報錯&#xff0c;而動態使用的話就沒有問題。就對gpio_to_irq為什么不能靜態使用產生了疑問。恰巧最近又有朋友遇到了同樣的問題&#xff0c;也就提醒了我&#xff0c;去找出原因。 轉自…