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

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

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

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

项目要求

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

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

本文是该项目第一部分:爬取网易新闻

一、爬虫部分

        我选择了两个典型的综合新闻门户网站进行新闻爬取,分别是网易新闻(https://news.163.com/)和新浪新闻(https://news.sina.com.cn/)。本文是对网易新闻爬虫的说明。

1. 引入相关包

        写新闻爬虫的第一步,需要先引入爬虫需要的相关包。我们爬取新闻网站所需要的相关工具包有四个,分别是request、iconv-lite、cheerio和date-utils包,而存储新闻信息需要mysql包,这五个工具包主要功能如下表所示:

工具包作用
request向被爬取的URL发送请求
iconv-lite字符编码转换
cheerio解析并提取HTML中指定内容
mysql连接数据库并执行SQL语句
date-utils日期时间的格式化

        其中前四个包是需要声明之后作为变量调用的,而date-utils是通过Date()对象调用的。
        新建crawler_163.js文件。其中,引入相关包的代码为:

var crawler_request = require('request');
var crawler_iconv = require('iconv-lite');
var crawler_cheerio = require('cheerio');
require('date-utils');

var crawler_sql = require("mysql");

2. 建立数据库连接

        Node.js程序建立数据库连接之前,需要本地配置并创建好数据库。
        因为之前的项目安装过mysql,这里就不再赘述mysql本地安装过程,为了配合程序的一致性,修改本地root密码为root,命令为:

alter user 'root'@'localhost' identified by 'root';

        数据库只需要存储新闻信息一张表,计划爬取的新闻信息分别为新闻关键词、新闻标题、新闻日期、新闻作者、新闻来源、新闻摘要、新闻内容共七个字段。创建news表使用如下SQL指令创建:

CREATE TABLE `news` (
  `id_news` int(11)  NOT NULL AUTO_INCREMENT,
  `url` varchar(200) DEFAULT NULL,
  `source` varchar(200) DEFAULT NULL,
  `url_encoding` varchar(45) DEFAULT NULL,
  `title` varchar(200) DEFAULT NULL,
  `keywords` varchar(200) DEFAULT NULL,
  `author` varchar(200) DEFAULT NULL,
  `date` date DEFAULT NULL,
  `crawler_time` datetime DEFAULT NULL,
  `content` longtext,
  `summary` longtext,
  PRIMARY KEY (`id_news`),
  UNIQUE KEY `id_news_UNIQUE` (`id_news`),
  UNIQUE KEY `url_UNIQUE` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

        使用创建数据库连接池的方式实现数据库连接和SQL指令执行:

 var pool = crawler_sql.createPool({
     host: '127.0.0.1',
     user: 'root',
     password: 'root',
     database: 'crawl'
 });
 var query = function(sql, sqlparam, callback) {
     pool.getConnection(function(err, conn) {
         if (err) {
             callback(err, null, null);
         } else {
             conn.query(sql, sqlparam, function(qerr, vals, fields) {
                 conn.release(); //释放连接 
                 callback(qerr, vals, fields); //事件驱动回调 
             });
         }
     });
 };
 var query_noparam = function(sql, callback) {
     pool.getConnection(function(err, conn) {
         if (err) {
             callback(err, null, null);
         } else {
             conn.query(sql, function(qerr, vals, fields) {
                 conn.release(); //释放连接 
                 callback(qerr, vals, fields); //事件驱动回调 
             });
         }
     });
};
exports.query = query;
exports.query_noparam = query_noparam;

3. 爬取并解析网页首页

        想要爬取页面上的所有新闻,首先需要获取新闻网页首页的所有相应超链接,即新闻URL。而想要获取这些新闻URL,就需要先请求并解析新闻网页首页。
        定义request请求操作函数,该函数不仅在请求获取网页首页HTML代码时需要调用,还会在请求获取新闻URL HTML代码时调用。

function request(url, callback) {
    var options = {
        url: url,
        encoding: null,
        headers: {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36'
        },
        timeout: 10000
    }
    crawler_request(options, callback);
};

        定义网页首页URL以及爬虫主函数

var crawler_url = 'https://news.163.com/';
function crawler() {
    request(crawler_url, function(err, res, body) {
        // 网页解析
        try {
            // 编码转换
            var url_encoding = 'UTF-8';
            var url_html = crawler_iconv.decode(body, url_encoding);
            //解析网页
            var $ = crawler_cheerio.load(url_html, { decodeEntities: true });
        } catch (e) {
            console.log('页面解码错误:' + e);
        }
        // 判断网页是否存在超链接
        var url_hrefs;
        try {
            url_hrefs = eval("$('a')");
        } catch (e) {
            console.log('页面不存在超链接' + e);
        }
        // 遍历网页中所有超链接
        url_hrefs.each(function(i, e) {
            // 获取新闻
            var news_url = "";
            try {
                var url_href = "";
                url_href = $(e).attr("href");
                if (typeof(url_href) == "undefined") {
                    return true;
                }
                if (url_href.toLowerCase().indexOf('http://') >= 0 || url_href.toLowerCase().indexOf('https://') >= 0) {
                    news_url = url_href;
                } else if (url_href.startsWith('//')) {
                    news_url = 'https:' + url_href;
                } else {
                    news_url = crawler_url.substr(0, crawler_url.lastIndexOf('/') + 1) + url_href;
                }
            } catch (e) {
                console.log('获取新闻页面出错' + e);
            }
            // 检验新闻网页url是否符合url命名格式
            var news_reg = /\/news\/article\/([a-zA-Z0-9]{16}).html/;
            var news_reg_special = /\/news\/article\/([a-zA-Z0-9]{8})0001982T.html/
            // 如:https://www.163.com/news/article/G8HQOAKE0001899O.html
            if (!news_reg.test(news_url) || news_reg_special.test(news_url)) {
                console.log('新闻链接不符合格式!');
                return;
            }
            // 爬取新闻页面
            var news_search_sql = 'select url from news where url=?';
            var news_search = [news_url];
            crawler_sql.query(news_search_sql, news_search, function(qerr, vals, fields) {
                if (vals.length > 0) {
                    console.log('该新闻页面已被爬取!')
                } else {
                    crawler_news_url(news_url);
                }
            });
        });
    });
}

下面对crawler()函数进行说明:
        首先,需要使用工具包iconv-lite对request得到的网页首页HTML代码进行解码解析,通过观察网页HTML源码可以看到该网页编码方式为UTF-8。
在这里插入图片描述
        编码转换完成之后,使用cheerio工具包对首页进行解析。

		// 网页解析
        try {
            // 编码转换
            var url_encoding = 'UTF-8';
            var url_html = crawler_iconv.decode(body, url_encoding);
            //解析网页
            var $ = crawler_cheerio.load(url_html, { decodeEntities: true });
        } catch (e) {
            console.log('页面解码错误:' + e);
        }

注意:为了避免出现特殊异常而导致的爬虫程序终止,我们尽量在可能出现异常的地方使用try方法

        其次,使用cheerio工具包的jquery索引方式判断首页是否存在超链接,并获取所有超链接。

		// 判断网页是否存在超链接
        var url_hrefs;
        try {
            url_hrefs = eval("$('a')");
        } catch (e) {
            console.log('页面不存在超链接' + e);
        }

        之后,对获取得到的所有超链接进行遍历,获取超链接中的href值,即新闻URL。因为有些超链接中href是简写的,没有https://头或者没有网站主路由(href中以//开头的链接),需要对href值进行一定的字符串处理,从而得到正确的URL格式。

			// 获取新闻
            var news_url = "";
            try {
                var url_href = "";
                url_href = $(e).attr("href");
                if (typeof(url_href) == "undefined") {
                    return true;
                }
                if (url_href.toLowerCase().indexOf('http://') >= 0 || url_href.toLowerCase().indexOf('https://') >= 0) {
                    news_url = url_href;
                } else if (url_href.startsWith('//')) {
                    news_url = 'https:' + url_href;
                } else {
                    news_url = crawler_url.substr(0, crawler_url.lastIndexOf('/') + 1) + url_href;
                }
            } catch (e) {
                console.log('获取新闻页面出错' + e);
            }

        通过对网易新闻网页的观察发现,网易新闻网页URL格式是以主路由https://www.163.com/开头,后面接上news/article/{16位字母数字ID}.html的格式组成(如:https://www.163.com/news/article/G8HQOAKE0001899O.html)。因此定义正则表达式/\/news\/article\/([a-zA-Z0-9]{16}).html/对新闻URL进行测试。另外,在爬取的过程中发现,网易新闻中谈心社发布的新闻文章网页结构和其他普通新闻不一致(如:https://www.163.com/news/article/G8JU6UBB0001982T.html),并且16位字母数字ID后八位是特定的0001982T,因此定义第二个正则表达式/\/news\/article\/([a-zA-Z0-9]{8})0001982T.html/对谈心社的新闻文章进行筛选。
        即:只有满足第一个正则表达式且不满足第二个正则表达式的新闻URL才是我们需要的的新闻URL。

			// 检验新闻网页url是否符合url命名格式
            var news_reg = /\/news\/article\/([a-zA-Z0-9]{16}).html/;
            var news_reg_special = /\/news\/article\/([a-zA-Z0-9]{8})0001982T.html/;
            // 如:https://www.163.com/news/article/G8HQOAKE0001899O.html
            if (!news_reg.test(news_url) || news_reg_special.test(news_url)) {
                console.log('新闻链接不符合格式!');
                return;
            }

        最后,在数据库中检索新闻URL,若在数据库中存在该新闻URL,则说明该新闻之前已经被爬取过了,不需要再进行爬取。反正则要执行crawler_news_url()函数,对该新闻URL进行爬取。

			// 爬取新闻页面
            var news_search_sql = 'select url from news where url=?';
            var news_search = [news_url];
            crawler_sql.query(news_search_sql, news_search, function(qerr, vals, fields) {
                if (vals.length > 0) {
                    console.log('该新闻页面已被爬取!')
                } else {
                    crawler_news_url(news_url);
                }
            });

4. 爬取并解析新闻URL

        和爬取新闻网页首页一样,首先要对新闻URL网页HTML代码进行解码解析。

		// 网页解析
        try {
            // 编码转换
            var url_encoding = 'UTF-8';
            var url_html = crawler_iconv.decode(body, url_encoding);
            //解析网页
            var $ = crawler_cheerio.load(url_html, { decodeEntities: true });
        } catch (e) {
            console.log('页面解码错误:' + e);
        }

        之后,定义需要爬取的新闻信息json,并使用date-utils工具包初始化日期相关变量。

		// 定义新闻信息json
        var news = {};
        news.crawler_time = (new Date()).toFormat("YYYY-MM-DD HH:MM:SS.SSSS");
        news.url = news_url;
        news.url_encoding = 'UTF-8';
        news.keywords = '';
        news.title = '';
        news.date = new Date();
        news.author = '';
        news.source = '';
        news.summary = '';
        news.content = '';

        下面就是对具体的信息进行获取了,这一步是爬虫过程的关键,需要在新闻URL网页HTML代码中寻找到所需要信息的位置,并使用cheerio工具包的jquery索引工具定位并获取该信息。
        获取新闻关键词:观察新闻URL网页HTML代码,发现name为keywords的meta元素content值存储新闻关键词信息。
在这里插入图片描述
相关代码为:

		// 获取新闻关键词
        try {
            news.keywords = eval("$('meta[name=\"keywords\"]').eq(0).attr(\"content\")");
        } catch (e) {
            console.log('新闻关键词获取错误:' + e);
        }

        获取新闻标题:观察新闻URL网页HTML代码,发现title标签存储新闻标题信息。
在这里插入图片描述
相关代码为:

		// 获取新闻标题
        try {
            news.title = eval("$('title').text()").replace(/[\r\n\s]/g, "");
        } catch (e) {
            console.log('新闻标题获取错误:' + e);
        }

        获取新闻发布时间:观察新闻URL网页HTML代码,发现html标签存储新闻发布时间信息,可以使用id索引。
在这里插入图片描述
相关代码为:

		// 获取新闻时间
        try {
            news.date = eval("$('#ne_wrap').eq(0).attr(\"data-publishtime\")");
        } catch (e) {
            console.log('新闻日期获取错误:' + e);
        }

        获取新闻作者:观察新闻URL网页HTML代码,发现class为icon的img标签alt值存储新闻作者信息,可以使用class索引。
在这里插入图片描述

        但是有一部分新闻URL网页代码中alt值为默认的netease,因此当获取到的新闻作者是netease时执行第二种获取方式,索引class为post_author的div的text值,并进行正则筛选和字符串替换操作获取正确的新闻作者信息。
在这里插入图片描述
相关代码为:

		// 获取新闻作者
        try {
            news.author = eval("$('.icon').eq(0).attr(\"alt\")");
            if (news.author == 'netease') {
                news.author = eval("$('.post_author').text()").replace(/[\r\n\s]/g, "").replace("本文来源:", "");
                var author_reg = /责任编辑:.+_/;
                news.author  = author_reg.exec(news.author).toString().replace("责任编辑:", "").replace("_", "");
            }
        } catch (e) {
            console.log('新闻作者获取错误:' + e);
        }

        获取新闻来源:观察新闻URL网页HTML代码,发现class为post_info的div标签的第一个子节点中存储新闻来源信息,可以使用class索引。
在这里插入图片描述
        但在爬取的过程中发现,第一个子节点的值有时获取为‘举报’,不是真正的新闻来源,此时需要换一种索引方式,并对获取的字符串进行正则筛选和字符串替换操作,从而得到正确的新闻来源信息。
相关代码为:

		// 获取新闻来源
        try {
            news.source = eval("$('.post_info').children(':first').text()").replace(/[\r\n\s]/g, "");
            if (news.source == '举报') {
                news.source = eval("$('.post_info').prop('firstChild').nodeValue").replace(/[\r\n\s]/g, "");
                var source_reg = /.+来源:/;
                var tmp = source_reg.exec(news.source).toString();
                news.source = news.source.replace(tmp, "");
            }
        } catch (e) {
            console.log('新闻来源获取错误:' + e);
        }

        获取新闻摘要:观察新闻URL网页HTML代码,发现name为description的meta元素的content值存储新闻摘要信息。
在这里插入图片描述
相关代码为:

		// 获取新闻摘要
        try {
            news.summary = eval("$('meta[name=\"description\"]').eq(0).attr(\"content\")").replace(/[\r\n\s]/g, "");
        } catch (e) {
            console.log('新闻摘要获取错误:' + e);
        }

        获取新闻内容:使用chrome开发者工具定位工具,发现class为post_body的div标签内的text为新闻正文信息。
在这里插入图片描述
相关代码为:

		// 获取新闻内容
        try {
            news.content = eval("$('.post_body').text()").replace(/[\r\n\s]/g, "");
        } catch (e) {
            console.log('新闻内容获取错误:' + e);
        }

        爬取完毕需要爬取的新闻信息json之后,将相关新闻信息存入数据库中,对于新闻正文为空的新闻不予存储:

		// 写入数据库
        if (news.content != '') {
            var news_add_sql = 'INSERT INTO news(url, source, url_encoding, title, keywords, author, date, crawler_time, summary, content) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
            var news_add = [news.url, news.source, news.url_encoding,
                news.title, news.keywords, news.author, news.date,
                news.crawler_time, news.summary, news.content
            ];
            crawler_sql.query(news_add_sql, news_add, function(qerr, vals, fields) {
                if (qerr) {
                    console.log(qerr);
                }
            });
        }

crawler_news_url()函数整体代码为:

// 爬取新闻链接
function crawler_news_url(news_url) {
    request(news_url, function(err, res, body) {
        // 网页解析
        try {
            // 编码转换
            var url_encoding = 'UTF-8';
            var url_html = crawler_iconv.decode(body, url_encoding);
            //解析网页
            var $ = crawler_cheerio.load(url_html, { decodeEntities: true });
        } catch (e) {
            console.log('页面解码错误:' + e);
        }
        // 定义新闻信息json
        var news = {};
        news.crawler_time = (new Date()).toFormat("YYYY-MM-DD HH:MM:SS.SSSS");
        news.url = news_url;
        news.url_encoding = 'UTF-8';
        news.keywords = '';
        news.title = '';
        news.date = new Date();
        news.author = '';
        news.source = '';
        news.summary = '';
        news.content = '';
        // 获取新闻关键词
        try {
            news.keywords = eval("$('meta[name=\"keywords\"]').eq(0).attr(\"content\")");
        } catch (e) {
            console.log('新闻关键词获取错误:' + e);
        }
        // 获取新闻标题
        try {
            news.title = eval("$('title').text()").replace(/[\r\n\s]/g, "");
        } catch (e) {
            console.log('新闻标题获取错误:' + e);
        }
        // 获取新闻时间
        try {
            news.date = eval("$('#ne_wrap').eq(0).attr(\"data-publishtime\")");
        } catch (e) {
            console.log('新闻日期获取错误:' + e);
        }
        // 获取新闻作者
        try {
            news.author = eval("$('.icon').eq(0).attr(\"alt\")");
            if (news.author == 'netease') {
                news.author = eval("$('.post_author').text()").replace(/[\r\n\s]/g, "").replace("本文来源:", "");
                var author_reg = /责任编辑:.+_/;
                news.author  = author_reg.exec(news.author).toString().replace("责任编辑:", "").replace("_", "");
            }
        } catch (e) {
            console.log('新闻作者获取错误:' + e);
        }
        // 获取新闻来源
        try {
            news.source = eval("$('.post_info').children(':first').text()").replace(/[\r\n\s]/g, "");
            if (news.source == '举报') {
                news.source = eval("$('.post_info').prop('firstChild').nodeValue").replace(/[\r\n\s]/g, "");
                var source_reg = /.+来源:/;
                var tmp = source_reg.exec(news.source).toString();
                news.source = news.source.replace(tmp, "");
            }
        } catch (e) {
            console.log('新闻来源获取错误:' + e);
        }
        // 获取新闻摘要
        try {
            news.summary = eval("$('meta[name=\"description\"]').eq(0).attr(\"content\")").replace(/[\r\n\s]/g, "");
        } catch (e) {
            console.log('新闻摘要获取错误:' + e);
        }
        // 获取新闻内容
        try {
            news.content = eval("$('.post_body').text()").replace(/[\r\n\s]/g, "");
        } catch (e) {
            console.log('新闻内容获取错误:' + e);
        }
        console.log(JSON.stringify(news));

        // 写入数据库
        if (news.content != '') {
            var news_add_sql = 'INSERT INTO news(url, source, url_encoding, title, keywords, author, date, crawler_time, summary, content) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
            var news_add = [news.url, news.source, news.url_encoding,
                news.title, news.keywords, news.author, news.date,
                news.crawler_time, news.summary, news.content
            ];
            crawler_sql.query(news_add_sql, news_add, function(qerr, vals, fields) {
                if (qerr) {
                    console.log(qerr);
                }
            });
        }
    });
}

最后,调用爬虫主函数:

crawler();

网易新闻的爬取就开始了。建议使用Navicat数据库可视化工具对爬取得到的新闻信息进行查看。

Node.js实现在目录中查找某个字符串及所在文件 主要介绍了Node.js实现在目录中查找某个字符串及所在文件,文中代码简洁,而且速度相当的快,需要的朋友可以参考下 立即下载

相关推荐

OpenPose 论文理解

OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation paper: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields link: OpenPose paper...

JustForYou的博客 2万+

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

Node.js实现网络新闻爬虫及搜索功能(四)Node.js实现网络新闻爬虫及搜索功能(四)项目要求二、搜索网站部分1. 建立前端网页2. 建立后端路由 Node.js实现网络新闻爬虫及搜索功能(四) 项目要求 一、爬虫部分         1、完成目标网站的网页分析和爬虫设计。         2、爬取不少于100条数据(每条数据包括7个字段,新闻

WORLDLOGIC的博客 646

Mac版UltraEdit 18.00.0.19破解教程:终端一行命令搞定(附版本适配指南)

本文为Mac用户提供了UltraEdit的合法替代方案与授权指南,强调破解软件的法律风险和安全隐忧。推荐使用VS Code、Sublime Text等开源或商业编辑器,结合终端工具如Vim/Neovim,实现高效文本编辑。同时详细介绍了UltraEdit的官方授权选项,帮助开发者在遵守软件许可的前提下提升工作效率。

k9l0m1的博客 357

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

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

Lverdad的博客 622

算法笔记 经典取石子游戏总结 博弈论

经典取石子游戏总结 1.巴什博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个,最多取m个,先取完者获胜(即没有石子取的人失败)。A与B都足够聪明,问A能否获胜。 结论:当n%(m+1)!=0时A必胜,否则必败。 2.斐波那契博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个。第一次不能取完。从第二次开始,每个人取的石子数至少为1,至多为前一个人取的石子数的2倍。先取完者获胜。...

CraigMC的博客 2936

芯片详解——AD7606

AD7606详解

weixin_45661757的博客 5021

Node.js 的 http 模块

http模块主要用于创建http server服务,此次实验还会讲到url模块和path模块,同时也会用到前面讲过的fs模块。url模块用于解析url,path模块用于处理和转换文件路径。 通过前面的实验,相信大家对Node.js模块的使用已经比较熟悉。在这个实验中,我们就通过编写一个简单的http server来学习http模块。 一、创建http server 通过Node.

技术分享 887

Ubuntu 22.04 搭建 PX4 飞控系统完全指南:从仿真到硬件试飞

定义消息文件protobufuint64 timestamp # 时间戳float32 temperature # 温度float32 humidity # 湿度生成代码:bashPX4 在 Ubuntu 22.04 的搭建涉及环境配置、编译仿真、硬件连接等多环节,核心是理解 PX4 1.14 的新特性(uXRCE-DDS、动态控制分配)。通过本文指南,开发者可快速构建稳定的 PX4 开发环境,为无人机应用开发奠定基础。

zqmgx13291的博客 3039

【Node.js】项目之搜索

搜索效果 1. 模糊查询 SELECT * FROM 表名 WHERE 字段名 LIKE '%值%' SELECT * FROM 表名 WHERE 字段名 LIKE '值%' -- 值开头 SELECT * FROM 表名 WHERE 字段名 LIKE '%值' -- 值结束 SELECT * FROM goods_list WHERE goods_name LIKE '%手机%' 2.搜索内容,出现响应商品,并且可以排序和分页(1随机排序 2新品 3价格排序),每搜索一次search表对应count

qq_37086980的博客 1060

华为IC岗笔试刷题含答案(2)

又做了几套题,记录了部分及答案,如有错误,欢迎评论指正。

Ingrid的博客 1万+

从收音机到Arduino:手把手教你用BJT三极管搭建一个简易音频放大器(附电路图与元件清单)

本文详细介绍了如何使用BJT三极管搭建简易音频放大器,涵盖电路原理、元件选择、设计步骤及调试技巧。通过实践项目帮助电子爱好者深入理解BJT的放大特性,并提供与Arduino结合的扩展应用方案,适合创客和DIY玩家。

aitie1479的博客 441

使用nodejs搜索elasticsearch(DSL)

使用nodejs搜索elasticsearch 一、npm 安装elasticsearch模块 二、启动elasticsearch 三、elasticsearch查询语句(query DSL) 四、查询、删除内容、删除索引demo 查询 删除索引中日志的内容 删除索引 一、npm 安装elasticsearch模块 npm install elasticsearch 1 二、启动elasticsearch 启动的的elasticsearch服务,而非步骤一中安装的npm模块。对elasticsearch的介

大灰狼的小绵羊哥哥的博客 1209

华为OD机试双机位C卷-水库溃坝填补(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【水库溃坝填补】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。水库溃坝填补。

qq_45776114的博客 2109

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

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

WORLDLOGIC的博客 381

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

WORLDLOGIC的博客 515

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

WORLDLOGIC的博客 395

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

node.js分词搜索

最近有个需求是要实现类似搜索引擎的功能,用户输入关键字,后台实时推送相关数据。

weixin_42966151的博客 1171

nodejs扫描文件夹搜索包含关键词文件,可灵活配置

搜索日志:search.log 注:只保留一次的,需要多次自行修改logFile配置即可;检测完毕后会在相同位置生成searchLog.txt保存结果;将代码放到需要检测的目录同级,在命令行运行即可;搜索结果:searchResult.txt。关键代码:search.js。

凌晨不睡觉 1734

实战:Nodejs+Mongodb+Elasticsearch 实现简单的搜索

在网站建立初期,我们提供的搜索服务很多都是基于数据库的模糊搜索,在性能和可用性上多少会有所缺失,所以在网站发展壮大后,就不得不增强搜索功能。elasticsearch 的基本功能就已经足够一般的搜索需求。本文将介绍,如何使用 nodejs + mongodb + es 实现一个简单而强大的全文搜索功能,以提高网站搜索体验。 基本架构图 数据存储在 mon

Enweitech Software Works 4637

node+vue实现搜索效果

node+vue实现搜索效果

qq_60976312的博客 578

使用nodejs编写一个深度优先搜索遍历图例子

深度优先搜索有两种方式实现,一种是利用栈先入后出,另一种是递归的方式,不过递归的本质就是在压栈弹出的过程。本案例将使用递归的方式。

weixin_42815827的博客 312

Nodejs实现模糊查询

本人在制作一些业余爱好的网站途中,也在对于nodejs进行一些学习,在制作搜索功能的时候对模糊查询做出一定了解,由于博主是使用express+mongoose框架来制作的项目,对网上的讲解看的不是很懂,不过自己根据网上其他博客的部分说明,又小小看了一下官方文档,尝试了几下得出了结论。首先我们知道mongodb数据库中是以/关键字/来进行模糊查询,然而在博主研究的途中知道nodejs中是使用正则表达式

小疯癫丶先森的软件编程之路 9251

vue+element+node实现搜索功能

image.png 第一步 加上搜索框 image.png <template slot="header"> <el-input class="search" v-model="search" prefix-icon="el-icon-search" clearable placeholder="输入文章标题搜索" /...

想快快长大的博客 1112

NodeJs+mongoose实现搜索功能

模型层(search.model.js) var mongoose = require('mongoose'); var Schema = mongoose.Schema; var UpshortSchema = new Schema({ "ulid":{type:String}, "pname":{type:String}, "pintro":{type:Strin...

weixin_40679158的博客 3123

Node.js 博客实例(十一)文章检索功能

原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第一章,由于版本等的原因,在原教程基础上稍加改动即可实现。        现在我们来给博客增加文章检索功能,即根据关键字模糊查询文章标题,且字母不区分大小写。 首先,我们修改 header.ejs ,在 前添加一行代码: 在 style.css 中添加一行样式: .search{bord

SS 2581
上一篇: 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、付费专栏及课程。

余额充值