Node.js实现网络新闻爬虫及搜索功能(四)

以"慕课网"为例使用nodeJS爬取动态网页中的动态数据 以前nodeJS教程出来的时候,慕课网上的学习人数是静态数据,教程中是可以直接爬取。然而现在却改成了动态js加载,请看大屏幕:解决方法:骚气 步骤一 步骤二 步骤三 后面就看大家的了,哈哈哈哈,慕课网要被玩坏了···· 阅读详情

Node.js实现网络新闻爬虫及搜索功能(四)

系列文章查看不到可能是优快云审核原因,可以在我的知乎专栏看到所有文章:https://www.zhihu.com/column/c_1370026160999415808

项目要求

一、爬虫部分
        1、完成目标网站的网页分析和爬虫设计。
        2、爬取不少于100条数据(每条数据包括7个字段,新闻关键词、新闻标题、新闻日期、新闻作者、新闻来源、新闻摘要、新闻内容),并存储在数据库中。

二、搜索网站部分
        1、完成对数据库中爬取新闻内容和标题的搜索功能,搜索结果以表格形式展示在前端页面中。
        2、完成对搜索内容的时间热度分析,使用表格展示爬取数据内容中每一天包含搜索内容的条数。

本文是该项目第四部分:搜索展示新闻和搜索内容时间热度表格

三、搜索网站部分

1. 建立前端网页

        前端网页代码开源在我该项目的github仓库中:Node.js实现网络新闻爬虫及搜索功能github仓库地址。在此就不再赘述,只介绍展示相关JavaScript代码的编写。
        根据需要,我建立了三个前端网页,其名称和作用如下表格所示:

网页名称作用
search.html提供新闻搜索功能,分为两个Tab,分别可以根据新闻标题和新闻内容搜索
news.html提供新闻展示功能,当没有搜索信息时,展示全部已爬取新闻;当指定搜索信息时,展示搜索后的结果和搜索内容时间热度表格
news_info.html提供新闻详情展示功能,展示某条新闻的所有具体信息

search.html
search.html
在这里插入图片描述
        分为两个Tab,分别可以根据新闻标题和新闻内容搜索。前后端交互JavaScript代码为:

<script text="text/javascript">
        function search_news(search_type){
            var search_info = "";
            if (search_type == 'title') {
                search_info = $('input#title').val();
            } else if (search_type == 'content') {
                search_info = $('input#content').val();
            }
            if (search_info == "") {
                alert("请输入搜索信息!");
            } else {
                var url = "/search_news";
                $.ajax({
                    type: "GET",
                    url: url,
                    data: {
                        search_type: search_type,
                        search_info: search_info
                    },
                    success: function(data){
                        alert(data.msg);
                        if (data.code == 1) {
                            window.location = "/news.html";
                        } else {
                            window.location = "/search.html";
                        }
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown) {
                        alert(XMLHttpRequest.status);
                        alert(XMLHttpRequest.readyState);
                        alert(textStatus);
                        window.location = "/search.html";
                    }
                });
            }
        }
    </script>

两个确认button为:

<input type="submit" value="开始查询" class="mt-2 btn btn-primary" onclick="search_news('title')">
<input type="submit" value="开始查询" class="mt-2 btn btn-primary" onclick="search_news('content')">

news.html
        页面加载时渲染HTML的JavaScript函数:

<script text="text/javascript">
        $(document).ready(function() {
            var url = "/show_news";
            $.ajax({
                type: "GET",
                url: url,
                data: {
                },
                success: function(data){
                    for (var i = 0; i < data.news_list.length; i++) {
                        var begin_str = "<tr id='" + data.news_list[i].id_news + "'>";
                        var source_str = "<td class='text-left'>" + data.news_list[i].source + "</td>";
                        var title_str = "<td class='text-left'><a href='" + data.news_list[i].url + "'>" + data.news_list[i].title.slice(0, 10) + "..." + "</a></td>";
                        var author_str = "<td class='text-left'>" + data.news_list[i].author + "</td>";
                        var date_str = "<td class='text-left'>" + data.news_list[i].date.slice(0, 10) + "</td>";
                        var info_str = "<td class='text-right'><i class='fa fa-paper-plane'></i>&nbsp&nbsp<input type='submit' value='详情' οnclick='news_info(" + data.news_list[i].id_news + ")' /></td>";
                        $("#tbody-title").after($(begin_str + source_str + title_str + author_str + date_str + info_str + "</tr>"));
                    }
                    if (data.search_info == "") {
                        $("#statistics").hide();
                        $("#tab-content-1").hide();
                        $('#special').hide();
                    } else {
                        $('#normal').hide();
                        $('#special').html("搜索内容: " + data.search_info + "<br>搜索类型: " + data.search_type);
                        for (var i = 0; i < data.news_statistics.length; i++) {
                            var news_date = "<td class='text-left'>" + data.news_statistics[i].date.slice(0, 10) + "</td>";
                            var news_cnt = "<td class='text-left'>" + data.news_statistics[i].cnt.toString() + "</td>";
                            $("#tbody-statistics").after($("<tr>" + news_date + news_cnt + "<td class='text-left'></td><td class='text-left'></td></tr>"))
                        }
                    }
                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    alert(XMLHttpRequest.status);
                    alert(XMLHttpRequest.readyState);
                    alert(textStatus);
                    window.location = "/news.html";
                }
            });
        });
</script>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

        提供新闻展示功能,当没有搜索信息时,展示全部已爬取新闻;当指定搜索信息时,展示搜索后的结果和搜索内容时间热度表格。点击详情跳转到news_info.html网页。

点击详情时的跳转函数:

<script text="text/javascript">
	function news_info(id_news) {
            var url = "/news_info";
            $.ajax({
                type: "GET",
                url: url,
                data: {
                    id_news: id_news
                },
                success: function(data){
                    window.location = "/news_info.html";
                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    alert(XMLHttpRequest.status);
                    alert(XMLHttpRequest.readyState);
                    alert(textStatus);
                    window.location = "/news.html";
                }
            });
        }
     </script>

news_info.html
在这里插入图片描述
        提供新闻详情展示功能,展示某条新闻的所有具体信息,页面加载时渲染HTML的JavaScript函数:

<script text="text/javascript">
        $(document).ready(function() {
            var url = "/show_news_info";
            $.ajax({
                type: "GET",
                url: url,
                data: {
                },
                success: function(data){
                    $("#url").html("<a href='" + data.url + "'>" + data.url + "</a>");
                    $("#source").html(data.source);
                    $("#title").html(data.title);
                    $("#keywords").html(data.keywords);
                    $("#author").html(data.author);
                    $("#date").html(data.date);
                    $("#crawler_time").html(data.crawler_time);
                    $("#summary").html(data.summary);
                    $("#content").html(data.content);
                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    alert(XMLHttpRequest.status);
                    alert(XMLHttpRequest.readyState);
                    alert(textStatus);
                    window.location = "/news_info.html";
                }
            });
        });
    </script>

其他前端小工具功能:
        折叠侧边导航栏
在这里插入图片描述

        个性化定制网页颜色
在这里插入图片描述

2. 建立后端路由

注意:JavaScript是异步执行的语言,因此要避免思维定式把代码顺序当做真实的指令执行顺序。

        后端是由node.js中express库搭建,新建app.js,并引入相关包:

var express = require('express');

        新建一个express实例:

var app = express();

        将静态文件夹设为public,使前端可以访问到:

app.use(express.static(__dirname + '/static'));

        连接数据库:

// 连接数据库
var crawler_sql = require("./crawlers/crawler_sql.js");

        部署HTML文件路由:

app.get('/search.html', function(req, res) {
    res.sendFile(__dirname + "/templates/" + "search.html");
})

app.get('/news.html', function(req, res) {
    res.sendFile(__dirname + "/templates/" + "news.html");
})

app.get('/news_info.html', function(req, res) {
    res.sendFile(__dirname + "/templates/" + "news_info.html");
})

        实现搜索路由逻辑:

var news_list = [];
var search_info_past = "";
var search_type_past = "";

app.get('/search_news', function(req, res) {
    // 查询数据库
    var search_type = req.query.search_type;
    var search_info = req.query.search_info;
    var news_search_sql = "";
    if (search_type == 'title') {
        news_search_sql = "select id_news, url, source, title, author, date from news where title like '%" + search_info + "%'";
    } else if (search_type == 'content') {
        news_search_sql = "select id_news, url, source, title, author, date from news where content like '%" + search_info + "%'";
    }
    crawler_sql.query(news_search_sql, function(err, result, fields) {
        if (result.length > 0) {
            news_list = result;
            search_info_past = search_info;
            search_type_past = search_type;
            res.json({code: 1, msg: "查询成功!"});
        } else {
            search_info_past = "";
            search_type_past = "";
            news_list = [];
            res.json({code: 0, msg: "相关新闻不存在,请更换信息查询!"});
        }
    });
})

        实现新闻展示路由逻辑:

app.get('/show_news', function(req, res) {
    var search_info = search_info_past;
    var search_type = search_type_past;
    if (news_list.length == 0 || search_info_past == "") {
        var news_search_sql = "select id_news, url, source, title, author, date from news";
        search_info_past = "";
        search_type_past = "";
        crawler_sql.query(news_search_sql, function(err, result, fields) {
            news_list = result;
            res.json({search_info: search_info, search_type: search_type, news_list: news_list});
        });
    } else {
        var news_search_sql = "";
        search_info_past = "";
        search_type_past = "";
        if (search_type == 'title') {
            news_search_sql = "select date, count(*) as cnt from news where title like '%" + search_info + "%' group by date order by date";
        } else if (search_type == 'content') {
            news_search_sql = "select date, count(*) as cnt from news where content like '%" + search_info + "%' group by date order by date";
        }
        crawler_sql.query(news_search_sql, function(err, result, fields) {
            res.json({search_info: search_info, search_type: search_type, news_list: news_list, news_statistics: result});
        });
    }
})

        实现新闻详情路由逻辑:

var news_info = [];
app.get('/news_info', function(req, res) {
    var news_search_sql = "select url, source, title, keywords, author, date, crawler_time, summary, content from news where id_news=?";
    var news_search = [req.query.id_news];
    crawler_sql.query(news_search_sql, news_search, function(err, result, fields) {
        news_info = result;
        res.json({code: 1});
    });
})

app.get('/show_news_info', function(req, res) {
    res.json(news_info[0]);
})

        在8080端口监听:

var server = app.listen(8080, function() {
    console.log("访问地址为 http://127.0.0.1:8080/search.html")
})

app.js文件中的全局变量是为了在不同界面隐式传递参数而设置的。

Node.js网络爬虫与搜索引擎实战项目 本文还有配套的精品资源,点击获取 简介:本项目"search-engine"展示了如何使用Node.js实现网络爬虫和搜索引擎。通过学习这个项目,开发者可以理解网络爬虫和搜索引擎的基本原理以及在JavaScript环境下的实现方法。项目包括网络爬虫的自动网页遍历和数据抓取,以及对收集数据进行索引、存储和检索的搜索引擎。项目的结构和配置,如依赖管理、源代码存放、配置文件、日志... 阅读详情

相关推荐

Win10系统VS2019+Cmake+qhull_8.0.0环境配置

1 qhull 1.1 简要介绍 qhull是一个强大的计算几何库,可以用于计算高维的convex hull, Delaunay triangulation, Voronoi diagram等。 1.2 依赖库 qhull不依赖其他库。 1.3 源码包下载 qhull源码地址:github:https://github.com/qhull/qhull.git 2 Cmake构建项目 2.1 路径 源代码路径:D:/ThirdParty/qhull/qhull_8.0.0构建项目路径:D:/Thi.

wangchenxue的博客 2491

Node.js实现网络新闻爬虫及搜索功能(一)

Node.js实现网络新闻爬虫及搜索功能(一)Node.js实现网络新闻爬虫及搜索功能(一)项目要求一、爬虫部分1. 引入相关包2. 建立数据库连接3. 爬取并解析网页首页4. 爬取并解析新闻URL Node.js实现网络新闻爬虫及搜索功能(一) 项目要求 一、爬虫部分         1、完成目标网站的网页分析和爬虫设计。         2、爬取

WORLDLOGIC的博客 1050

从零到一:用AXI DataMover在Zynq MPSoC上实现高效DMA传输(附Vitis HLS驱动示例)

本文详细介绍了如何在Xilinx Zynq UltraScale+ MPSoC平台上使用AXI DataMover实现高效的DMA数据传输。通过解析AXI DataMover架构、Vivado工程配置、Vitis HLS驱动开发及性能优化技巧,帮助开发者快速构建高性能数据传输通道,并提供了可直接复用的代码示例。

weixin_42520796的博客 424

node.js实现简单爬虫(二)

三.爬取新闻首页的新闻信息 首先,我们先来分析一下页面信息。 百度新闻首页大体上分为“热点要闻”、“本地新闻”、“国内新闻”、…等。这次我们只尝试爬取“热点新闻”的新闻数据。 F12打开Chrome的控制台,审查页面元素,查看“热点新闻”信息所在DOM的结构,我们发现所有的“热点新闻”信息(包括新闻标题和新闻页面链接)都在id为#pane-news的div下面ul下li下的a标签中。 2、为了爬取新闻数据,首先我们要用superagent请求目标页面,获取整个新闻首页信息 // 引入所需要的第三

bighead的博客 401

【STM32单片机】RS485通信—基于STM32G474芯片

做项目需要用485通信来控制Go电机参考资料:【【STM32F103C8T6系列】10. 实验例程——485(USART串口)通讯实验】 https://www.bilibili.com/video/BV19w411r7ka/?PDF: STM32G474 开发指南 正点原子 DMG474 开发板教程 第28章485只是物理层,代码逻辑还是UART串口通信,相当于是电路有RS485转换芯片,所以还是用UART串口通信方式。

m0_48808835的博客 3647

4D毫米波雷达

详解4D成像毫米波雷达

sangba2019的博客 2393

node学习(四)——读取页面数据(爬虫简单例子)

简单的node爬虫,这里用到cheerio模块 他能够很方便的操作dom ,我这里读取了百度搜索的内容 test1.js const http = require('http'); const cheerio = require('cheerio'); const express = require('express'); const path = require('path'); cons...

wangshang1320的博客 363

Zemax中场曲与畸变图的深度解析与应用场景对比

本文深度解析了Zemax中场曲/畸变图与网格畸变图的核心原理、计算逻辑与适用场景。通过对比常规成像镜头、扫描镜头、鱼眼镜头及变形宽银幕镜头等实际案例,详细阐述了如何根据系统对称性、视场角及核心需求选择正确的分析工具与畸变评价标准,为光学设计中的畸变诊断与优化提供清晰指导。

sand8的博客 482

Nodejs爬虫以及新闻搜索网站的构建

本项目为使用Nodejs以及Vue实现的对于新网网站的信息爬取以及新闻搜索网站的构建。

Lverdad的博客 622

【51单片机仿真】基于51单片机设计的温湿度采集检测系统__资料编号11

该系统通过与AT89C51单片机、LCD1602显示屏和DHT11温湿度传感器的集成,实时读取环境中的温度和湿度数据并在LCD1602上显示这些信息,其中系统初始化LCD1602显示屏、通过DHT11_receive()函数接收并校验DHT11传感器的温湿度数据、使用LCD_ShowNum()函数逐位显示湿度和温度数据并在这些数据后附加相应的单位符号,以便用户可以直观地看到当前环境的温湿度情况。

嵌入式阿齐Archie 2万+

PHP网络爬虫实践:抓取百度搜索结果,并分析数据结构

百度的搜索引擎有反爬虫机制,我先直接用guzzle试试水。代码如下: <?php /** * Created by Benjiemin * Date: 2020/3/5 * Time: 14:58 */ require ('./vendor/autoload.php'); use QL\QueryList; //进入网页 $jar = new \GuzzleHttp\Cooki...

简庆旺同学 1878

UE5、CesiumForUnreal实现加载GeoJson绘制多面(MultiPolygon)功能(支持点选高亮)

UE5、CesiumForUnreal实现加载GeoJson实现多面(MultiPolygon)的绘制功能,并且支持点选高亮和属性查询。

专注GIS开发 4628

Node.js实现网络新闻爬虫及搜索功能(三)

Node.js实现网络新闻爬虫及搜索功能(三)Node.js实现网络新闻爬虫及搜索功能(三)项目要求二、定时爬虫改写1. 回顾已有代码2. 引入相关包3. 定时爬虫代码 Node.js实现网络新闻爬虫及搜索功能(三) 项目要求 一、爬虫部分         1、完成目标网站的网页分析和爬虫设计。         2、爬取不少于100条数据(每条数据包

WORLDLOGIC的博客 515

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Node.js实现网络新闻爬虫及搜索增加功能(二):可视化及查询优化

Node.js实现网络新闻爬虫及搜索增加功能(二):可视化及查询优化Node.js实现网络新闻爬虫及搜索增加功能(二):可视化及查询优化项目要求二、支持分词查询、查询结果排序和分页及网站数据可视化1. 网站数据可视化2. 支持中文分词查询3. 支持查询结果排序4. 支持查询结果分页 Node.js实现网络新闻爬虫及搜索增加功能(二):可视化及查询优化 系列文章查看不到可能是优快云审核原因,可以在我的知乎专栏看到所有文章:https://www.zhihu.com/column/c_137002616099

WORLDLOGIC的博客 395

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Node.js实现网络新闻爬虫及搜索增加功能(一):用户功能

Node.js实现网络新闻爬虫及搜索增加功能(一):用户功能Node.js实现网络新闻爬虫及搜索增加功能(一):用户功能项目要求一、用户注册、登录、修改密码及用户管理、查看用户操作日志1. 数据库2. 添加前端页面路由3. 登录功能实现4. 注册功能实现5. 修改密码功能实现6. 用户管理功能实现 Node.js实现网络新闻爬虫及搜索增加功能(一):用户功能 系列文章查看不到可能是优快云审核原因,可以在我的知乎专栏看到所有文章:https://www.zhihu.com/column/c_13700261

WORLDLOGIC的博客 381

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

记录用nodejs爬虫爬取汽车之家遇到的一些坑

   因为某些原因需要爬取一些数据,自己就用nodejs来试试爬取数据,当然我在这方面也是一个小白,因为也是刚用nodejs来爬取数据,走了不少弯路,先说说我写爬虫的过程把。   我用的是express框架,先安装cheerio与https以及request,因为爬取数据的地址协议是https,request是用来请求网址的。   首先我主要是爬取经销商的信息,请求网址是https://dea...

a916521009的博客 1223

前端简单爬数据

使用前端的简单方法去爬取网站的信息 只要说到爬虫,大家的第一印象应该是python爬虫吧,确实用python写爬虫是现在的主流,而且市面 上关于python爬虫的教学也挺多的,但是我的标题是用前端的方法去爬数据,当然不会给你讲python 爬虫了@_@. 爬虫的一般过程就是把网站中的html页面下载下来,然后再用选择器去选择你想要的标签,比如说选择一 个img标签,然后再选择他的src属性,就跨域爬取一张图片的地址,前端开发人员一看,是不是觉得相当的 熟悉?这不就是

weixin_45562187的博客 2536

NodeJS 爬取lol英雄数据信息

1、安装node.jsNode.js官网 2、直接上代码 var http = require('http'); var fs = require('fs'); // 文件系统模块 var cheerio = require('cheerio'); // 抓取网页数据模块,需要安装,npm install cheerio var url = 'http://lol...

cocosum 926

用nodejs爬数据

前提 首先你要学会用dom节点爬数据,如果你不明白请看接下来的代码,请赶紧学会。 (一)、我们拿王者荣耀的例子来看 (2)、打开按键盘的F12打开控制台,先查看是否有jquery函数库 这样说明该网站拥有jquery函数库。如果没有的请先动态插入一个script标签然后设置他的属性’src’导入jquery函数库. (3)、找到金蝉对应元素,然后确定目标后,开始如下操作。 以上就是我们通过操作dom来获取网页中的元素。 主体 ok,完成了上部分的操作同时看了我前两部分的博客的同学,现在已经有一定的基础

weixin_51666715的博客 2458

新闻爬虫与网页制作大作业

新闻爬虫与网页制作大作业网页源代码预览MySQL数据库建表使用NodeJS来爬取网页数据使用HTML+CSS+NodeJS,来制作简单的新闻爬虫信息查询网页使用express模块的脚手架,来优化网页前端展示 网页源代码预览 使用chrome浏览器打开新浪体育网的网址,按F12获取网页源代码,可以得到需要爬取的内容所在的位置(同理打开新浪军情网和雪球网) MySQL数据库建表 在爬取网页数据之前,...

sdfggd的博客 989

Node.JS EXCEL 读取操作

表数据如下: 实现代码如下: 注:使用命令安装依赖包 npm install xlsx var fs = require('fs'); var xlsx = require('xlsx'); //读取execel文件 var workbook = xlsx.readFile("data.xls"); //用户表数据 var userTableData = []; //部门表数据 var departmentTableData = []; //循环读取表数据 for (var va.

5227

基于nodejs模拟浏览器post请求爬取json数据

今天想爬取某网站的后台传来的数据,中间遇到了很多阻碍,花了2个小时才请求到数据,所以我在此总结了一些经验。   首先,放上我所爬取的请求地址http://api.chuchujie.com/api/?v=1.0;  下面我们开始爬取数据。 一.写一个基于nodejs的爬虫    1.引入所需模块     这里需要引入http模块(nodejs用来向浏览器发送http请求的模块)和quer

天空永远蔚蓝的博客 1360

nodejs如何读取表格的数据

1、使用 npm i node-xlsx --save 安装插件 2、// 解析得到文档中的所有 sheet const sheets = xlsx.parse(exBuf) 3、代码如下所示: readExcel (req, res) { const data = [] sheets.map(function (sheet) { // 读取每行内容 sheet['data'].splice(0, 1) // 删除第一行的内容,比如:姓名,性别等 for (var rowI

a15240780264的博客 772

node.js(六)之crawler爬虫模块爬取王者荣耀官网所有英雄资源信息

node.js爬虫模块爬取王者荣耀所有英雄信息 一、准备工作 https://pvp.qq.com/web201605/herolist.shtml进入王者荣耀所有英雄页面: 你会看到所有的英雄,打开F12开发者模式 打开network, 下面找XHR,刷新下网页, 下面会出现一个herolist.json的文件. 鼠标左击herolist.json 得到该json文件路径 二、node.js编码环节 大概步骤: 创建一个文件夹 用cmd方式打开该文件夹 安装crawler爬虫模块:npm

马云 4394

如何用 Node.js 和 Elasticsearch 构建搜索引擎

Elasticsearch是一款开源的搜索引擎,由于其高性能和分布式系统架构而备受关注。本文将讨论其关键特性,并手把手教你如何用它创建 Node.js 搜索引擎。 Elasticsearch 概述 Elasticsearch 底层使用Apache Lucene库,Apache Lucene 自身是一款高性能、基于文本的搜索引擎库。 Elasticsearch 并不以...

331
上一篇: Node.js实现网络新闻爬虫及搜索功能(三)
下一篇: Node.js实现网络新闻爬虫及搜索功能(一)
WORLDLOGIC
博客等级 码龄8年 3粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值