爬虫是什么
先用一句话说清楚:
爬虫就是一个自动帮你打开网页、读取数据、提取有用信息、保存起来的程序。
它做的事情,本质上和人打开浏览器看网页差不多,只不过人是用眼睛看、手动复制;爬虫是用代码访问网页、自动提取。
1. 先用一个生活化比喻理解
你打开招聘网站找职位,大概会这样:
打开网站
↓
搜索关键词
↓
看到职位列表
↓
点开某个职位详情
↓
复制职位名称、公司、薪资、地点、描述
↓
保存到表格里
爬虫做的事情就是:
用代码打开网站
↓
用代码搜索或翻页
↓
用代码读取职位列表
↓
用代码打开详情页
↓
用代码提取职位字段
↓
用代码保存成 JSON、Excel 或入库
所以爬虫不是神秘技术,它的核心就是:
把人工浏览网页、复制数据的过程自动化。
项目里,前程无忧、猎聘、鱼泡这些脚本,本质上都是围绕“自动打开职位列表、抓职位详情、保存并入库”这条链路在做增强。
2. 浏览器打开网页时发生了什么?
要理解爬虫,必须先理解浏览器。
当你在浏览器输入一个网址,比如:
https://example.com/jobs
浏览器背后大概做了这些事:
- 浏览器向服务器发请求
- 服务器返回内容
- 浏览器解析内容
- 浏览器把页面画出来
- 页面中的 JavaScript 可能继续请求更多数据
- 最终你看到完整页面
可以画成这样:
你 / 浏览器
↓ 请求 Request
网站服务器
↓ 响应 Response
你 / 浏览器
↓ 解析 HTML、CSS、JS、JSON
最终页面
3. 网页里到底有什么?
一个网页通常不是一个单独的东西,而是由几类内容组合出来的。
3.1 HTML:网页骨架
HTML 决定页面上有什么内容。
比如:
<h1>数据分析师</h1>
<p>薪资:15k-25k</p>
<p>地点:上海</p>
可以把 HTML 理解成网页的“骨架”。
3.2 CSS:网页样式
CSS 决定页面长什么样。
比如字体大小、颜色、布局、按钮样式。
爬虫一般不关心 CSS,因为我们要的是数据,不是页面好不好看。
3.3 JavaScript:网页动作
JavaScript 决定页面如何动起来。
比如:
点击下一页
下拉加载更多
选择城市
选择学历
弹出详情
异步请求职位列表
很多现代网站不是一开始就把所有职位写在 HTML 里,而是先加载一个空页面,再由 JavaScript 请求职位数据。
这也是为什么有些网页你用简单代码抓不到内容。
3.4 JSON:接口返回的数据
很多职位网站真正的数据,其实藏在接口返回的 JSON 里。
例如:
{
"jobTitle": "数据分析师",
"company": "某科技公司",
"salary": "15k-25k",
"city": "上海"
}
JSON 对爬虫非常友好,因为它本身就是结构化数据。
猎聘爬虫就大量利用了这一点:列表页不是完全从页面文字里硬抠,而是监听猎聘返回的职位接口 JSON,再用职位详情页补充描述、地址、标签等字段。
4. 爬虫和浏览器的区别
浏览器是给人看的。
爬虫是给程序用的。
| 对比项 | 浏览器 | 爬虫 |
|---|---|---|
| 使用者 | 人 | 程序 |
| 目的 | 展示网页 | 提取数据 |
| 操作方式 | 点击、滚动、复制 | 请求、解析、保存 |
| 结果 | 页面 | JSON、表格、数据库 |
| 关注点 | 好不好看 | 数据准不准、全不全、稳不稳 |
所以爬虫不一定要“看到”完整页面。
如果能直接拿到接口 JSON,就不需要真的渲染网页。
但如果数据必须点击、滚动、登录、等待 JS 加载后才出现,就可能需要模拟浏览器。
5. 最小爬虫模型
所有爬虫,无论简单还是复杂,本质都可以拆成五步:
1. 请求
2. 获取
3. 解析
4. 提取
5. 保存
展开就是:
给一个 URL
↓
发送请求
↓
拿到网页 HTML 或接口 JSON
↓
从里面找出目标数据
↓
保存到文件或数据库
比如抓职位,最小模型是:
职位列表页 URL
↓
请求列表页
↓
提取职位链接
↓
请求职位详情页
↓
提取职位名称、公司、薪资、地点、描述
↓
保存
参考的两个项目也是这个模型,只是复杂很多。
比如通用招聘采集系统在“获取”之后,还增加了 HTML 清洗、Markdown 转换、OCR、二维码识别、模型抽取、质控、上传等环节。
6. 爬虫为什么能抓到数据?
因为网页数据最终要展示给用户。
只要浏览器能看到数据,理论上这些数据就一定以某种形式到达了你的电脑:
可能是:
HTML 里直接有
JSON 接口里有
JavaScript 渲染后才出现
图片里有
二维码里有
登录后接口里有
爬虫的任务就是找到它在哪里。
这句话很重要:
爬虫不是“创造数据”,而是找到网页已经返回给浏览器的数据,然后提取出来。
7. 为什么有些网页好抓,有些网页难抓?
因为数据出现的位置不同。
第一种:HTML 里直接有数据
这种最好抓。
<div class="job-title">产品经理</div>
<div class="salary">20k-30k</div>
代码请求 HTML 后,直接解析就行。
这类适合用:
requests + BeautifulSoup / lxml
第二种:HTML 里没有数据,接口里有数据
页面刚打开时 HTML 可能是空壳,真正职位列表来自接口。
这种更适合找接口,直接拿 JSON。
适合用:
requests 请求接口
或者 Playwright 监听接口响应
猎聘列表页就是比较典型的“接口数据更有价值”的场景。
第三种:必须操作页面才有数据
比如:
点击城市
选择经验
选择公司规模
点击加载更多
滚动到底部
这时候简单 requests 不够,需要模拟浏览器行为。
适合用:
Playwright / Selenium
第四种:数据在图片或二维码里
比如招聘公告是一张海报,里面写着岗位和联系方式。
普通 HTML 解析抓不到文字,需要:
下载图片
OCR 识别文字
二维码识别
再参与结构化抽取
参考项目中的通用采集结构化项目就包含 OCR、二维码、图片上传和图片去重这些能力。
8. 这就引出了“四重采集通道”
通道一:静态 HTML 采集
适合简单网页。
代码直接请求网页 HTML
↓
从 HTML 中解析数据
特点:
简单、快、成本低
但遇到动态网页容易抓不到数据
通道二:动态页面采集
适合需要点击、滚动、等待加载的网站。
用 Playwright 打开浏览器
↓
像真人一样点击、滚动、翻页
↓
从页面里提取数据
特点:
更接近真实用户
能处理复杂页面
但速度慢、资源消耗大、容易遇到反爬
通道三:API 直连采集
适合已经找到数据接口的网站。
直接请求接口
↓
拿到 JSON
↓
解析字段
特点:
最快、最干净、最稳定
但需要找到接口并理解参数
通道四:浏览器响应监听采集
适合接口不好直接复刻,但页面会自己请求接口的情况。
用 Playwright 正常打开网页
↓
监听浏览器收到的接口响应
↓
把 JSON 抓出来
特点:
不用完全破解接口参数
又能拿到接口级数据
非常适合复杂动态网站
这也是很多真实项目里非常实用的方式。
猎聘项目就是这种思路:通过页面真实操作触发接口,再监听接口拿职位列表,之后再打开详情页补字段。
9. 爬虫为什么会失败?
常见原因有这些。
9.1 页面结构变了
原来职位标题是:
<div class="job-title">
后来网站改成:
<span class="position-name">
你的解析规则就失效了。
9.2 数据不是写在 HTML 里
你请求网页源码,发现里面没有职位数据。
原因可能是职位数据由 JavaScript 后加载。
9.3 需要登录或 Cookie
有些数据必须登录后才能看。
浏览器有 Cookie,代码没有 Cookie,就抓不到。
9.4 被反爬识别
网站发现你访问太快、太规律、IP 异常、行为不像真人,就可能返回:
验证码
405
403
安全验证
空数据
跳登录
渠道专项爬虫里就有代理池、随机休眠、资源拦截、验证页识别、过期清洗等处理,这些都是为了解决长期稳定运行的问题。
9.5 抓到了,但数据不干净
比如:
广告
页脚
免责声明
推荐职位
无关链接
图片文字
重复内容
过期职位
所以真实系统还要做清洗、去重、质控和入库。
10. 需要记住的核心模型
先不用急着写代码,先记住这个模型:
网页数据在哪里?
↓
HTML 里?
接口 JSON 里?
JavaScript 渲染后?
图片/二维码里?
↓
选择合适的采集方式
↓
提取字段
↓
清洗去重
↓
保存或入库
再压缩成一句话:
爬虫的本质,是用程序模拟“获取网页数据”的过程,并把网页中的非结构化或半结构化信息,转换成我们能使用的结构化数据。
爬虫 = 自动化获取网页数据的程序
网页 = HTML + CSS + JavaScript + 接口数据 + 图片等资源
浏览器 = 帮人请求、解析、渲染网页的工具
爬虫 = 帮程序请求、解析、提取、保存数据的工具
简单网页 → requests 抓 HTML
动态网页 → Playwright 模拟浏览器
接口数据 → 直接抓 JSON
复杂接口 → Playwright 监听 response
图片数据 → OCR / 二维码识别
💬 评论