爬虫大作业网站展示

基于第一个项目爬虫爬取的数据(3-5个数据源),完成数据展示网站。

基本要求:

1、用户可注册登录网站,非注册用户不可登录查看数据

2、用户注册、登录、查询等操作记入数据库中的日志

3、实现查询词支持布尔表达式 (比如“新冠 AND 肺炎或者“新冠 OR 肺炎”)

4、爬虫数据查询结果列表支持分页和排序

5、用Echarts或者D3实现3个以上的数据分析图表展示在网站中

扩展要求(非必须):

1、实现对爬虫数据中文分词的查询

2、实现查询结果按照主题词打分的排序

          3、用Elastic Search+Kibana展示爬虫的数据结果

目录

一、建mysql表

二、登录/注册端

三、查询端

四、图表

1.柱状图

2.词云

3.折线图

4.饼图


一、建mysql表

对应在mysql中建立user和user_action两张表用以储存用户信息

即               

二、登录/注册端

app.use(session({
  secret: 'sessiontest',//与cookieParser中的一致
  resave: true,
  saveUninitialized: false, // 是否保存未初始化的会话
  cookie : {
    maxAge : 1000 * 60 * 60, // 设置 session 的有效时间,单位毫秒
  },
}));
$scope.check_pwd = function () {

    var data = JSON.stringify({
        username: $scope.username,
        password: $scope.password
    });

$http.post("/users/login", data).then(function (res) {
    if(res.data.msg=='ok') {
        window.location.href='/news.html';
    }
    else{
        $scope.msg=res.data.msg;
    }
},function (err) {
        $scope.msg = err.data;
    });
};

$scope.doAdd = function () {
    if($scope.add_password!==$scope.confirm_password){
            // $timeout(function () {
            //     $scope.msg = '两次密码不一致!';
            // },100);
        $scope.msg = '两次密码不一致!';
    }
    else {
        var data = JSON.stringify({
        username: $scope.add_username,
        password: $scope.add_password
    });
            
$http.post("/users/register", data).then(function (res) {
    if(res.data.msg=='成功注册!请登录') {
        $scope.msg=res.data.msg;
        $timeout(function () {
            window.location.href='index.html';
        },2000);
    } 
    else {
        $scope.msg = res.data.msg;
    }
    }, function (err) {
            $scope.msg = err.data;
        });
    }
};

module.exports = { mysql: { host : 'localhost', user : 'root', password: 'root', database: 'crawl', connectionLimit: 10 } };

三、查询端

$scope.search = function () {
    var title1 = $scope.title1;
    var title2 = $scope.title2;
    var selectTitle = $scope.selectTitle;
    var content1 = $scope.content1;
    var content2 = $scope.content2;
    var selectContent = $scope.selectContent;
    var sorttime = $scope.sorttime;

    // 检查用户传的参数是否有问题
    //用户有可能这样输入:___  and/or  新冠(直接把查询词输在了第二个位置)
    if(typeof title1=="undefined" && typeof title2!="undefined" && title2.length>0){
        title1 = title2;
    }
    if(typeof content1=="undefined" && typeof content2!="undefined" && content2.length>0){
        content1 = content2;
    }
    // 用户可能一个查询词都不输入,默认就是查找全部数据
    var myurl = `/news/search?t1=${title1}&ts=${selectTitle}&t2=${title2}&c1=${content1}&cs=${selectContent}&c2=${content2}&stime=${sorttime}`;

$http.get(myurl).then(
        function (res) {
            if(res.data.message=='data'){
                $scope.isisshowresult = true; //显示表格查询结果
                // $scope.searchdata = res.data;
                $scope.initPageSort(res.data.result)
            }else {
                window.location.href=res.data.result;
            }


        },function (err) {
            $scope.msg = err.data;
        });
};cript
 $scope.showSearch = function () {
        $scope.isShow = true;
        $scope.isisshowresult = false;

        // 再次回到查询页面时,表单里要保证都空的
        $scope.title1=undefined;
        $scope.title2=undefined;
        $scope.selectTitle='AND';
        $scope.content1=undefined;
        $scope.content2=undefined;
        $scope.selectContent='AND';
        $scope.sorttime=undefined;
    };

    $scope.logout = function () {

        // $http.get().then();

        $http.get("/users/logout").then(
            function (res) {
                window.location.href=res.data.result;

            },function (err) {
                $scope.msg = err.data;
            }
        );

    };

分页

 $scope.first = function () {
        $scope.selectPage(1);};
    $scope.last = function () {
        $scope.selectPage($scope.pages);};

第一页示例

标题作者关键词链接发布日期
火箭CEO宣布本赛季结束将正式辞职珅葳布朗 火箭 休斯顿火箭队火箭CEO宣布本赛季结束将正式辞职_NBA_新浪竞技风暴_新浪网2021年04月24日 07:38 
火箭主帅称小波特违反健康安全协议将缺席三场珅葳休斯顿火箭队 奥古斯丁 凯文火箭主帅称小波特违反健康安全协议将缺席三场_NBA_新浪竞技风暴_新浪网2021年04月22日 06:36
火箭终于跌至联盟最后一名!离状元签又近一步汉堡火箭 状元签 森林狼队火箭终于跌至联盟最后一名!离状元签又近一步_NBA_新浪竞技风暴_新浪网2021年04月17日 10:44
火箭19连败!东部垫底队也输 12场分差达2位数罗森火箭 活塞 NBA火箭19连败!东部垫底队也输 12场分差达2位数_NBA_新浪竞技风暴_新浪网2021年03月20日 11:01
火箭替补席扎心一幕太惨了!15连败谁来拯救?Emily火箭 爵士 NBA火箭替补席扎心一幕太惨了!15连败谁来拯救?_NBA_新浪竞技风暴_新浪网2021年03月13日 14:00

四、图表

1.柱状图

$scope.histogram = function () {
        $scope.isShow = false;
        $http.get("/news/histogram")
            .then(
                function (res) {

                    if(res.data.message=='url'){
                        window.location.href=res.data.result;
                    }else {

                        // var newdata = washdata(data);
                        let xdata = [], ydata = [], newdata;

                        var pattern = /\d{4}-(\d{2}-\d{2})/;
                        res.data.result.forEach(function (element) {
                            // "x":"2020-04-28T16:00:00.000Z" ,对x进行处理,只取 月日
                            xdata.push(pattern.exec(element["x"])[1]);
                            ydata.push(element["y"]);
                        });
                        newdata = {"xdata": xdata, "ydata": ydata};

                        var myChart = echarts.init(document.getElementById('main1'));

                        // 指定图表的配置项和数据
                        var option = {
                            title: {
                                text: '新闻发布数 随时间变化'
                            },
                            tooltip: {},
                            legend: {
                                data: ['新闻发布数']
                            },
                            xAxis: {
                                data: newdata["xdata"]
                            },

                            yAxis: {},
                            series: [{
                                name: '新闻数目',
                                type: 'bar',
                                data: newdata["ydata"]
                            }]
                        };
                        // 使用刚指定的配置项和数据显示图表。
                        myChart.setOption(option);
                    }
                },
                function (err) {
                    $scope.msg = err.data;
                });

    };

在这里插入图片描述

2.词云

$scope.wordcloud = function () {
        $scope.isShow = false;
        $http.get("/news/wordcloud").then(
            function (res) {
                if(res.data.message=='url'){
                    window.location.href=res.data.result;
                }else {
                    var mainContainer = document.getElementById('main1');

                    var chart = echarts.init(mainContainer);

                    var data = [];
                    for (var name in res.data.result) {
                        data.push({
                            name: name,
                            value: Math.sqrt(res.data.result[name])
                        })
                    }

                    var maskImage = new Image();
                    maskImage.src = './images/logo.png';

                    var option = {
                        title: {
                            text: '所有新闻内容 jieba分词 的词云展示'
                        },
                        series: [{
                            type: 'wordCloud',
                            sizeRange: [12, 60],
                            rotationRange: [-90, 90],
                            rotationStep: 45,
                            gridSize: 2,
                            shape: 'circle',
                            maskImage: maskImage,
                            drawOutOfBound: false,
                            textStyle: {
                                normal: {
                                    fontFamily: 'sans-serif',
                                    fontWeight: 'bold',
                                    // Color can be a callback function or a color string
                                    color: function () {
                                        // Random color
                                        return 'rgb(' + [
                                            Math.round(Math.random() * 160),
                                            Math.round(Math.random() * 160),
                                            Math.round(Math.random() * 160)
                                        ].join(',') + ')';
                                    }
                                },
                                emphasis: {
                                    shadowBlur: 10,
                                    shadowColor: '#333'
                                }
                            },
                            data: data
                        }]
                    };

                    maskImage.onload = function () {
                        // option.series[0].data = data;
                        chart.clear();
                        chart.setOption(option);
                    };

                    window.onresize = function () {
                        chart.resize();
                    };
                }

            });
    }

});

3.折线图

$scope.line = function () {
        $scope.isShow = false;
        $http.get("/news/line").then(
            function (res) {
                if(res.data.message=='url'){
                    window.location.href=res.data.result;
                }else {
                    var myChart = echarts.init(document.getElementById("main1"));
                    option = {
                        title: {
                            text: '"火箭"该词在新闻中的出现次数随时间变化图'
                        },
                        xAxis: {
                            type: 'category',
                            data: Object.keys(res.data.result)
                        },
                        yAxis: {
                            type: 'value'
                        },
                        series: [{
                            data: Object.values(res.data.result),
                            type: 'line',
                            itemStyle: {normal: {label: {show: true}}}
                        }],

                    };

                    if (option && typeof option === "object") {
                        myChart.setOption(option, true);
                    }
                }

            });
    };
    

4.饼图

饼图可能因为浏览器原因加载不出来

$scope.pie = function () {
        $scope.isShow = false;
        $http.get("/news/pie").then(
            function (res) {
                if(res.data.message=='url'){
                    window.location.href=res.data.result;
                }else {
                    let newdata = [];

                    var pattern = /./;//匹配名字
                    res.data.result.forEach(function (element) {
                       // "x":  责任编辑:李夏君 ,对x进行处理,只取 名字
                      newdata.push({name: pattern.exec(element["x"])[1], value: element["y"]});
                    });

                    var myChart = echarts.init(document.getElementById('main1'));
                    var app = {};
                    option = null;
                    // 指定图表的配置项和数据
                    var option = {
                        title: {
                            text: '作者发布新闻数量',
                            x: 'center'
                        },
                        tooltip: {
                            trigger: 'item',
                            formatter: "{a} <br/>{b} : {c} ({d}%)"
                        },
                        legend: {
                            orient: 'vertical',
                            left: 'left',
                            // data: ['直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎']
                        },
                        series: [
                            {
                                name: '访问来源',
                                type: 'pie',
                                radius: '55%',
                                center: ['50%', '60%'],
                                data: newdata,
                                itemStyle: {
                                    emphasis: {
                                        shadowBlur: 10,
                                        shadowOffsetX: 0,
                                        shadowColor: 'rgba(0, 0, 0, 0.5)'
                                    }
                                }
                            }
                        ]
                    };
                    // myChart.setOption(option);
                    app.currentIndex = -1;

                    setInterval(function () {
                        var dataLen = option.series[0].data.length;
                        // 取消之前高亮的图形
                        myChart.dispatchAction({
                            type: 'downplay',
                            seriesIndex: 0,
                            dataIndex: app.currentIndex
                        });
                        app.currentIndex = (app.currentIndex + 1) % dataLen;
                        // 高亮当前图形
                        myChart.dispatchAction({
                            type: 'highlight',
                            seriesIndex: 0,
                            dataIndex: app.currentIndex
                        });
                        // 显示 tooltip
                        myChart.dispatchAction({
                            type: 'showTip',
                            seriesIndex: 0,
                            dataIndex: app.currentIndex
                        });
                    }, 1000);
                    if (option && typeof option === "object") {
                        myChart.setOption(option, true);
                    }
                    ;
                }
            });
    };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值