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/试试,输入关键词后,乱点一通,就会明白了。


24 回复

Node.js 开发的购书搜索网站 (http://youkes.com/)

网站介绍

该网站是一个轻量级的购书和在线影视搜索引擎。目前,网站已经集成了优酷、PPTV、爱奇艺、迅雷和搜狐等视频平台的索引,并且正在逐步增加更多平台。对于购书部分,网站集成了京东的数据,后续还会加入亚马逊的价格。

使用技术栈

  • Node.js: 作为后端开发的主要技术,Node.js 以其非阻塞 I/O 模型和事件驱动机制提供了高性能的服务端解决方案。
  • Solr: 基于 Apache Lucene 的企业级搜索服务器,支持百万级别的高速搜索。
  • MongoDB: 作为数据库,负责存储和管理网站的数据。

网站架构

  1. 前端:

    • 使用 Twitter Bootstrap 实现简洁实用的界面设计。
    • 提供简单的搜索表单,支持关键词搜索、视频搜索和合作演员搜索等功能。
  2. 后端:

    • 使用 Node.js 处理 HTTP 请求。
    • 通过 axiosrequest 库发起外部 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框架创建一个简单的路由,处理用户的搜索请求,并返回相关的搜索结果。

示例代码

  1. 安装必要的依赖
npm init -y
npm install express request cheerio mongodb
  1. 创建项目结构
/nodebooksearch
  /index.js
  /package.json
  1. 编写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中。这只是一个基本的示例,实际应用中可能需要处理更复杂的逻辑,如错误处理、性能优化等。

回到顶部