Nodejs开发的购书搜索网站(http://youkes.com/).欢迎访问。
Nodejs开发的购书搜索网站(http://youkes.com/).欢迎访问。
优克斯youkes.com(推荐chrome浏览器) 该网站的定位:轻量级购书,在线影视搜索引擎。 目前状态:在线影视索引了 优酷 PPTV 爱奇艺 迅雷 搜狐,更多的正在进行中。 在线书籍购买索引了京东(书的价格有可能些须不一致,京东可能要调整价格),下一步将加入亚马逊的价格。 现在开始测试,欢迎大家充当测试者。 用到的技术有nodejs, solr,mongodb(数据备份). 本站选择nodejs的原因,nodejs虽然选择javascript作为其编程语言,但是其实它是个底层框架,编程操作其实很原始,本站采用的是类似于控制台输出方式,首先根据用户的输入或链接的点击转化为内部调用,然后再用类似jquery的nodejs插件cheerio操作html生成字符串,最后直接将字符串通过http协议输出给用户。这样服务器端也采用了类jquery的技术,保持了简单和快速。 采用了solr,solr是基于lucene的企业级搜索服务器,本人用过后感觉挺不错的,百万级的数量级的搜索速度是飞快,本人亲自测试过。 国外有大型搜索应用,据说数量级在10亿级以上。本站采用solr,感觉良好,尤其是facet功能,可以在数以百万级中的数据中快速筛选信息。 强烈推荐静态的搜索应用采用它,本站使用solr的过程,感觉其简单易用,推荐两本书(都是英文的) Apache.Solr.3.Enterprise.Search.Server和Apache.Solr.3.1.Cookbook. 其中第一本用于学习,第二本用于遇到问题查找,当然也可以到stackoverflow去查找. 界面采用的是 twitter bootstrap 文档默认界面,简单实用. 以下是一些搜索例子 搜索天涯明月刀 http://youkes.com/video?q=%E5%A4%A9%E6%B6%AF%E6%98%8E%E6%9C%88%E5%88%80
搜索演员周星驰 [http://youkes.com/video?q=周星驰&site=优酷][2]
合作演员搜索,如 周星驰 和 吴孟达 [http://youkes.com/videoactors=周星驰%2C吴孟达][3]
几个简单的例子就是如此了,更多的请到http://youkes.com/试试,输入关键词后,乱点一通,就会明白了。
Node.js 开发的购书搜索网站 (http://youkes.com/)
网站介绍
该网站是一个轻量级的购书和在线影视搜索引擎。目前,网站已经集成了优酷、PPTV、爱奇艺、迅雷和搜狐等视频平台的索引,并且正在逐步增加更多平台。对于购书部分,网站集成了京东的数据,后续还会加入亚马逊的价格。
使用技术栈
- Node.js: 作为后端开发的主要技术,Node.js 以其非阻塞 I/O 模型和事件驱动机制提供了高性能的服务端解决方案。
- Solr: 基于 Apache Lucene 的企业级搜索服务器,支持百万级别的高速搜索。
- MongoDB: 作为数据库,负责存储和管理网站的数据。
网站架构
-
前端:
- 使用 Twitter Bootstrap 实现简洁实用的界面设计。
- 提供简单的搜索表单,支持关键词搜索、视频搜索和合作演员搜索等功能。
-
后端:
- 使用 Node.js 处理 HTTP 请求。
- 通过
axios
或request
库发起外部 API 请求,获取视频和书籍信息。 - 使用
cheerio
解析 HTML,提取关键数据。 - 将解析后的数据通过 HTTP 协议返回给客户端。
示例代码
const express = require('express');
const axios = require('axios');
const cheerio = require('cheerio');
const app = express();
// 搜索书籍
app.get('/search/book', async (req, res) => {
const query = req.query.q;
const url = `https://search.jd.com/Search?keyword=${query}`;
try {
const response = await axios.get(url);
const $ = cheerio.load(response.data);
// 解析 HTML,提取书籍信息
const books = [];
$('li.gl-item').each((index, element) => {
const title = $(element).find('.p-name em').text();
const price = $(element).find('.p-price i').text();
books.push({ title, price });
});
res.json(books);
} catch (error) {
res.status(500).send('Error fetching data');
}
});
// 搜索视频
app.get('/search/video', async (req, res) => {
const query = req.query.q;
const site = req.query.site || 'all';
let urls = [
`https://www.youku.com/search_video/q_${query}`,
`https://www.pptv.com/search_video/q_${query}`,
`https://so.iqiyi.com/so/q_${query}`,
`https://www.xunlei.com/search_video/q_${query}`,
`https://tv.sohu.com/search_video/q_${query}`
];
if (site !== 'all') {
urls = [urls.find(url => url.includes(site))];
}
try {
const responses = await Promise.all(urls.map(url => axios.get(url)));
const videos = [];
responses.forEach(response => {
const $ = cheerio.load(response.data);
$('div.result').each((index, element) => {
const title = $(element).find('h3').text();
const link = $(element).find('a').attr('href');
videos.push({ title, link });
});
});
res.json(videos);
} catch (error) {
res.status(500).send('Error fetching data');
}
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
总结
通过上述代码,你可以看到 Node.js 如何处理 HTTP 请求并使用第三方库来解析 HTML 数据。Solr 作为搜索引擎,可以提供高效的数据检索能力。Twitter Bootstrap 则确保了简洁实用的前端界面。希望这些示例能帮助你更好地理解和开发类似的项目。
嘻嘻, 有没有的看代码?
solr是个好东西。楼主是拿vps玩的?
恩,solr强大啊。
现阶段代码暴乱,呵呵
域名不错,产品体验做得太差了。
用户体验确实有点差。。。
感觉体验爆弱…很多功能很粗糙,如果这么粗糙的做项目估计2天就可以做你这个东西了 如果细致的做 20天以上 都不好说。
solr 太吃内存了。
要什么样的体验?请指点。
产品体验指的是哪方面?
很多功能很粗糙,请指明感觉粗糙的功能和需要的功能,现阶段正急需反馈,在反馈中中前进…万分感谢…
用户体验确实有点差,请指出是那方面,界面方面是有些…,不过搜索功能还需要哪些改进,请提出,万分感谢
有些,相当其强大功能来说还算划算…
很不错,用户体验神马的固然重要,但是搜索这类实用的工具的话有个简单的搜索框就够啦 我还是比较关注技术实现 :)
很好很强大啊~静态全文检索,速度很快
谢谢关注,恩,界面真的很恼火,什么样的界面看久了都烦。
solr真的好用,尤其是其杀手锏 facet。我网站的按演员合作就是用facet实现的。
请问一个问题,你这个应用solr 在appfog 上是如何配置的?就是如何配置solr 对应的索引文件路径?
appfog 什么东西。我用的是阿里云服务器。
我想知道您是如何抓取数据的 不知道可否透漏
我自己用nodejs编写的抓取程序,按照各个类别进行抓取,不是整站抓取,所以要对每个网站链接做特殊分析和逆向,不具有通用性。不是通用的,抓取的都是在各网站排行靠前的各种商品。京东抓取很简单,它的网页索引都静态化了。另外分词是基于ik,但是在建立索引时加入了特定的商品相关词分析.现在排序没有完善,在慢慢改进中。
对于一个基于Node.js的购书搜索网站,可以参考以下步骤来构建基本功能。以下示例代码展示了如何使用Express框架创建一个简单的路由,处理用户的搜索请求,并返回相关的搜索结果。
示例代码
- 安装必要的依赖
npm init -y
npm install express request cheerio mongodb
- 创建项目结构
/nodebooksearch
/index.js
/package.json
- 编写
index.js
文件
const express = require('express');
const request = require('request');
const cheerio = require('cheerio');
const MongoClient = require('mongodb').MongoClient;
const app = express();
const port = 3000;
// MongoDB 连接字符串
const url = 'mongodb://localhost:27017/booksearch';
// 初始化数据库连接
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
if (err) {
console.log('Error connecting to MongoDB', err);
} else {
console.log('Connected to MongoDB');
db = client.db('booksearch');
}
});
// 设置路由处理搜索请求
app.get('/search', (req, res) => {
const query = req.query.q;
// 使用 request 和 cheerio 抓取京东的图书数据
request(`https://search.jd.com/Search?keyword=${encodeURIComponent(query)}`, (error, response, html) => {
if (!error && response.statusCode == 200) {
const $ = cheerio.load(html);
let books = [];
// 解析 HTML,提取图书信息
$('.gl-warp .gl-item').each((i, elem) => {
const title = $(elem).find('.p-name em').text().trim();
const price = $(elem).find('.p-price i').text().trim();
const link = $(elem).find('.p-name a').attr('href');
books.push({ title, price, link });
});
// 将搜索结果保存到 MongoDB
db.collection('books').insertMany(books, (err, result) => {
if (err) {
console.error(err);
res.status(500).send('Database error');
} else {
res.json(result.ops);
}
});
} else {
res.status(500).send('Request error');
}
});
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
解释
- Express:用作Web服务器框架,处理HTTP请求。
- request:用于发送HTTP请求并获取网页内容。
- cheerio:用于解析HTML文档并提取所需的信息。
- MongoDB:用作数据库存储搜索结果。
上述代码创建了一个简单的Node.js服务器,当用户访问/search?q=<查询>
时,会抓取京东上的图书信息并将其存储到MongoDB中。这只是一个基本的示例,实际应用中可能需要处理更复杂的逻辑,如错误处理、性能优化等。