🚀 爬虫工程师高频面试题精选

一、 爬虫基础(建立专业认知)

1. 简述爬虫定义及其基本执行流程

参考答案: 爬虫是自动化模拟浏览器发送网络请求、接收并解析响应数据、最终实现结构化存储的程序。 核心流程

  1. 请求控制:构造 Headers(UA/Cookie/Referer)发起 HTTP 请求。
  2. 响应获取:接收服务器返回的 HTML、JSON、二进制(图片/视频)等原始数据。
  3. 数据解析:利用解析工具提取目标字段。
  4. 持久化存储:将清洗后的数据存入数据库或本地文件。

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. 爬虫解析器如何选型?优缺点对比?

参考答案

  1. 正则表达式 (Re):性能极高,适合提取 HTML 中的 JS 变量或简单字符串,但复杂结构的维护性差。
  2. BeautifulSoup (BS4):基于 Python 的解析库,API 友好,但由于纯 Python 实现,在大规模解析时速度较慢。
  3. XPath / CSS 选择器:基于 C 语言实现的 lxml 库,速度快、定位精准,是 Scrapy 框架的标配。
  4. Json 模块:针对 API 接口返回的结构化数据,直接序列化为字典进行操作。

5. XPath 定位的常用语法有哪些?

参考答案

  • //div:选取文档中所有 div 节点。
  • //div[@class="title"]:按属性过滤节点。
  • //a/@href:提取节点内的链接属性。
  • //div/text():获取直系文本内容。

三、 反爬策略与技术攻坚(核心考点)

6. 常见的反爬虫手段有哪些?

参考答案

  1. 身份校验:User-Agent 检查、Cookie 验证、Referer 溯源。
  2. 访问行为:IP 访问频率限制、封禁代理、Token 时效性。
  3. 内容干扰:JS 动态渲染、CSS 偏移(视觉欺骗)、字体加密。
  4. 强校验:各种交互式验证码(滑块、文字点选)。

7. 如何有效应对 IP 封禁问题?

参考答案

  • 构建或接入代理 IP 池(高匿透明代理)。
  • 部署分布式节点,分散单一 IP 流量。
  • 实施自适应爬取延迟(如 Scrapy 的 DOWNLOAD_DELAY)。

8. 处理动态渲染网页(SPA/Ajax)有哪些方案?

参考答案

  1. 逆向 API(首选):通过浏览器 F12 调试寻找真正的 XHR/Fetch 数据接口,直接获取结构化 JSON。
  2. 自动化工具:使用 Selenium 或 Playwright(性能更优)驱动浏览器内核进行真实渲染。
  3. 无头浏览器:如 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. 海量数据去重有哪些推荐方案?

参考答案

  1. 数据库层:设置 Unique Index(唯一索引)。
  2. 缓存层:利用 Redis 的 Set 结构。
  3. 算法层布隆过滤器 (Bloom Filter),内存占用极低,极低误报率,是亿级数据去重的最优选。

14. 面试题:口述一个高可用爬虫的设计思路

参考答案

  1. 调研:分析目标站数据加载方式(静态 vs 动态),寻找隐藏接口。
  2. 工程设计:采用协程或框架(Scrapy)提速。
  3. 健壮性:增加异常捕获重试、随机 UA 与代理切换。
  4. 后置处理:数据字段清洗及 MongoDB 持久化。
  5. 合规:设置合理的 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. 验证码处理的进阶策略?

答案

  1. 普通字符:CNN 卷积神经网络。
  2. 点选/滑块:目标检测(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 实现分布式的核心?

答案

  1. 共享队列:将调度器的 Request 队列由内存移至 Redis。
  2. 共享去重:利用 Redis 的 Set 集合存储指纹。
  3. 持久化:爬虫中断后,队列依然在 Redis 中,支持断点续爬。

25. 为什么大规模爬虫首选 MongoDB 而非 MySQL?

答案

  • Schema-free:爬虫字段经常变动,无需预先定义表结构。
  • 嵌套支持:完美存储 JSON 格式。
  • 横向扩展:分片集群处理海量数据更简单。

26. 什么是布隆过滤器(Bloom Filter)?

答案:一种空间利用率极高的概率型数据结构。它能告诉你“某个 URL 一定不存在可能存在”。 场景:亿级 URL 去重,Redis 内存占用比普通 Set 降低 90% 以上。

27. 如果爬取速度太快,除了封 IP 还会带来什么风险?

答案:可能会造成 DDoD 攻击效果,导致对方服务器崩溃。这是法律红线,必须通过自适应限速或代理池分摊流量。

28. 谈谈你的爬虫工程化经验。

答案

  • 监控:Prometheus + Grafana 监控抓取成功率、403 率、数据增长曲线。
  • 告警:当解析规则失效(页面改版)时,通过飞书/钉钉机器人秒级通知。
  • 部署:Docker 容器化部署,利用 K8s 动态伸缩爬虫实例。