Nodejs web站点抓取beat1.0出世啦。

Nodejs web站点抓取beat1.0出世啦。

目前主要是抓取文档型网站。 现在抓取http://w3school.com.cn/这个站点 6688个html页面用时大约140s node的并发确实给力 不过内存飙升。 其他网站还没有抓取测试呢 https://github.com/jackzhaojun/GrabWeb 有兴趣的一起来玩啊

4 回复

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 站点抓取。如果你有任何问题或建议,也欢迎随时联系我!


希望这段内容能满足你的需求。如果有任何进一步的要求或修改,请告诉我!


怎么抽取数据,只是抓整个html页面吗?

嗯。然后制作成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。如果你对这个项目感兴趣,欢迎一起参与讨论和改进!

希望这个工具能帮助到大家,也欢迎大家提出宝贵的建议和反馈。

回到顶部