为什么 JavaScript 是您自动化的得力助手
您是否曾想过,自己花费数小时在重复性操作上:重命名数百个文件、从表格中复制数据、发送几十封邮件或检查网站是否宕机?如果是这样,那么这篇文章就是为您准备的。
JavaScript 早已不仅仅是“用于按钮动画的语言”。随着 Node.js 和强大库的出现,它已转变为任务自动化的通用工具。是的,即使您是 Python 开发者,JS 也能成为您的秘密武器:它无处不在——在浏览器中、服务器上、云端,甚至在 Raspberry Pi 上都能运行。
在本文中,我们将分析 JavaScript 自动化的实际场景,这些场景将为您节省数十小时。没有空话——只有代码和实践。
1. 浏览器自动化:Puppeteer 和 Playwright
想象一下:您需要从 500 个电商页面收集价格,但没有 API。手动复制粘贴?不,谢谢。这时 Puppeteer——一个用于控制 Chromium 的库——就派上用场了。
示例:抓取新闻标题
const puppeteer = require('puppeteer');
(async () => { const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); await page.goto('https://news.ycombinator.com', { waitUntil: 'networkidle2' }); const titles = await page.evaluate(() => { const items = document.querySelectorAll('.titleline > a'); return Array.from(items).map(item => item.innerText); }); console.log('最新新闻:', titles.slice(0, 10)); await browser.close();})();这个脚本打开 Hacker News,收集前 10 条新闻的标题并输出到控制台。在实际应用中,您可以添加保存到 CSV、发送到 Telegram 或写入数据库的功能。
Playwright——拥有超能力的替代方案
如果您需要处理多个浏览器(Chrome、Firefox、Safari)或模拟移动设备,请使用 Playwright。它更快、更稳定,并且能够拦截请求。
2. 文件处理:重命名、排序、清理
您有一个包含 1000 张照片的文件夹,文件名类似于 "IMG_20250101_123456.jpg"?想要整理它们?Node.js 内置的 fs(文件系统)模块可以在几秒钟内完成。
示例:批量重命名文件
const fs = require('fs');const path = require('path');
const directory = './photos';
fs.readdir(directory, (err, files) => { if (err) throw err; files.forEach((file, index) => { const ext = path.extname(file); const newName = `photo_${String(index + 1).padStart(4, '0')}${ext}`; fs.rename( path.join(directory, file), path.join(directory, newName), (err) => { if (err) console.error(`文件 ${file} 出错:`, err); else console.log(`${file} → ${newName}`); } ); });});您可以轻松修改脚本:添加扩展名过滤、从 EXIF 提取日期、按模板重命名。这是构建数十种实用工具的基础。
3. 自动化处理 CSV 和 Excel(无需办公套件)
业务任务通常需要处理表格。对于 CSV,请使用内置模块或 csv-parser 库。对于 Excel,请使用 xlsx(SheetJS)。
示例:读取 CSV 并创建报告
const fs = require('fs');const csv = require('csv-parser');const createCsvWriter = require('csv-writer').createObjectCsvWriter;
const results = [];
fs.createReadStream('orders.csv') .pipe(csv()) .on('data', (row) => { if (parseFloat(row.total) > 100) { results.push({ orderId: row.id, client: row.name, sum: row.total }); } }) .on('end', () => { const csvW