jsoup爬蟲簡書首頁數據作個小Demo

代碼地址以下:
http://www.demodashi.com/demo/11643.htmlhtml

昨天LZ去面試,遇到一個大牛,被血虐一番,發現本身基礎仍是很薄弱,對java一些原理掌握的仍是不夠穩固,好比java反射註解,知道一點就是說不出來,很尷尬... 生命不止,學習不止啊java

以前那個項目 QNews 用的是的第三方的數據平臺,因此訪問次數會有限制,這就很無奈。。。git

個人博客地址github

次數限制.PNG

天天只能請求100次....可是LZ這個窮屌絲也買不起服務器,因此就上網查,有什麼別的方法能夠獲取數據,意外之間發現了jsoup這個強大的框架,就花了上午時間學習了一下,而後下午作了一個小Demo,功能比較單一,請見諒。面試

其實一開始的時候是想 爬今日頭條的數據,可是發現數據老是爲空,我估計是上鎖了... 而後就把矛頭轉向了 簡書,哈哈哈...果真簡書就是好,數據直接就能夠爬到了, 好開心啊!!瀏覽器

先演示一波動態圖:服務器

總體效果.gif

話說這個佈局就花了我半個小時...框架

一些基礎的我就不說了,就簡單說明一下個人數據是如何爬到的。能夠直接去看一下個人源碼,寫的比較倉促,一些細節沒有處理好,多多指教。佈局

1. 準備

1. 相關資料

官方文檔學習

中文文檔

2. 添加依賴

compile 'org.jsoup:jsoup:1.9.2'

3. 打開簡書首頁

first.gif

在單個部分上 右擊,而後點擊檢查選項(我用的是QQ瀏覽器,其餘何嘗試),底部就會跳出網頁的源碼,而且會跟蹤到這個item對應的源碼。

從上圖能夠大概瞭解到每一個<li></li>標籤裏的內容就是咱們每一個item的信息。

2. 爬數據

1. 獲取 Document 對象

Document document = Jsoup.connect("http://www.jianshu.com/")
                             .timeout(10000)
                             .get();

這裏經過創建與服務器的連接,並設置10s的超時鏈接來獲取 Document 對象

2. 獲取跟標籤的 Elements 對象

first.PNG

Elements noteList = document.select("ul.note-list");
Elements li = noteList.select("li");

找到文章列表模塊,發現 <ul class="note-list></ul> 是咱們須要信息的跟標籤。經過 select 方法查詢節點全部信息。

for (Element element : li) {
    ...
}

下面所有都是 li標籤的列表,裏面的內容大體類似,咱們就能夠經過循環來遍歷裏面的信息。

3. 獲取每一個部分全部信息

由於信息比較多,我就選擇比較有表明性的來將一下。

有個很是簡單的方式:直接在你須要獲取內容的部分右擊,點擊 檢查,就能夠直接追蹤到要查詢的位置。

second.gif

1. 標題

就拿標題而言,直接在標題右擊-->檢查,便可,一目瞭然。而後我把數據截圖一下。

second.PNG

String title = element.select("a.title").text()

經過 select 查詢節點信息,而後.text 獲取裏面文本內容。

2. 頭像:

third.PNG

String avatar = element.select("a.avatar").select("img").attr("src")

這個就是先找到頭像 節點,而後圖片節點,最後經過 attr 獲取圖片 url

3. 首頁連接

forth.PNG

String authorLink = element.select("a.blue-link").attr("abs:href")

這裏注意 href 元素,他存放的就是跳轉連接,不過是相對路徑,這個時候就須要經過 attr("abs:href") 獲取絕對路徑。

其餘 就 大同小異,其實我知道也就這麼多,也是不斷嘗試經過打印得出來的,仍是比較心酸的,比較沒學過 js,不過對 js 挺有興趣的。

3. 封裝

剩下的就是將獲取到的數據加載到bean對象中

1. 建立 bean 對象

public class JianshuBean {
    private String authorName;          // 做者
    private String authorLink;          // 做者連接
    private String time;                // 更新時間
    private String primaryImg;          // 主圖
    private String avatarImg;           // 頭像

    private String title;               // 標題
    private String titleLink;           // 標題連接
    private String content;             // 內容
    private String collectionTagLink;   // 專題連接
    private String readNum;             // 閱讀量

    private String talkNum;             // 評論
    private String likeNum;             // 喜歡
    private String collectionTag;       // 專題

    // ... get set
}

2. 將獲取到的數據添加到集合中

for (Element element : li) {
    JianshuBean bean = new JianshuBean();
    bean.setAuthorName(element.select("div.name").text()); // 做者姓名
    bean.setAuthorLink(element.select("a.blue-link").attr("abs:href")); // 做者首頁連接
    bean.setTime(element.select("span.time").attr("data-shared-at"));   // 發表時間
    bean.setPrimaryImg(element.select("img").attr("src"));  // 主圖
    bean.setAvatarImg(element.select("a.avatar").select("img").attr("src")); // 頭像

    bean.setTitle(element.select("a.title").text());    // 標題
    bean.setTitleLink(element.select("a.title").attr("abs:href")); // 標題連接

    bean.setContent(element.select("p.abstract").text());       // 內容
    bean.setCollectionTagLink(element.select("a.collection-tag").attr("abs:href")); // 專題連接

    String[] text = element.select("div.meta").text().split(" ");
    if (text[0].matches("[0-9]+")) {
        bean.setReadNum(text[0]);
        bean.setTalkNum(text[1]);
        bean.setLikeNum(text[2]);
    } else {
        bean.setCollectionTag(text[0]);
        bean.setReadNum(text[1]);
        bean.setTalkNum(text[2]);
        bean.setLikeNum(text[3]);

    }
    mBeans.add(bean);
}

再來看一下效果:

總體效果.gif

項目文件截圖:

  • 點擊頭像查看做者信息
  • 點擊圖片或文字查看文章內容
  • 點擊專題查看專題內容
  • 下拉刷新獲取最新內容

但願你們多多支持我,謝謝!
jsoup爬蟲簡書首頁數據作個小Demo

代碼地址以下:
http://www.demodashi.com/demo/11643.html

注:本文著做權歸做者,由demo大師代發,拒絕轉載,轉載須要做者受權

相關文章
相關標籤/搜索