从零开始:前端也能玩转爬虫?我的实战踩坑总结
大家好,我是小李,一个从培训班毕业、靠自己摸索走到今天的前端开发。
刚入行时,我也曾以为“爬虫”是后端或 Python 工程师的专属技能,前端只要写写页面、调调接口就够了。直到有一天,我需要抓取某个公开网页的数据做可视化分析,却被卡在了第一步——连数据都拿不到!
那段时间我翻遍教程,发现很多内容要么太理论,要么直接甩代码不解释原理。所以今天,我就用最直白的方式,手把手带你用前端技术完成一次合法、安全、可落地的爬虫实践。这不是炫技,而是解决真实问题的工具。
⚠️ 免责声明:本文仅讨论对公开、允许爬取、无反爬机制的网站进行数据采集(如政府公开数据、新闻聚合页等),严禁用于商业爬取、绕过登录、高频请求等行为。遵守
robots.txt和《网络安全法》是每个开发者的基本素养。
一、前端做爬虫?真的可行吗?
很多人第一反应:“前端不是只能在浏览器里跑吗?怎么爬别人网站?”
其实,这里有两个关键点要分清:
- 浏览器内爬虫(前端脚本):在用户浏览器中运行 JavaScript 抓取当前页面或同源数据(比如你打开一个电商页面,用控制台提取商品列表)。适合快速分析、临时抓取。
- Node.js 环境爬虫(服务端 JS):用 Node.js 模拟 HTTP 请求,像后端一样发起网络调用。这才是真正意义上的“爬虫”,能跨域、能定时、能存数据库。
本文重点讲第二种——用我们熟悉的 JavaScript,在 Node.js 里实现爬虫。
为什么推荐前端学这个?
- 复用现有 JS/ES6+ 语法,学习成本低
- 能快速构建数据看板(爬完直接用 Vue/React 展示)
- 面试时加分项:展示工程化思维和解决问题能力
二、环境搭建:5 分钟配好开发环境
别被“环境配置”吓到,其实就三步:
步骤 1:安装 Node.js
- 去官网 https://nodejs.org 下载 LTS 版本(长期支持版)
- 安装时一路“下一步”,不用改选项
- 安装完成后打开终端(Mac 用 Terminal,Windows 用 CMD 或 PowerShell),输入:
如果显示版本号(如 v18.17.0),说明安装成功!node -v npm -v
步骤 2:创建项目文件夹
mkdir my-crawler
cd my-crawler
npm init -y
npm init -y 会自动生成 package.json 文件,这是项目的“身份证”。
步骤 3:安装核心依赖
我们要用两个关键库:
axios:发 HTTP 请求(替代原生 fetch,更简洁)cheerio:像 jQuery 一样操作 HTML(解析网页结构)
在终端运行:
npm install axios cheerio
✅ 至此,你的爬虫开发环境就 ready 了!
三、核心概念:爬虫三要素拆解
我当初学的时候,总被“DOM 解析”“异步请求”这些词搞晕。其实爬虫就三步:
1. 发请求(Request)
就像你在浏览器地址栏输入网址,程序也要主动“问”服务器要数据。
// request.js
const axios = require('axios');
async function fetchData(url) {
try {
const response = await axios.get(url);
console.log('状态码:', response.status); // 200 表示成功
return response.data; // 这就是网页的 HTML 字符串
} catch (error) {
console.error('请求失败:', error.message);
}
}
// 测试:抓取一个公开的测试页面
fetchData('https://httpbin.org/html');
💡 新手注意:如果遇到
ERR_CONNECTION_REFUSED,可能是网络问题或目标网站屏蔽了爬虫。先换简单目标练手!
2. 解析 HTML(Parsing)
拿到 HTML 字符串后,怎么精准提取想要的内容?比如只拿所有 <h2> 标题。
这时候 cheerio 就派上用场了——它把 HTML 字符串转成可操作的“虚拟 DOM”。
// parse.js
const cheerio = require('cheerio');
function extractTitles(html) {
const $ = cheerio.load(html); // 加载 HTML
const titles = [];
// 用 CSS 选择器定位元素(和 jQuery 一样!)
$('h2').each((index, element) => {
titles.push($(element).text().trim());
});
return titles;
}
// 示例 HTML
const sampleHtml = `
<div>
<h2>标题1</h2>
<p>内容...</p>
<h2>标题2</h2>
</div>
`;
console.log(extractTitles(sampleHtml)); // 输出: ['标题1', '标题2']
3. 存储或使用数据(Storage/Usage)
爬下来的数据可以:
- 打印到控制台(调试用)
- 写入本地文件(
.json,.csv) - 存进数据库(后续进阶)
- 直接喂给前端页面展示
// save.js
const fs = require('fs');
function saveToFile(data, filename) {
fs.writeFileSync(filename, JSON.stringify(data, null, 2));
console.log(`数据已保存到 ${filename}`);
}
// 使用示例
saveToFile(['标题1', '标题2'], 'titles.json');
四、实战:爬取“每日一句”名言并保存
现在,我们整合上面三步,做一个完整小项目:
目标:从 https://quotes.toscrape.com(一个专为爬虫练习设计的网站)抓取首页的所有名言。
第一步:观察网页结构
打开网站,右键“检查元素”,找到名言所在的 HTML 结构:
<div class="quote">
<span class="text">“The world as we have created it is a process of our thinking.”</span>
<span>by <small class="author">Albert Einstein</small></span>
</div>
我们需要提取 .text 和 .author 的内容。
第二步:编写爬虫代码
创建 crawler.js 文件:
// crawler.js
const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs');
async function scrapeQuotes() {
try {
// 1. 发请求
const response = await axios.get('https://quotes.toscrape.com');
// 2. 解析 HTML
const $ = cheerio.load(response.data);
const quotes = [];
// 遍历每个 .quote 元素
$('.quote').each((index, element) => {
const text = $(element).find('.text').text().trim();
const author = $(element).find('.author').text().trim();
quotes.push({ text, author });
});
// 3. 保存数据
fs.writeFileSync('quotes.json', JSON.stringify(quotes, null, 2));
console.log(`✅ 成功抓取 ${quotes.length} 条名言!`);
} catch (error) {
console.error('❌ 爬取失败:', error.message);
}
}
// 执行函数
scrapeQuotes();
第三步:运行并验证
在终端执行:
node crawler.js
几秒后,你会看到:
✅ 成功抓取 10 条名言!
同时项目目录下生成 quotes.json,内容类似:
[
{
"text": "“The world as we have created it is a process of our thinking.”",
"author": "Albert Einstein"
},
{
"text": "“It is our choices, Harry, that show what we truly are, far more than our abilities.”",
"author": "J.K. Rowling"
}
]
🎉 恭喜!你完成了第一个前端爬虫项目!
五、新手常见问题 & 避坑指南
我在培训班带学员时,90% 的问题都集中在这几类:
❓ 问题 1:axios.get() 报错 403 Forbidden 或 404
- 原因:目标网站有基础反爬(如检查 User-Agent)
- 解决方案:添加请求头模拟浏览器
const response = await axios.get(url, { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } });
❓ 问题 2:cheerio 提取不到内容
- 原因:动态渲染(内容由 JS 生成,HTML 源码里没有)
- 判断方法:右键网页 → “查看网页源代码”,搜索关键词是否在原始 HTML 中
- 解决方案:
- 如果是静态网站(如本例),用 cheerio 没问题
- 如果是 React/Vue 动态站,需用 Puppeteer(模拟真实浏览器),但复杂度高,初学者慎入
❓ 问题 3:中文乱码
- 原因:网页编码非 UTF-8(如 GBK)
- 解决方案:用
iconv-lite转码(需额外安装)const iconv = require('iconv-lite'); const html = iconv.decode(response.data, 'gbk');
🚫 绝对不要做的三件事
| 行为 | 风险 | 替代方案 |
|---|---|---|
| 高频请求(每秒多次) | IP 被封、法律风险 | 加 setTimeout 限速 |
| 爬取登录后内容 | 违反用户协议 | 使用官方 API |
| 爬取个人隐私数据 | 违法! | 只爬公开数据 |
六、下一步怎么学?我的成长路径建议
爬虫只是工具,关键是如何用它创造价值。根据我的经验,推荐你这样进阶:
阶段 1:巩固基础(1-2周)
- 练习更多选择器:
cheerio支持.class,#id,:eq(0),:contains('关键词')等 - 尝试分页爬取:循环请求
/page/1,/page/2... - 用
csv-writer导出 CSV 文件(比 JSON 更适合表格)
阶段 2:结合前端展示(2-3周)
- 用 Express 搭个简单后端,提供爬取接口
- 用 Vue/React 做个页面,展示爬到的数据
- 示例:爬取天气预报 → 做个天气卡片组件
阶段 3:工程化与合规(长期)
- 学习
robots.txt协议(https://quotes.toscrape.com/robots.txt) - 添加错误重试机制(网络不稳定时自动重试)
- 用 Docker 容器化部署,避免本地环境差异
最后的话:技术是手段,不是目的
我当初学爬虫,不是为了“黑科技”,而是想快速获取数据验证产品想法。
前端开发者的优势在于:既能拿数据,又能把它变成用户看得懂、用得爽的产品。
希望这篇教程帮你迈出第一步。记住:
合法、克制、有目的的爬取,才是专业开发者的做法。
如果你照着做了却卡在某一步,欢迎在评论区留言(假设这是博客)——当年没人帮我,现在我想帮帮你。
动手吧,你的第一个爬虫,就在 node crawler.js 这行命令之后。

评论 0