🚀 爬虫工程师高频面试题精选
一、 爬虫基础(建立专业认知)
1. 简述爬虫定义及其基本执行流程
参考答案: 爬虫是自动化模拟浏览器发送网络请求、接收并解析响应数据、最终实现结构化存储的程序。 核心流程:
- 请求控制:构造 Headers(UA/Cookie/Referer)发起 HTTP 请求。
- 响应获取:接收服务器返回的 HTML、JSON、二进制(图片/视频)等原始数据。
- 数据解析:利用解析工具提取目标字段。
- 持久化存储:将清洗后的数据存入数据库或本地文件。
2. GET 与 POST 请求在爬虫实战中的区别?
参考答案:
- GET:参数显式拼接在 URL 后,受长度限制。主要用于获取公开信息或翻页查询。
- POST:参数封装在 Request Body 中,数据量不限且相对私密。多用于登录授权、搜索查询或提交表单。
3. 请列举常见的 HTTP 状态码及其含义
参考答案:
- 200 (Success):请求处理成功。
- 301/302 (Redirect):永久/临时重定向,爬虫需关注
Location字段。 - 403 (Forbidden):服务器拒绝访问,通常触发了反爬机制。
- 404 (Not Found):请求资源不存在。
- 500 (Internal Server Error):服务器内部崩溃。
二、 数据解析(工程化技巧)
4. 爬虫解析器如何选型?优缺点对比?
参考答案:
- 正则表达式 (Re):性能极高,适合提取 HTML 中的 JS 变量或简单字符串,但复杂结构的维护性差。
- BeautifulSoup (BS4):基于 Python 的解析库,API 友好,但由于纯 Python 实现,在大规模解析时速度较慢。
- XPath / CSS 选择器:基于 C 语言实现的
lxml库,速度快、定位精准,是 Scrapy 框架的标配。 - Json 模块:针对 API 接口返回的结构化数据,直接序列化为字典进行操作。
5. XPath 定位的常用语法有哪些?
参考答案:
//div:选取文档中所有div节点。//div[@class="title"]:按属性过滤节点。//a/@href:提取节点内的链接属性。//div/text():获取直系文本内容。
三、 反爬策略与技术攻坚(核心考点)
6. 常见的反爬虫手段有哪些?
参考答案:
- 身份校验:User-Agent 检查、Cookie 验证、Referer 溯源。
- 访问行为:IP 访问频率限制、封禁代理、Token 时效性。
- 内容干扰:JS 动态渲染、CSS 偏移(视觉欺骗)、字体加密。
- 强校验:各种交互式验证码(滑块、文字点选)。
7. 如何有效应对 IP 封禁问题?
参考答案:
- 构建或接入代理 IP 池(高匿透明代理)。
- 部署分布式节点,分散单一 IP 流量。
- 实施自适应爬取延迟(如 Scrapy 的
DOWNLOAD_DELAY)。
8. 处理动态渲染网页(SPA/Ajax)有哪些方案?
参考答案:
- 逆向 API(首选):通过浏览器 F12 调试寻找真正的 XHR/Fetch 数据接口,直接获取结构化 JSON。
- 自动化工具:使用 Selenium 或 Playwright(性能更优)驱动浏览器内核进行真实渲染。
- 无头浏览器:如 Pyppeteer 等控制 Chromium 执行 JS。
9. Selenium 如何降低被目标网站识别的风险?
参考答案:
- 修改或隐藏
navigator.webdriver等关键特征。 - 使用
undetected-chromedriver等针对性修改过的驱动库。 - 设置无头模式并伪造真实的用户 UA 与视口尺寸。
10. 验证码(CAPTCHA)的处理策略有哪些?
参考答案:
- 打码平台:接入第三方图像识别 API(如超级鹰等)。
- 算法模型:针对特定滑块,利用 OpenCV 计算缺口位移;针对字符点选,训练 CNN 模型。
- 降级处理:优先寻找 App 端接口或轻量版网页,通常验证强度较低。
四、 爬虫框架(Scrapy 系列)
11. 简述 Scrapy 的核心组件及数据流向
参考答案:
- Engine (引擎):指挥调度各组件间的信号传递。
- Scheduler (调度器):维护待请求队列并负责去重。
- Downloader (下载器):高效处理 HTTP 请求并返回 Response。
- Spider (爬虫):解析响应内容,生成 Item 或新的 Request。
- Item Pipeline (管道):负责数据的后置处理(清洗、入库)。
12. 什么是分布式爬虫?Scrapy 如何实现?
参考答案:
多台机器协同工作,共用一套去重队列。通常利用 Scrapy-Redis 插件,将任务队列和去重集合从本地内存移至 Redis 缓存,从而实现多机并行。
五、 存储与大规模去重
13. 海量数据去重有哪些推荐方案?
参考答案:
- 数据库层:设置
Unique Index(唯一索引)。 - 缓存层:利用 Redis 的
Set结构。 - 算法层:布隆过滤器 (Bloom Filter),内存占用极低,极低误报率,是亿级数据去重的最优选。
14. 面试题:口述一个高可用爬虫的设计思路
参考答案:
- 调研:分析目标站数据加载方式(静态 vs 动态),寻找隐藏接口。
- 工程设计:采用协程或框架(Scrapy)提速。
- 健壮性:增加异常捕获重试、随机 UA 与代理切换。
- 后置处理:数据字段清洗及 MongoDB 持久化。
- 合规:设置合理的 QPS,不给对方运维增加压力。
六、 反爬与逆向
15. 爬虫的基本流程及关键点?
标准回答:请求 -> 响应 -> 解析 -> 存储。 大厂加分点:
- 异常处理:必须包含
try-except捕获超时与连接错误。 - 去重机制:在“请求”之前,应经过去重层(如布隆过滤器)。
- 频率控制:根据
robots.txt或测试出的阈值设置自适应延迟。
16. HTTP 与 HTTPS 的区别?爬虫如何处理 SSL 证书?
答案:HTTPS 是加了 SSL/TLS 层的 HTTP。
实战技巧:在 requests 中设置 verify=False 可忽略证书错误,但在生产环境建议指定证书路径或更新系统的 certifi 库。
17. XPath、CSS 选择器与正则的应用场景选择?
答案:
- XPath:支持层级溯源(如
..查找父节点),功能最强,解析 HTML 结构的首选。 - CSS 选择器:语法简洁,前端开发转爬虫最易上手。
- 正则 (Re):处理非结构化数据(如 HTML 中的 JS 变量、JSON 字符串碎片)时不可替代。
18. 遇到“字体加密(Iconfont)”如何解析?
进阶答案:这是目前主流的反爬。
方案:下载 .woff 或 .ttf 字体文件,利用 fontTools 库解析映射关系,通过 OCR 或坐标比对还原真实字符。
19. 什么是 JS 逆向?常见的混淆方式有哪些?
答案:当请求参数(如 sign, token)由 JS 动态生成时,需要通过逆向还原其逻辑。
常见混淆:变量名混淆、控制流平坦化、AAEncode、OB 混淆。
工具:Chrome 开发者工具(断点调试)、PyExecJS(执行 JS)、AST(抽象语法树还原)。
20. 验证码处理的进阶策略?
答案:
- 普通字符:CNN 卷积神经网络。
- 点选/滑块:目标检测(YOLO)+ 缺口识别(OpenCV 模板匹配)+ 轨迹模拟(贝塞尔曲线)。
21. 谈谈你对 TLS 指纹(JA3 指纹)检测的理解?
加分点:这是 2024-2026 年非常火的高级反爬。
原理:服务器通过检查客户端 SSL 握手时的特征来判断是否为 Python requests。
绕过:使用 curl_cffi 库或 httpx 模拟真实浏览器指纹。
22. Scrapy 架构的各个组件及其数据流向?
重点描述:Scheduler 负责优先级排序和去重,Downloader Middleware 负责处理代理随机切换和 Header 注入,Spider Middleware 负责处理解析结果。
23. 多线程、多进程与异步协程 (asyncio) 怎么选?
答案:
- 多线程:适合普通 I/O 密集型,受 GIL 锁限制。
- 多进程:适合需要大量正则/计算的解析任务。
- 协程 (asyncio):最高效。单线程下利用切换实现高并发,配合
aiohttp是目前大规模爬虫的主流。
24. Scrapy-Redis 实现分布式的核心?
答案:
- 共享队列:将调度器的 Request 队列由内存移至 Redis。
- 共享去重:利用 Redis 的 Set 集合存储指纹。
- 持久化:爬虫中断后,队列依然在 Redis 中,支持断点续爬。
25. 为什么大规模爬虫首选 MongoDB 而非 MySQL?
答案:
- Schema-free:爬虫字段经常变动,无需预先定义表结构。
- 嵌套支持:完美存储 JSON 格式。
- 横向扩展:分片集群处理海量数据更简单。
26. 什么是布隆过滤器(Bloom Filter)?
答案:一种空间利用率极高的概率型数据结构。它能告诉你“某个 URL 一定不存在或可能存在”。 场景:亿级 URL 去重,Redis 内存占用比普通 Set 降低 90% 以上。
27. 如果爬取速度太快,除了封 IP 还会带来什么风险?
答案:可能会造成 DDoD 攻击效果,导致对方服务器崩溃。这是法律红线,必须通过自适应限速或代理池分摊流量。
28. 谈谈你的爬虫工程化经验。
答案:
- 监控:Prometheus + Grafana 监控抓取成功率、403 率、数据增长曲线。
- 告警:当解析规则失效(页面改版)时,通过飞书/钉钉机器人秒级通知。
- 部署:Docker 容器化部署,利用 K8s 动态伸缩爬虫实例。

