提到 Tampermonkey(俗称 "油猴"),多数人的第一印象是 "网页增强工具"------ 去广告、改样式、补功能,却鲜少有人注意到它在自动化操作与数据采集领域的潜力。作为一款跨浏览器的用户脚本管理器,油猴脚本凭借 "直接运行于浏览器环境" 的特性,能避开传统爬虫的环境配置门槛,成为轻量型数据采集与自动化任务的高效工具。本文将从基础逻辑到实操案例,拆解油猴脚本如何 "变身" 爬虫,帮助新手快速上手自动化数据采集。
一、油猴脚本变身爬虫的核心优势
传统爬虫(如 Python+Scrapy)需搭建开发环境、处理网络请求、破解反爬机制,门槛较高。而油猴脚本基于浏览器原生环境运行,核心优势直击 "轻量" 与 "便捷":
- 零环境配置:安装插件即可启动,无需配置 Python、Node.js 等开发环境,新手秒上手。
- 原生适配网页:直接调用网页 DOM 元素,无需解析复杂的接口响应,动态页面数据也能直接抓取。
- 自动化联动:可结合网页交互逻辑,实现 "点击按钮→加载数据→采集存储" 的全流程自动化,模拟真人操作更易规避基础反爬。
- 跨平台兼容:支持 Chrome、Firefox、Edge 等主流浏览器,脚本一次编写可多端复用。
二、前期准备:油猴脚本基础配置
在开始数据采集前,需完成 3 个基础步骤,搭建最小化操作环境:
- 安装油猴插件:浏览器应用商店搜索 "Tampermonkey",点击安装后,浏览器工具栏会出现油猴图标。
- 新建用户脚本:点击油猴图标→"创建新脚本",自动生成默认模板,核心需关注 3 个配置项:
@match:指定脚本生效的网页地址(如https://example.com/*,表示该域名下所有页面生效)。@require:引入辅助库(可选,如 jQuery 简化 DOM 操作,格式为// @require https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js)。@run-at:设置脚本运行时机(推荐document-end,即网页 DOM 加载完成后执行)。
- 熟悉核心 API:油猴脚本本质是 JavaScript 代码,可直接使用浏览器原生 API,核心常用接口包括:
document.querySelector()/document.querySelectorAll():抓取 DOM 元素数据。GM_setValue()/GM_getValue():油猴内置方法,用于本地存储采集到的数据。setInterval()/setTimeout():实现定时触发,自动化加载分页数据。
三、核心功能实现:自动化操作与数据采集
油猴脚本的爬虫逻辑,本质是 "模拟人工操作 + 提取 DOM 数据",以下拆解 2 个核心场景的实现思路与代码示例:
1. 静态页面数据采集:直接提取 DOM 元素
适用于数据已渲染在网页源码中的场景(如表格、列表),核心是定位元素、提取内容、存储数据。
示例:采集某资讯列表的标题与链接
javascript
运行
// ==UserScript==
// @name 资讯列表数据采集
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 自动采集资讯列表的标题与链接
// @match https://example.com/news/* // 替换为目标网页地址
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==
(function() {
'use strict';
// 1. 定位列表元素(根据目标网页DOM结构修改选择器)
const newsList = document.querySelectorAll('.news-item');
const data = [];
// 2. 提取数据
newsList.forEach(item => {
const title = item.querySelector('.news-title').innerText;
const url = item.querySelector('a').href;
data.push({ title, url });
});
// 3. 本地存储数据(可在油猴→脚本选项中查看存储内容)
GM_setValue('newsData', JSON.stringify(data));
alert(`采集完成!共获取${data.length}条数据`);
})();
2. 动态页面自动化:模拟分页加载与采集
适用于数据通过滚动或点击 "下一页" 加载的场景(如瀑布流、分页列表),需结合定时操作实现自动化加载。
示例:自动点击 "下一页" 并采集全量数据
javascript
运行
// ==UserScript==
// @name 分页数据自动采集
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 自动点击下一页,采集所有分页数据
// @match https://example.com/list/*
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==
(function() {
'use strict';
const allData = GM_getValue('allListData', []) || [];
let isLoading = false; // 防止重复点击
// 采集当前页数据
function collectCurrentPage() {
const listItems = document.querySelectorAll('.list-item');
const currentData = Array.from(listItems).map(item => ({
name: item.querySelector('.item-name').innerText,
price: item.querySelector('.item-price').innerText
}));
allData.push(...currentData);
GM_setValue('allListData', allData);
console.log(`当前页采集完成,累计${allData.length}条`);
}
// 点击下一页并继续采集
function clickNextPage() {
const nextBtn = document.querySelector('.next-page-btn');
if (nextBtn && !nextBtn.disabled) {
isLoading = true;
nextBtn.click();
// 等待页面加载完成(根据网页加载速度调整延时)
setTimeout(() => {
isLoading = false;
collectCurrentPage();
}, 2000);
} else {
alert(`全部分页采集完成!共${allData.length}条数据`);
}
}
// 初始采集+定时触发下一页
collectCurrentPage();
setInterval(() => {
if (!isLoading) clickNextPage();
}, 3000);
})();
四、进阶技巧:提升采集效率与稳定性
1. 数据导出:从本地存储到文件
油猴的GM_setValue仅支持本地存储,如需导出数据,可添加 "下载文件" 功能:
javascript
运行
// 导出JSON文件
function exportData(data, fileName) {
const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `${fileName}.json`;
a.click();
URL.revokeObjectURL(url);
}
// 调用示例:exportData(allData, '商品列表数据');
2. 规避反爬:模拟真人操作
- 添加随机延时:将固定
setTimeout改为随机时间(如Math.random()*2000 + 1000),避免机械操作。 - 模拟滚动:对瀑布流页面,用
window.scrollTo(0, document.body.scrollHeight)触发数据加载。 - 避开检测:避免高频次采集,单个脚本控制采集速度,不修改网页核心交互逻辑。
3. 处理复杂 DOM:使用 jQuery 简化操作
若网页 DOM 结构复杂,可通过@require引入 jQuery,简化元素定位与数据提取:
javascript
运行
// ==UserScript==
// @require https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js
// ==/UserScript==
// jQuery采集示例:
const data = $('.table tr').map((index, tr) => ({
id: $(tr).find('td:eq(0)').text(),
content: $(tr).find('td:eq(1)').text()
})).get();
五、注意事项:合规与风险提示
- 合法合规是前提:采集数据仅限个人学习、非商业用途,不得侵犯网站版权或隐私数据(如用户信息、付费内容)。
- 尊重网站规则:查看目标网站
robots.txt协议,不采集禁止抓取的内容,避免给网站服务器造成压力。 - 避免滥用:油猴脚本本质是 "用户侧工具",不适用于大规模、高频率的数据采集,此类需求建议使用专业爬虫框架并获得网站授权。
六、适用场景与总结
油猴脚本爬虫的核心优势是 "轻量、便捷、低门槛",适合以下场景:
- 个人学习所需的小批量数据采集(如学术资料、公开列表)。
- 日常工作中的重复操作自动化(如数据录入、报表整理)。
- 动态网页的快速数据提取(无需解析接口,直接抓取渲染后的数据)。
相较于传统爬虫,油猴脚本无需复杂配置,让 "不懂编程" 的新手也能通过简单修改实现数据采集,同时为开发者提供了快速验证采集逻辑的工具。但需始终坚守合规底线,合理使用技术工具。