Node.js爬虫一站到底系列八扩展篇:过关斩将——自我尝试

前言:老师指导下的实践在前几节中已经全部完成,在本节里,我们将继续进行一些新的尝试,让我们的网页丰富起来。但果不其然,自我探索的过程总是曲折的,会有大大小小的问题在前面等着你,但是不要害怕,因为问题最终都会被解决的,这只是时间的问题~

本节目标

对查询结果按某个字段进行排序

对多个查询条件进行复合查询

对查询结果进行分页显示

美化我们的页面

(一)排序
  1. 语法:在 select 查询语句中添加 order by 子句order by column_name,column_name asc/desc;降序使用 desc 关键字。
var fetchSql = "select url,source_name,title,author,publish_date " +"from fetches where title like '%" + request.query.title + "%'"+"order by author";
  1. 效果:修改 index.js 文件,根据 author 字段进行排序,可以看到相同作者的文章前后紧挨排列
    在这里插入图片描述
(二)复合查询
  1. 对同一字段复合查询
    修改 index.js 文件,利用 split 方法将字符串转化为数组,获取多个关键词,通过循环添加 select 查询条件
router.get('/process_get', function(request, response) { 
  //sql字符串和参数
  var titlearray=request.query.title.split(" ");
  
  var fetchSql = "select url,source_name,title,author,publish_date " +
    "from fetches where title like '%" + titlearray[0] + "%'";
  for(var i=1;i<titlearray.length;i++){
    fetchSql+="and title like '%"+ titlearray[i] + "%'";
  }
  mysql.query(fetchSql, function(err, result, fields) {        
    response.writeHead(200, {
      "Content-Type": "application/json"
    });
    response.write(JSON.stringify(result)); 
    response.end();       
  });
});

效果
在这里插入图片描述

  1. 对多个字段复合查询
    (1)修改 search.html 文件:添加输入文本框,通过输入框名获取到关键词添加到 HTTP GET 请求中,来从服务器加载数据。
<!DOCTYPE html>
<html>
<head>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
</head>

<body>
    <form>
        <br> 标题:<input type="text" name="title_text">
        <br> 关键词:<input type="text" name="keywords_text">
        <input class="form-submit" type="button" value="查询">      
    </form>
    <div class="cardLayout" style="margin: 10px 0px">
        <table width="100%" id="record2"></table>
    </div>
    <script>
        $(document).ready(function() {
            $("input:button").click(function() {
                $.get('/process_get?title=' + $("input[name='title_text']").val()+"&keywords="+$("input[name='keywords_text']").val(), function(data) {//添加关键词
                    $("#record2").empty();
                    $("#record2").append('<tr class="cardLayout"><td>url</td><td>source_name</td>' +
                        '<td>title</td><td>author</td><td>keywords</td><td>publish_date</td></tr>');
                    for (let list of data) {
                        let table = '<tr class="cardLayout"><td>';
                        Object.values(list).forEach(element => {
                            table += (element + '</td><td>');
                        });
                        $("#record2").append(table + '</td></tr>');
                    }
                });
            });

        });
    </script>
</body>

</html>

(2)修改index.js文件:在select语句中添加关键词查询

var express = require('express');
var router = express.Router();
var mysql = require('../mysql.js');
//var moment=require('moment')

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

router.get('/process_get', function(request, response) { 
  //sql字符串和参数
 
  var fetchSql = "select url,source_name,title,author,keywords,publish_date " + "from fetches where keywords like '%" + request.query.keywords + "%'";
  var titlearray=request.query.title.split(" ");
  for(var i=0;i<titlearray.length;i++){
    fetchSql+="and title like '%"+ titlearray[i] + "%'";
  }
  mysql.query(fetchSql, function(err, result, fields) {        
    response.writeHead(200, {
      "Content-Type": "application/json"
    });
    response.write(JSON.stringify(result)); 
    response.end();       
  });
});

module.exports = router;

效果:成功筛选!
在这里插入图片描述

(三)分页显示

本以为很容易实现的分页显示,结果花费了一天的时间,由于呈现的效果不理想,一直在做尝试更改,最后发现导致实现不了的问题也很简单:
(1)引入支持Bootstrap表的CSS和JavaScript的外部链接来源不同;
(2)对数据的处理直接交给 bootstrapTable 方法。

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    <link href="http://www.itxst.com/package/bootstrap-table-1.14.1/bootstrap-4.3.1/css/bootstrap.css" rel="stylesheet" />
    <link href="http://www.itxst.com/package/bootstrap-table-1.14.1/bootstrap-table-1.14.1/bootstrap-table.css" rel="stylesheet" />
    <script src="http://www.itxst.com/package/bootstrap-table-1.14.1/bootstrap-table-1.14.1/bootstrap-table.js"></script>
</head>

<body>
    <form>
        <br> 标题:<input type="text" name="title_text"></br>
        <br> 关键词:<input type="text" name="keywords_text"><input class="form-submit" type="button" value="查询"></br>    
    </form>
    <div class="cardLayout" style="margin: 10px 0px">
        <table width="100%" id="record2" ></table>
    </div>
    <script>
        $(document).ready(function() {
            $("input:button").click(function() {
                // $.get('/process_get?title=' + $("input[name='title_text']").val()+"&keywords="+$("input[name='keywords_text']").val(), function(data) {
                //     $("#record2").empty();
                //     $("#record2").append('<tr class="cardLayout"><td>url</td><td>source_name</td>' +
                //         '<td>title</td><td>author</td><td>keywords</td><td>publish_date</td></tr>');
                //     for (let list of data) {
                //         let table = '<tr class="cardLayout"><td>';
                //         Object.values(list).forEach(element => {
                //             table += (element + '</td><td>');
                //         });
                //         $("#record2").append(table + '</td></tr>');
                //     }
                // });

                $.get('/process_get?title=' + $("input[name='title_text']").val()+"&keywords="+$("input[name='keywords_text']").val(), function(data) {

                    $("#record2").bootstrapTable({
                        search:true,		//加上搜索控件						
                        method: 'get',		//请求方式(*)
                        pagination: true,	//是否显示分页(*)
                        striped: true,      //是否显示行间隔色
                        uniqueId: "userId", //每一行的唯一标识,一般为主键列
                        pageSize: 5,        //每页的记录行数(*)
                        sidePagination : 'client',
                        //showRefresh: true,//是否显示刷新按钮
                        //showToggle:true,  //是否显示详细视图和列表视图的切换按钮              
                        columns:[{
                            field:'url',	//对应数据库字段名
                            title:'链接',
                        },{
                            field:'source_name',
                            title:'来源'
                        },{
                            field:'title',
                            title:'标题'
                        },{
                            field:'author',
                            title:'作者'
                        },{
                            field:'keywords',
                            title:'关键词'
                        },{
                            field:'publish_date',
                            title:'发布时间',
                        }],
                        data: data,
                    });
                });
            });        
        });
    </script>
</body>

</html>

在这里插入图片描述
为对我们查询出来的结果进一步搜索,我们还可以添加一个搜索控件:在初始化方法里,多添加一个参数即可:search:true
在这里插入图片描述

(四)美化页面

最后若要把页面提供给用户使用,用CSS来美化我们的页面。第一次应用,在一些小问题上翻了好几个跟头,比如:
(1)设置背景图链接时,要添加url(),与直接在< body >内设置不同;
(2)设置字体颜色时,外部不能添加引号;
(3)对 body 颜色设置不能更改bootstrapTable中的字体颜色,是因为权重也就是优先级不够,可以通过table的id来定位,设置字体颜色。

在< head >标签里添加< style >标签,不直接在标签里设置样式,实现一定程度上的html代码和css样式分离
CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明:选择器{属性:值;属性:值;}

<style>
        body
        {
            font-size:15px;
            font-family:"宋体";
            background-image:url("images/bg1.png");
            background-repeat:no-repeat;
            background-size:100% 100%;
            background-attachment:fixed;
            color: #FFFFFF;
            
        }
        h2{
            color: #000000;
            text-align:center;
        }
        #record2{
            color: #FFFFFF;
            text-align:center;
        }
</style>

在< body >标签内插入标题

<h2>NBA最新资讯查询</h2>

最后效果
在这里插入图片描述

总结:

这一节里,自己不断摸索,遇到了各种各样的问题,由于网上的资料来源不一,有时甚至可能会有错误语法,真是经历了九九八十一难,历时两天,此刻的我由于盯着电脑屏幕过久,脑袋昏昏沉沉,但看到最后页面还是非常开心。

我给目前为止这八篇博文取了不同的名字,也算是记录了自己的心路历程,像是通关打怪一样,来到这里,我消耗了很多能量值,但是我的能力等级已经和刚刚开启关卡时的我全然不同了。

当然这个项目并不会就此结束,因为它没有最终的关卡,学习永远不会止步,希望我的装备升级后,再来此开拓新的天地,来日方长,我们不见不散!

OS:下一篇也许就叫开天辟地吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值