Nodejs web站点抓取beat1.0出世啦。
Nodejs web站点抓取beat1.0出世啦。
目前主要是抓取文档型网站。 现在抓取http://w3school.com.cn/这个站点 6688个html页面用时大约140s node的并发确实给力 不过内存飙升。 其他网站还没有抓取测试呢 https://github.com/jackzhaojun/GrabWeb 有兴趣的一起来玩啊
Node.js Web站点抓取 Beat1.0 出世啦
大家好!今天我要分享的是一个使用 Node.js 开发的简单但功能强大的 Web 站点抓取工具。这个工具主要用于抓取文档型网站,并且已经在一些实际的场景中进行了测试。
抓取过程
目前,我们主要抓取的是 http://w3school.com.cn/
这个站点,它包含了 6688 个 HTML 页面。经过测试,使用 Node.js 的并发能力,抓取这些页面仅用了大约 140 秒的时间。这充分展示了 Node.js 在处理 I/O 密集型任务时的强大性能。
性能与问题
尽管 Node.js 的并发性能非常出色,但在抓取过程中我们也遇到了内存占用上升的问题。这是因为 Node.js 默认不会自动回收垃圾对象,因此在抓取大量数据时需要特别注意内存管理。我们正在努力优化代码以解决这个问题。
示例代码
下面是这个项目的简化版代码示例,展示如何使用 Node.js 进行基本的 Web 站点抓取:
const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs');
async function fetchPage(url) {
try {
const response = await axios.get(url);
return response.data;
} catch (error) {
console.error(`Error fetching ${url}:`, error.message);
}
}
function parsePage(html) {
const $ = cheerio.load(html);
// 示例解析:提取所有链接
const links = [];
$('a').each((index, element) => {
links.push($(element).attr('href'));
});
return links;
}
async function startCrawling(startUrl) {
const html = await fetchPage(startUrl);
const links = parsePage(html);
// 将抓取到的数据保存到文件
fs.writeFileSync('links.txt', JSON.stringify(links, null, 2));
// 递归抓取更多页面(这里简化了逻辑)
for (const link of links) {
await startCrawling(link);
}
}
// 开始抓取
startCrawling('http://w3school.com.cn/');
参与贡献
如果你对这个项目感兴趣,欢迎一起来参与开发和改进。该项目的源码托管在 GitHub 上,你可以通过以下链接访问:
希望这个简单的工具能够帮助大家更好地理解和使用 Node.js 进行 Web 站点抓取。如果你有任何问题或建议,也欢迎随时联系我!
希望这段内容能满足你的需求。如果有任何进一步的要求或修改,请告诉我!
嗯。然后制作成chm。后续会加点别的功能 抽取数据正则了
Node.js Web站点抓取 Beat 1.0 出世啦
大家好!最近我开发了一个基于Node.js的Web站点抓取工具,命名为 GrabWeb
。目前这个工具主要用于抓取文档型网站。比如,我成功抓取了 http://w3school.com.cn/
这个站点上的6688个HTML页面,整个过程耗时大约140秒。可以看出,Node.js在处理并发请求时表现得非常优秀。
不过,我也发现了一些问题,那就是在抓取过程中,程序的内存占用飙升。这可能是由于大量的HTTP请求导致的,我正在寻找更有效的解决方案来优化内存使用。
下面是使用 GrabWeb
抓取指定网站的基本示例:
const fs = require('fs');
const axios = require('axios');
const cheerio = require('cheerio');
async function fetchAndSave(url, filePath) {
try {
const response = await axios.get(url);
fs.writeFileSync(filePath, response.data);
console.log(`Page saved: ${filePath}`);
} catch (error) {
console.error(`Error fetching page: ${url}`, error.message);
}
}
// 示例URL和文件路径
const baseUrl = 'http://w3school.com.cn/';
const startUrl = `${baseUrl}index.html`;
(async () => {
// 获取首页内容并解析
const homePageResponse = await axios.get(startUrl);
const $ = cheerio.load(homePageResponse.data);
// 假设首页有一些链接,我们遍历这些链接并抓取它们
$('a').each((index, element) => {
const link = $(element).attr('href');
if (link && link.startsWith('http')) {
fetchAndSave(link, `./pages/${link.replace(/\//g, '-')}.html`);
}
});
})();
关于项目
该项目托管在GitHub上,地址是 GrabWeb。如果你对这个项目感兴趣,欢迎一起参与讨论和改进!
希望这个工具能帮助到大家,也欢迎大家提出宝贵的建议和反馈。