搜尋
首頁web前端html教學V2EX论坛客户端之帖子信息爬取(一)_html/css_WEB-ITnose

前言

由于逛V2EX比较多,决定用闲暇时间做一个安卓客户端,开源在这里 https://github.com/ihgoo/V2EX

工欲善其事,必先利其器,整个项目以Gradle方式构建,Androidstudio开发。

公司的项目也转向AndroidStudio了,studio有个我特别喜欢的特性,输入变量的时候 记不住变量开头是怎么拼写的,能记住后面也会自动提示出来!还有就是插件多,开发向傻瓜化发展,只关注业务逻辑即可。

按照业务分模块

论坛客户端按照业务逻辑会分为以下模块

  • 在非登录状态下的浏览模块

    • 帖子列表浏览
    • 帖子详情浏览
  • 用户模块

    • 登录模块
    • 用户信息模块
  • 在登录状态下的模块

    • 带登录状态的回帖,帖子详情浏览
    • 收藏,点赞
    • 回帖提醒

依赖

依赖库会尽量考虑使用原生控件以及成熟的框架

compile 'com.jakewharton:butterknife:6.1.0'    compile 'com.squareup.retrofit:retrofit:1.9.0'compile 'com.squareup:otto:+'compile 'com.facebook.fresco:fresco:0.1.0+'compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'compile 'com.squareup.okhttp:okhttp:2.0.0'

butterknife:jack大神写的Ioc框架,媲美dagger,在idea/studio上面有支持butterknife的插件,一键findviewbyid!

retrofit: 强大的网络请求库。

fresco: 加载图片库,在使用这个之前,都是使用Imageloader的,刚出没多久的图片库,使用它是因为在项目中会有支持gif和支持图片渐进式显示的需求。

otto:eventBus框架!解耦神器,有了它,一切都变得简单了起来。

搭建项目,整理包结构

包结构如下图:

app:关于app的application等。

client:网络请求的报文头的定义,网络请求库的配置等。

core:基础框架,相当于mvc结构中的c,当然这里的c是指Controller

model:模型层

paser:解析层。无论是json,还是html,都是由此层解析生成实体类的。

persistence:放了一些常量类,数据库字段,Intnet请求字段,app配置字段等。

ui:视图展示层。

utils:一些顺手的工具类

项目以Gradle构建,app作为一个module,其他module作为挂载的形式挂到app上,优点是其他module可快速替换,且源码可修改(aar形式导入源码不可修改)。

关于API

由于调用官方json api有调用次数限制,于是考虑采用解析html页面来做。

电脑端html太过于庞大,为了省电降低app占用资源,解析的是wap端的页面,

可以通过修改请求头里的UA字段伪装成手机浏览器,在这里我用的是

public class ApiHeaders implements RequestInterceptor {    private String sessionId;    public void setSessionId(String sessionId) {        this.sessionId = sessionId;    }    public void clearSessionId() {        sessionId = null;    }    @Override public void intercept(RequestFacade request) {        request.addHeader("User-Agent", "Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19");        request.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");        if (sessionId != null) {        }    }}

解析html,java里可以用一个叫做jsoup的库,媲美python中的pyquery,支持类Jqery选择器方式来抓取自己想要的资源,简单方便粗暴极了。唯一的缺点就是如果页面里有些元素是ajax形式形成的,那这个就抓瞎了,可以使用httpunit,不过httpunit存在性能问题,要启动一个浏览器内核来运行这个网页,网页上的js完成后,再抓取信息。

解析帖子列表

在帖子列表中需要关注解析这几个数据

  • avatar 作者头像
  • node 节点名称
  • title 标题
  • small fade (time) 发表时间
  • small fade author 作者名称
  • count_livid 回帖数以下是用jsoup解析的代码,解析成功后塞到ForumItemBean这个实体类中,以集合形式返回给listView的adapter中

    public class PaserFourmList {    public static ArrayList<ForumItemBean> paser2ForumItem(String string) {        Document document = Jsoup.parse(string);        Elements elements = document.select(".cell").select(".item");        ArrayList<ForumItemBean> list = new ArrayList<>();        for (Element element : elements) {            // avatar            // node            // title            // small fade (time)            // small fade author            // count_livid            String avatar = element.select(".avatar").first().attr("src");            String node = element.select(".node").first().html();            String username = element.select(".small > strong").first().text();            String countLivid = element.getElementsByClass("count_livid").text();            String time = element.select(".small").select(".fade").get(1).text();            String href = element.getElementsByClass("item_title").html();            if (href.length()!=0){                href = href.substring(12, href.indexOf("#"));            }            int indexOf = time.indexOf("前");            if (indexOf != -1) {                time = time.substring(0, indexOf);            }            ForumItemBean forumItemBean = new ForumItemBean();            Member member = new Member();            member.setAvatarMini(avatar);            member.setUsername(username);            forumItemBean.setId(Misc.parseInt(href, 0));            forumItemBean.setMember(member);            forumItemBean.setLastTime(time);            forumItemBean.setReplies(Misc.parseInt(countLivid, 0));            forumItemBean.setTitle(element.select(".item_title").first().select("[href]").html());            list.add(forumItemBean);        }        return list;    }}

使用Jsoup遇到的坑

在用jsoup的时候 像这种class带空格的,需要使用 element.select(“.content”).select(“.type”),才可以成功解析,使用element.select(“.content type”)是解析不出来的!

还有 # ,这种的,使用element.select(“.content-type”)也解析不出来,需要用element.getElementsByClass(“content-type”)才可以。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
&gt; gt;的目的是什麼 元素?&gt; gt;的目的是什麼 元素?Mar 21, 2025 pm 12:34 PM

本文討論了HTML&lt; Progress&gt;元素,其目的,樣式和與&lt; meter&gt;元素。主要重點是使用&lt; progress&gt;為了完成任務和LT;儀表&gt;對於stati

&lt; datalist&gt;的目的是什麼。 元素?&lt; datalist&gt;的目的是什麼。 元素?Mar 21, 2025 pm 12:33 PM

本文討論了html&lt; datalist&gt;元素,通過提供自動完整建議,改善用戶體驗並減少錯誤來增強表格。Character計數:159

&lt; meter&gt;的目的是什麼。 元素?&lt; meter&gt;的目的是什麼。 元素?Mar 21, 2025 pm 12:35 PM

本文討論了HTML&lt; meter&gt;元素,用於在一個範圍內顯示標量或分數值及其在Web開發中的常見應用。它區分了&lt; meter&gt;從&lt; progress&gt;和前

HTML5中跨瀏覽器兼容性的最佳實踐是什麼?HTML5中跨瀏覽器兼容性的最佳實踐是什麼?Mar 17, 2025 pm 12:20 PM

文章討論了確保HTML5跨瀏覽器兼容性的最佳實踐,重點是特徵檢測,進行性增強和測試方法。

如何使用HTML5表單驗證屬性來驗證用戶輸入?如何使用HTML5表單驗證屬性來驗證用戶輸入?Mar 17, 2025 pm 12:27 PM

本文討論了使用HTML5表單驗證屬性,例如必需的,圖案,最小,最大和長度限制,以直接在瀏覽器中驗證用戶輸入。

視口元標籤是什麼?為什麼對響應式設計很重要?視口元標籤是什麼?為什麼對響應式設計很重要?Mar 20, 2025 pm 05:56 PM

本文討論了視口元標籤,這對於移動設備上的響應式Web設計至關重要。它解釋瞭如何正確使用確保最佳的內容縮放和用戶交互,而濫用可能會導致設計和可訪問性問題。

我如何使用html5&lt; time&gt; 元素以語義表示日期和時間?我如何使用html5&lt; time&gt; 元素以語義表示日期和時間?Mar 12, 2025 pm 04:05 PM

本文解釋了HTML5&lt; time&gt;語義日期/時間表示的元素。 它強調了DateTime屬性對機器可讀性(ISO 8601格式)的重要性,並在人類可讀文本旁邊,增強Accessibilit

&lt; iframe&gt;的目的是什麼。 標籤?使用時的安全考慮是什麼?&lt; iframe&gt;的目的是什麼。 標籤?使用時的安全考慮是什麼?Mar 20, 2025 pm 06:05 PM

本文討論了&lt; iframe&gt;將外部內容嵌入網頁,其常見用途,安全風險以及諸如對象標籤和API等替代方案的目的。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版