Nodejs + Rails3 + MongoDB 开发了个商品价格记录的网站
Nodejs + Rails3 + MongoDB 开发了个商品价格记录的网站
最近闲着无聊的时候,自己实战了一下 rails3 + mongodb + node.js 开发了个商品价格记录的网站, 在使用当中,我发现用node.js做数据抓取相当的爽,不用自己去考虑什么异步io,多线程的问题,用着舒服,还有就mongodb,对于字段不确定的应用还是非常合适, 至于去高效的查询,我倒是没有什么感觉, 不如mysql + redis来的爽啊
最后,有兴趣的同学可以一起交流一下
github 地址: git://github.com/myliang/top3c.git
Nodejs + Rails3 + MongoDB 开发了个商品价格记录的网站
最近闲着无聊的时候,自己动手开发了一个基于 Rails 3
、MongoDB
和 Node.js
的商品价格记录网站。在这个项目中,我体验到了使用 Node.js
进行数据抓取的强大之处,它简化了异步IO处理和多线程问题,使得开发过程变得十分流畅。
技术栈
- Rails 3: 作为后端框架,负责处理业务逻辑和提供API接口。
- MongoDB: 用于存储商品信息及其价格记录,因为它对字段不确定的应用场景非常适合。
- Node.js: 用于数据抓取和定时任务,比如每天定时更新商品价格。
示例代码
使用 Node.js 进行数据抓取
// 安装必要的包
const axios = require('axios');
const cheerio = require('cheerio');
// 定义一个函数来抓取商品价格
async function fetchProductPrice(url) {
try {
const response = await axios.get(url);
const $ = cheerio.load(response.data);
// 假设商品价格位于 <span class="price"> 中
const priceElement = $('.price').text();
return parseFloat(priceElement.replace(/[^0-9\.]+/g, '')); // 清理价格字符串
} catch (error) {
console.error(`Error fetching price from ${url}:`, error);
return null;
}
}
// 调用函数并打印结果
fetchProductPrice('https://example.com/product')
.then(price => console.log(`Product Price: ${price}`))
.catch(error => console.error(error));
使用 Node.js 定时任务
// 安装必要的包
const cron = require('node-cron');
// 定义一个定时任务,每天凌晨1点执行一次数据抓取
cron.schedule('0 1 * * *', async () => {
const productUrls = ['https://example.com/product1', 'https://example.com/product2'];
for (const url of productUrls) {
const price = await fetchProductPrice(url);
if (price !== null) {
// 将抓取到的价格保存到数据库(这里假设有一个 savePrice 函数)
savePrice({ url, price });
}
}
});
function savePrice(productData) {
// 这里调用Rails API或直接操作MongoDB
console.log(`Saving price for ${productData.url}: ${productData.price}`);
}
总结
虽然 MongoDB
对于不确定字段的应用场景非常适合,但在高效查询方面,它可能不如 MySQL + Redis
那样得心应手。不过,对于我的需求来说,MongoDB 已经足够使用了。如果你对这个项目感兴趣,欢迎一起来交流学习。
项目链接
希望这些示例代码和解释能帮助你更好地理解这个项目的实现方式。
cool! 能share下源码吗?
真赞。
源码在这里。。 git://github.com/myliang/top3c.git
赞一个
hi 能留一个联系方式给我吗? 方便交流呀
不错哦~很有意思,赞一个
qq:874130671
您好,不知node.js 数据抓取是如何实现呢???
关于“Node.js + Rails3 + MongoDB 开发了个商品价格记录的网站”的问题,你的描述表明你已经成功地结合了这几个技术栈来实现一个功能完善的商品价格记录网站。你特别提到了Node.js在数据抓取方面的优势,同时也指出了MongoDB在处理字段不确定的数据时的优势。
示例代码:使用Node.js进行数据抓取
这里提供一个简单的示例,展示如何使用Node.js中的axios
库进行HTTP请求,以及如何使用cheerio
库解析HTML页面内容。
安装依赖
首先需要安装必要的npm包:
npm install axios cheerio
示例代码:数据抓取脚本
const axios = require('axios');
const cheerio = require('cheerio');
async function fetchProductPrice(url) {
try {
const response = await axios.get(url);
const $ = cheerio.load(response.data);
// 假设我们从网页中获取商品价格
const priceElement = $('.product-price'); // 根据实际情况调整选择器
const productPrice = priceElement.text().trim();
console.log(`产品价格: ${productPrice}`);
} catch (error) {
console.error(`抓取数据失败: ${error.message}`);
}
}
// 使用示例
fetchProductPrice('https://example.com/product-page');
这段代码展示了如何使用axios
发送GET请求到指定URL,并通过cheerio
库解析返回的HTML内容,从中提取出商品的价格信息。
集成MongoDB
你可以使用Mongoose库与MongoDB交互,方便地定义模型、创建数据库连接等。
安装Mongoose
npm install mongoose
示例代码:定义模型并保存数据
const mongoose = require('mongoose');
// 连接到MongoDB
mongoose.connect('mongodb://localhost:27017/price_records', { useNewUrlParser: true, useUnifiedTopology: true });
// 定义模型
const ProductSchema = new mongoose.Schema({
name: String,
price: Number,
url: String,
createdAt: { type: Date, default: Date.now }
});
const Product = mongoose.model('Product', ProductSchema);
async function saveProduct(name, price, url) {
const product = new Product({ name, price, url });
await product.save();
console.log('产品已保存');
}
// 使用示例
saveProduct('示例商品', 199.99, 'https://example.com/product-page');
以上代码演示了如何定义一个简单的Mongoose模型来存储商品价格记录,并将数据保存到MongoDB中。