--- title: "01-爬虫是什么" created: 2026-04-24 tags: - 项目 aliases: - 第 1 讲:爬虫是什么 --- # 爬虫是什么 先用一句话说清楚: **爬虫就是一个自动帮你打开网页、读取数据、提取有用信息、保存起来的程序。** 它做的事情,本质上和人打开浏览器看网页差不多,只不过人是用眼睛看、手动复制;爬虫是用代码访问网页、自动提取。 --- ## 1. 先用一个生活化比喻理解 你打开招聘网站找职位,大概会这样: ```text 打开网站 ↓ 搜索关键词 ↓ 看到职位列表 ↓ 点开某个职位详情 ↓ 复制职位名称、公司、薪资、地点、描述 ↓ 保存到表格里 ``` 爬虫做的事情就是: ```text 用代码打开网站 ↓ 用代码搜索或翻页 ↓ 用代码读取职位列表 ↓ 用代码打开详情页 ↓ 用代码提取职位字段 ↓ 用代码保存成 JSON、Excel 或入库 ``` 所以爬虫不是神秘技术,它的核心就是: > **把人工浏览网页、复制数据的过程自动化。** 项目里,前程无忧、猎聘、鱼泡这些脚本,本质上都是围绕“自动打开职位列表、抓职位详情、保存并入库”这条链路在做增强。 ## 2. 浏览器打开网页时发生了什么? 要理解爬虫,必须先理解浏览器。 当你在浏览器输入一个网址,比如: ```text https://example.com/jobs ``` 浏览器背后大概做了这些事: 1. 浏览器向服务器发请求 2. 服务器返回内容 3. 浏览器解析内容 4. 浏览器把页面画出来 5. 页面中的 JavaScript 可能继续请求更多数据 6. 最终你看到完整页面 可以画成这样: ```text 你 / 浏览器 ↓ 请求 Request 网站服务器 ↓ 响应 Response 你 / 浏览器 ↓ 解析 HTML、CSS、JS、JSON 最终页面 ``` ## 3. 网页里到底有什么? 一个网页通常不是一个单独的东西,而是由几类内容组合出来的。 ### 3.1 HTML:网页骨架 HTML 决定页面上有什么内容。 比如: ```xml

数据分析师

薪资:15k-25k

地点:上海

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