使用油猴脚本进行数据采集

网站分析

找到需要提取数据的接口(代码中不提供,你需要自己去网上找一些接口来测试),以下是返回的数据结构
在这里插入图片描述

脚本编写

油猴脚本的使用教程:【保姆级教程】油猴脚本的安装使用-优快云博客

采集数据

// ==UserScript==
// @name         采集车辆信息
// @namespace    http://tampermonkey.net/
// @description  简单的信息采集
// @version      2025-01-11
// @match        https://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    if (!window.CAR_GLOBAL) {
        window.CAR_GLOBAL = {};
    }

    function initControl(){
        var div = document.createElement('div');
        div.style.position = 'fixed';
        div.style.top = '10px';
        div.style.right = '10px';
        div.style.zIndex = '1000';
        div.style.background = '#999';
        div.style.padding = '20px';

        div.innerHTML = `
            <button type="button" style="padding:8px 10px;border-radius:5px;background:#fff;margin-right:10px;" οnclick="CAR_GLOBAL.fetchData()">采集</button>
            <button type="button" style="padding:8px 10px;border-radius:5px;background:#fff;" οnclick="CAR_GLOBAL.exportData()">导出数据</button>
        `;

        document.body.appendChild(div);
    }

    window.CAR_GLOBAL.fetchData = function() {
        fetch('xxx').then(res => res.json()).then(res => {
            console.log(res.result.seriesgrouplist);
        });
    }

    window.CAR_GLOBAL.exportData = function() {
        console.log('exportData');
    }

    function run() {
        initControl();
    }

    run();
})();

到这一步数据已经采集过来了,下面我们解决存储问题。一般浏览器存储大家会选择localstorage,可以存储10MB左右,不同浏览器也会有所不同。针对大数据量,我们可以采用IndexedDB

原生方式使用IndexedDB会比较麻烦,这里我引入一个第三方操作IndexedDB的库Dexie.js

修改后的代码:

// ==UserScript==
// @name         采集车辆信息
// @namespace    http://tampermonkey.net/
// @description  简单的信息采集
// @version      2025-01-11
// @match        https://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    var _db;

    // 省略代码...
    
    window.CAR_GLOBAL.fetchData = function() {
        fetch('xxx').then(res => res.json()).then(res => {
            const list = res.result.seriesgrouplist || [];
            for (const item of list) {
                _db.cars.add({data: item})
            }
        });
    }
    
    // 省略代码...

    function addScript(url, callback) {
        // 创建 script 标签
        var script = document.createElement('script');

        // 设置 script 标签的属性
        script.src = url;
        script.type = 'text/javascript';

        // 判断script是否加载完成
        script.onload = function() {
            console.log('脚本加载完成');
            if (typeof callback === 'function') {
                callback();
            }
        };

        // 处理加载错误的情况
        script.onerror = function() {
            console.error('脚本加载失败: ' + url);
        };

        // 将 script 标签添加到文档中开始加载
        document.body.appendChild(script);
    }

    function run() {
        addScript('https://unpkg.com/dexie/dist/dexie.js', function() {
            _db = new Dexie("car_db");
            _db.version(1).stores({
                cars: "++id, data", // id 自增
            });
        });
        initControl();

    }

    run();
})();

按F12-应用程序可以查看数据库
在这里插入图片描述

导出数据

将数据库里的数据,生成json文件导出

// ==UserScript==
// @name         采集车辆信息
// @namespace    http://tampermonkey.net/
// @description  简单的信息采集
// @version      2025-01-11
// @match        https://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    var _db;
    
    // 省略代码
    
    window.CAR_GLOBAL.exportData = function() {
        _db.cars.toArray().then(res => {
            downloadObjectAsJson(res, `car_${Date.now()}`);
        });
    }

    function downloadObjectAsJson(exportObj, exportName) {
        const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(exportObj));
        const downloadAnchorNode = document.createElement('a');

        downloadAnchorNode.setAttribute("href", dataStr);
        downloadAnchorNode.setAttribute("download", exportName + ".json");
        document.body.appendChild(downloadAnchorNode); // required for firefox
        downloadAnchorNode.click();
        downloadAnchorNode.remove();
    }

    function addScript(url, callback) {
        // 创建 script 标签
        var script = document.createElement('script');

        // 设置 script 标签的属性
        script.src = url;
        script.type = 'text/javascript';

        // 判断script是否加载完成
        script.onload = function() {
            console.log('脚本加载完成');
            if (typeof callback === 'function') {
                callback();
            }
        };

        // 处理加载错误的情况
        script.onerror = function() {
            console.error('脚本加载失败: ' + url);
        };

        // 将 script 标签添加到文档中开始加载
        document.body.appendChild(script);
    }

    function run() {
        addScript('https://unpkg.com/dexie/dist/dexie.js', function() {
            _db = new Dexie("car_db");
            _db.version(1).stores({
                cars: "++id, data", // id 自增
            });
        });
        initControl();
    }

    run();
})();

课后作业

可以通过发送请求的方法,把数据发送给自己的服务器进行处理。注意考虑跨域问题

总结

优点:

  • 直接在网页端进行采集,可以适当绕过登录、授权等问题
  • 调试方便,通过debugger 可以实时调试网页

缺点:

  • 没有IDE支持,编码提示少,好在可以直接让GPT来编写
### 如何在Greasemonkey脚本中实现用户数据持久化存储 为了使GreaseMonkey脚本能够保存并读取用户的配置或交互产生的数据,在浏览器环境中通常有几种方式可以实现这种需求。这里介绍两种常用的方法:`GM_setValue` 和 `GM_getValue` 函数以及使用本地存储(LocalStorage)。这两种方法各有优缺点。 #### 使用 GM_* API 进行数据存取 对于较为敏感的数据或是希望跨页面共享的数据来说,推荐采用由Tampermonkey/Greasemonkey扩展提供的API接口——即`GM_setValue()`和`GM_getValue()`.这些函数允许安全地设置键值对形式的小型数据项,并可以从任何加载了该脚本网页上下文中访问它们[^1]. ```javascript // 存储数据到指定名称的空间内 await GM_setValue('username', 'JohnDoe'); // 获取之前存储的数据 let username = await GM_getValue('username'); console.log(username); // 输出 JohnDoe ``` 这种方法的好处在于它提供了更好的安全性保障,因为只有同一源下的其他脚本获取到所储存的信息;而且即使网站本身也无法直接接触到这部分信息。不过需要注意的是,不同浏览器插件可能有不同的异步处理机制,因此最好总是加上`await`关键字以确保操作按预期顺序完成。 #### 利用 LocalStorage 实现简单存储功能 另一种更轻量级的选择就是利用HTML5引入的标准Web Storage特性之一 —— `localStorage`, 它可以直接通过JavaScript代码来进行简单的字符串类型的持久化记录工作: ```javascript // 将用户名保存至 localStorage 中 localStorage.setItem("savedUsername", "JaneSmith"); // 从 localStorage 取回已保存的名字 var savedName = localStorage.getItem("savedUsername"); alert(`上次登录的用户是 ${savedName}`); ``` 这种方式非常适合那些不需要特别保护隐私性的场景下应用,比如记住表单填写的内容以便下次自动填充等用途。但是由于其开放性质,意味着如果目标站点存在XSS漏洞,则攻击者有可能窃取其中保存的所有资料[^2]. 无论选用哪种技术路线,开发者都应该充分考虑到实际应用场景的安全性和效率因素做出合理决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值