Spark項(xiàng)目之簡書百萬用戶動(dòng)態(tài)分析與查詢展示

一、項(xiàng)目框架

image.png

二碘赖、代碼實(shí)現(xiàn)

1驾荣、數(shù)據(jù)庫建表

1)、創(chuàng)建動(dòng)態(tài)信息表

DROP TABLE IF EXISTS `user_dymatic_info`;
CREATE TABLE `user_dymatic_info` (
  `_id` int(11) NOT NULL AUTO_INCREMENT,
  `content` longtext NOT NULL,
  `time` varchar(60) NOT NULL DEFAULT '',
  `slug` varchar(60) NOT NULL DEFAULT '',
  `dymatic_type` varchar(60) NOT NULL DEFAULT '',
  `extra_content` varchar(500) NOT NULL DEFAULT '',
  PRIMARY KEY (`_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

2)普泡、創(chuàng)建用戶信息表

DROP TABLE IF EXISTS `user_information`;
CREATE TABLE `user_information` (
`id`  varchar(255) NOT NULL primary key,
`follow`  varchar(255) NOT NULL ,
`follower`  varchar(255) NOT NULL ,
`article`  varchar(255) NOT NULL ,
`words`  varchar(255) NOT NULL ,
`like`  varchar(255) NOT NULL 
)
;

2播掷、jsoup爬蟲以及數(shù)據(jù)寫入數(shù)據(jù)庫

使用maven創(chuàng)建java項(xiàng)目

1)、添加如下依賴:

<dependency>
      <groupId>org.jsoup</groupId>
      <artifactId>jsoup</artifactId>
      <version>1.10.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.56</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>

2)撼班、編寫爬蟲以及寫入數(shù)據(jù)庫代碼

package com.neusoft;


import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.sql.*;

public class Jianshu {
    public static void jsoup(String id) throws IOException, SQLException, ClassNotFoundException {

        Document doc = Jsoup.connect("http://www.reibang.com/users/"+id+"/timeline?page=1")
                .userAgent("Mozilla")
                .timeout(10000000)
                .get();
        String href = doc.select("a.nickname").attr("href");
//        用戶id
        String slug=href.substring(href.lastIndexOf("/")+1);
        System.out.println(slug);
//        max_id
        String max_id="";

//        連接數(shù)據(jù)庫
        Connection conn=null;
        PreparedStatement stmt= null;
        String jdbcurl = "jdbc:mysql://localhost:3306/test";
        String user = "root";
        String password = "root" ; //數(shù)據(jù)庫密碼
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection(jdbcurl, user, password);
//        采集用戶信息
//        關(guān)注
        String follow="";
//        粉絲
        String follower="";
//        文章
        String article="";
//        字?jǐn)?shù)
        String words="";
//        收獲喜歡
        String like="";
//        獲得當(dāng)前用戶基本信息集合
        Document doc1 = Jsoup.connect("http://www.reibang.com/users/" + id + "/timeline?page=1").get();
        Elements eles = doc1.select("div.info li");
        int i=0;
//        遍歷當(dāng)前用戶信息集合歧匈,按順序依次賦值
        for (Element el:eles) {
            if (i==0){
                follow=el.select("p").text();
            }else if (i==1){
                follower=el.select("p").text();
            }else if (i==2){
                article=el.select("p").text();
            }else if (i==3){
                words=el.select("p").text();
            }else if (i==4){
                like=el.select("p").text();
            }else break;
            i++;
        }
//      查詢當(dāng)前用戶是否存在
        String usersql="select * from user_information where id=?";
        System.out.println(usersql);
        stmt=conn.prepareStatement(usersql);
        stmt.setString(1,slug);
        ResultSet rs1 = stmt.executeQuery();
//        判斷當(dāng)前用戶是否已經(jīng)存在,如果存在就更新數(shù)據(jù)砰嘁,如果不存在就新建用戶
        if (rs1.next()){
            String userupdate="UPDATE user_information SET follow=?,follower=?,article=?,words=?,`like`=? WHERE id =?";
            System.out.println(userupdate);
            stmt=conn.prepareStatement(userupdate);
            stmt.setString(1,follow);
            stmt.setString(2,follower);
            stmt.setString(3,article);
            stmt.setString(4,words);
            stmt.setString(5,like);
            stmt.executeUpdate();
        }else {
            String userinsert="insert into user_information(id,follow,follower,article,words,`like`) values (?,?,?,?,?,?)";
            System.out.println(userinsert);
            stmt=conn.prepareStatement(userinsert);
            stmt.setString(1,slug);
            stmt.setString(2,follow);
            stmt.setString(3,follower);
            stmt.setString(4,article);
            stmt.setString(5,words);
            stmt.setString(6,like);
            stmt.executeUpdate();
        }
        int page = 1;
        out:while (true) {
            String url;
            if(page==1){
                url="http://www.reibang.com/users/"+id+"/timeline?page=1";
            }else {
                url="http://www.reibang.com/users/"+id+"/timeline?max_id="+max_id+"&page="+page;
            }
            Document document = Jsoup.connect(url)
                    .userAgent("Mozilla")
                    .timeout(10000000)
                    .get();
//                每一條動(dòng)態(tài)里面的內(nèi)容
            Elements ele = document.select("div#list-container li");
            if(ele==null||ele.size()<=0){
                break;
            }
            for (Element e:ele) {
                //        動(dòng)態(tài)類型
                String dymatic_type="";
                //        時(shí)間
                String time = "";
                //        評論內(nèi)容
                String content="";
                //        被評論的文章
                String extra_content="";
                //        取得max_id用作翻頁
                String index=e.attr("id");
                    max_id = Integer.parseInt(index.substring(index.indexOf("-") + 1)) - 1 + "";
//                時(shí)間
                    String time8 = e.select("span").attr("data-datetime");
                    time = time8.substring(0, time8.indexOf("+"));
//               System.out.println(time);
//               動(dòng)態(tài)類型
                dymatic_type = e.select("div.info span").attr("data-type");
//                判斷動(dòng)態(tài)類型是否是評論類型
                if(dymatic_type.equals("comment_note"))
                {
                    content=e.select("p.comment").text();
                    String str=e.select("a.title").attr("href");
                    extra_content=str.substring(str.lastIndexOf("/")+1);
                }
//              斷點(diǎn)續(xù)爬件炉,從最新的開始爬,直到爬到數(shù)據(jù)庫里面存儲(chǔ)的最新的一天和剛爬的數(shù)據(jù)一樣矮湘,停止爬蟲
                String exit="select * from user_dymatic_info where time=? and slug=? and dymatic_type=?";
                System.out.println(exit);
                stmt = conn.prepareStatement(exit);
                stmt.setString(1, time);
                stmt.setString(2, slug);
                stmt.setString(3, dymatic_type);
                ResultSet resultSet = stmt.executeQuery();
                if (resultSet.next()){
                    break out;
                }
//              將爬取到的數(shù)據(jù)存入數(shù)據(jù)庫
                String sql = "insert into user_dymatic_info (content,time,slug,dymatic_type,extra_content) values (?,?,?,?,?)";
                stmt = conn.prepareStatement(sql);
                stmt.setString(1, content);
                stmt.setString(2, time);
                stmt.setString(3, slug);
                stmt.setString(4, dymatic_type);
                stmt.setString(5, extra_content);
                stmt.executeUpdate();
            }
            System.out.println("-----------------------------");
            System.out.println(max_id);
//            翻頁
            page++;
        }
    }

    public static void main(String[] args) throws SQLException, IOException, ClassNotFoundException {
        jsoup("d99a7dfae9e4");
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斟冕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缅阳,更是在濱河造成了極大的恐慌磕蛇,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件十办,死亡現(xiàn)場離奇詭異孤里,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)橘洞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門捌袜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炸枣,你說我怎么就攤上這事虏等。” “怎么了适肠?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵霍衫,是天一觀的道長。 經(jīng)常有香客問我侯养,道長敦跌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮柠傍,結(jié)果婚禮上麸俘,老公的妹妹穿的比我還像新娘。我一直安慰自己惧笛,他們只是感情好从媚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著患整,像睡著了一般拜效。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上各谚,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天紧憾,我揣著相機(jī)與錄音,去河邊找鬼昌渤。 笑死稻励,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的愈涩。 我是一名探鬼主播望抽,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼履婉!你這毒婦竟也來了煤篙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤毁腿,失蹤者是張志新(化名)和其女友劉穎辑奈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體已烤,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸠窗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胯究。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稍计。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖裕循,靈堂內(nèi)的尸體忽然破棺而出臣嚣,到底是詐尸還是另有隱情,我是刑警寧澤剥哑,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布硅则,位于F島的核電站,受9級特大地震影響株婴,放射性物質(zhì)發(fā)生泄漏怎虫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望大审。 院中可真熱鬧蘸际,春花似錦、人聲如沸饥努。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酷愧。三九已至,卻和暖如春缠诅,著一層夾襖步出監(jiān)牢的瞬間溶浴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工管引, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留士败,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓褥伴,卻偏偏與公主長得像谅将,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子重慢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353