爬虫与数据处理 - 面试题库
一、基础题 ⭐
Q1. 爬虫中 GET 和 POST 请求的区别是什么?
答案: GET 请求将参数附加在 URL 中,数据可见且长度受限(通常不超过 2KB),适合获取数据,可被缓存和收藏。POST 请求将数据放在请求体中,数据不可见且无长度限制,适合提交敏感或大量数据,不会被缓存。从语义上讲,GET 是幂等的,多次请求结果相同;POST 是非幂等的,多次请求可能产生不同结果(如多次提交订单)。在爬虫中,简单页面抓取通常使用 GET,而涉及登录、表单提交或复杂查询参数时使用 POST。
关联知识点:HTTP 协议、请求方法、幂等性
Q2. 常见的 HTTP 状态码有哪些?在爬虫中如何处理?
答案: 常见状态码包括:200(成功)、301(永久重定向)、302(临时重定向)、400(请求错误)、403(禁止访问)、404(页面不存在)、429(请求过于频繁)、500(服务器内部错误)、503(服务不可用)。爬虫处理策略:200 正常解析;301/302 自动跟随重定向,最多限制 10 次以防死循环;403 可能需要更换 User-Agent 或使用代理;404 记录无效链接并跳过;429 说明触发反爬限流,应降低请求频率或等待后重试;500/503 可能是服务器临时故障,可延迟后重试 2-3 次。
关联知识点:HTTP 状态码、异常处理、重试机制
Q3. 什么是 User-Agent?为什么爬虫需要设置它?
答案:
User-Agent 是 HTTP 请求头的一部分,用于标识客户端的浏览器类型、操作系统和版本等信息。服务器通过 User-Agent 判断请求来源,返回适配的页面内容。爬虫需要设置 User-Agent 的原因:一是模拟真实浏览器行为,避免被服务器识别为爬虫而拒绝访问;二是某些网站会根据 User-Agent 返回不同格式的页面(如移动端和 PC 端);三是反爬策略的基础防线,未设置或使用默认库标识(如 python-requests/2.28)的请求很容易被拦截。实践中应维护一个 User-Agent 池,随机切换以降低被识别概率。
关联知识点:HTTP 请求头、浏览器指纹、反爬基础
二、进阶题 ⭐⭐
Q4. Scrapy 框架的架构是怎样的?各组件的作用是什么?
答案: Scrapy 采用异步事件驱动架构,核心组件包括:
- Engine(引擎):控制整个系统的数据流,触发事件和事务处理。
- Scheduler(调度器):接收引擎发送的请求并入队,去重后按优先级调度。
- Downloader(下载器):负责发送 HTTP 请求并获取响应,支持并发和异步。
- Spider(爬虫):用户编写的解析逻辑,提取数据和生成新请求。
- Item Pipeline(管道):处理 Spider 提取的 Item,进行清洗、验证、存储等操作。
- Middleware(中间件):分为 Downloader Middleware(处理请求/响应)和 Spider Middleware(处理输入/输出),用于注入代理、重试等逻辑。
关联知识点:Scrapy 架构、异步编程、组件解耦
Q5. Scrapy 中如何实现请求去重?原理是什么?
答案:
Scrapy 默认使用 RFPDupeFilter 实现请求去重,原理是对请求的 URL 和方法生成指纹(SHA1 哈希),存储在一个集合中。当新请求的指纹已存在时,判定为重复请求并丢弃。指纹生成时会忽略 URL 中的 fragment 部分(# 后的内容),因为这部分不影响服务器响应。自定义去重可通过继承 BaseDupeFilter 实现,常见优化方案包括:使用 Redis 的 set 结构实现分布式去重,适用于多爬虫实例共享去重状态;使用 Bloom Filter 节省内存空间,适合海量 URL 场景,但存在极低误判率。
关联知识点:哈希算法、去重策略、分布式爬虫、Bloom Filter
Q6. Scrapy 中 Item Pipeline 的作用是什么?如何编写自定义 Pipeline?
答案:
Item Pipeline 用于处理 Spider 提取的 Item 数据,典型用途包括:数据清洗(去除空白、格式化)、验证(检查必填字段、数据类型)、去重(根据唯一标识过滤重复项)、存储(写入数据库、文件、API)。编写自定义 Pipeline 需实现 process_item(self, item, spider) 方法,返回 Item 或抛出 DropItem 异常。Pipeline 在 settings.py 中通过 ITEM_PIPELINES 字典注册,数值越小优先级越高。例如:
class PriceFilterPipeline:
def process_item(self, item, spider):
if item.get('price') and item['price'] > 0:
return item
raise DropItem(f"Invalid price: {item['price']}")
多个 Pipeline 可串联执行,形成数据处理链。
关联知识点:Scrapy Pipeline、数据验证、链式处理
Q7. 常见的反爬策略有哪些?如何应对?
答案: 常见反爬策略及应对方法:
- IP 频率限制:服务器检测同一 IP 的请求频率,超过阈值封禁。应对:使用代理 IP 池,控制请求间隔。
- User-Agent 检测:拦截非浏览器请求。应对:维护 User-Agent 池,随机切换。
- Cookie/Session 验证:要求携带有效 Cookie。应对:先请求首页获取 Cookie,再携带访问目标页。
- JavaScript 渲染:内容通过 JS 动态加载,静态 HTML 无数据。应对:使用 Selenium/Playwright 模拟浏览器,或逆向 JS 逻辑直接调用 API。
- 验证码:触发图形验证码或滑动验证。应对:接入打码平台或使用 OCR 识别。
- 行为分析:检测鼠标轨迹、点击模式等。应对:模拟真实用户行为,增加随机延迟。
关联知识点:反爬机制、代理池、动态渲染、验证码识别
三、高级题 ⭐⭐⭐
Q8. 如何处理 Scrapy 中的动态加载页面(JavaScript 渲染)?
答案: 处理动态加载页面有三种主流方案:
- 逆向 API 接口:通过浏览器开发者工具 Network 面板分析 XHR/Fetch 请求,找到返回 JSON 数据的真实 API,直接请求该接口。这是最高效的方式,但部分网站会对 API 加密。
- Selenium/Playwright 集成:使用
scrapy-selenium或scrapy-playwright中间件,在 Scrapy 中启动无头浏览器渲染页面,等待 JS 执行完成后获取完整 HTML。缺点是性能较低、资源消耗大。 - 中间件拦截:使用
scrapy-fake-useragent配合自定义 Downloader Middleware,在请求前后注入 JS 执行逻辑。适用于需要部分渲染的场景。 推荐优先尝试逆向 API,若失败再使用浏览器自动化方案。
关联知识点:动态渲染、API 逆向、Selenium、Playwright
Q9. Scrapy 如何实现分布式爬虫?有哪些方案?
答案: Scrapy 分布式爬虫的核心是将请求调度和数据存储分布到多个节点。主流方案:
- scrapy-redis:最流行的方案,将 Scheduler 和 DupeFilter 替换为 Redis 实现,多个爬虫实例共享同一个请求队列和去重集合。配置简单,适合中小型项目。
- Scrapy + RabbitMQ/Kafka:使用消息队列替代 Redis 作为请求分发中心,适合高并发、大数据量场景,支持更复杂的路由和持久化策略。
- Scrapyd + Gerapy:Scrapyd 提供远程部署和管理 API,Gerapy 提供可视化界面,适合团队协作和任务调度。
- Docker + Kubernetes:将爬虫容器化,通过 K8s 的 Deployment 和 CronJob 实现弹性伸缩和自动化调度。 分布式爬虫需解决的核心问题包括:请求去重、任务分配、数据合并、异常恢复。
关联知识点:分布式系统、Redis、消息队列、容器化部署
Q10. 爬虫中如何处理登录和 Session 保持?
答案: 处理登录和 Session 保持的步骤:
- 分析登录流程:使用浏览器抓包工具(如 Chrome DevTools)查看登录请求的 URL、方法、参数和响应头。
- 获取 CSRF Token:部分网站在登录页面嵌入 CSRF Token,需先 GET 登录页提取该值,再随 POST 请求提交。
- 发送登录请求:携带用户名、密码、CSRF Token 等参数发送 POST 请求。
- 保存 Cookie/Session:登录成功后,服务器会在响应头中返回
Set-Cookie,爬虫需保存这些 Cookie 并在后续请求中携带。 - Session 过期处理:检测响应状态码或页面内容判断 Session 是否过期,过期后重新执行登录流程。
Scrapy 中可使用
CookieJar或自定义 Middleware 自动管理 Cookie。对于复杂登录(如双因素认证),可考虑使用 Selenium 模拟操作。
关联知识点:Cookie/Session、CSRF、认证机制、状态管理
Q11. 如何设计一个高可用的代理 IP 池?
答案: 高可用代理 IP 池的设计要点:
- 代理来源:结合免费代理(爬取公开代理网站)和付费代理(购买代理服务),付费代理稳定性更高。
- 验证机制:定期(如每 5 分钟)对代理进行可用性测试,发送请求到目标网站或公共检测接口(如
http://httpbin.org/ip),记录响应时间和成功率。 - 评分系统:为每个代理维护健康度评分,基于响应速度、成功率、使用次数等指标,优先使用高评分代理。
- 自动剔除:连续失败 3 次的代理标记为不可用,冷却一段时间后再测试;超过冷却期仍失败的代理永久移除。
- 并发控制:单个代理同时只允许有限并发请求,避免被封。
- 存储方案:使用 Redis 的 Sorted Set 按评分排序,快速取出最优代理。 整体架构:采集模块 → 验证模块 → 存储模块 → 调度模块,形成闭环。
关联知识点:代理机制、健康检查、Redis、高可用设计
Q12. 爬虫数据清洗和去重的常见方法有哪些?
答案: 数据清洗方法:
- 格式标准化:日期统一为 ISO 8601 格式,金额统一货币单位和精度,文本去除首尾空白和 HTML 标签。
- 异常值处理:数值型数据使用 IQR 或 3σ 原则识别异常值,文本数据检查长度和字符集合法性。
- 缺失值处理:必填字段缺失则丢弃记录,可选字段填充默认值或标记为
null。 - 文本清洗:使用正则表达式去除特殊字符、统一大小写、繁简转换。
数据去重方法:
- 精确去重:基于唯一标识(如 URL、ID)使用哈希集合或数据库唯一索引。
- 模糊去重:使用编辑距离(Levenshtein)、SimHash 或 MinHash 检测近似重复内容,适用于标题或正文相似性判断。
- 增量去重:将已处理数据的指纹存储到 Bloom Filter 或 Redis,新数据先查指纹再决定是否处理。
关联知识点:数据清洗、去重算法、SimHash、Bloom Filter
Q13. 如何处理大规模爬虫数据的存储和查询优化?
答案: 大规模数据存储和查询优化策略:
- 分库分表:按时间(如按月分表)或业务维度(如按地区、类别)拆分数据,避免单表数据量过大导致性能下降。
- 索引优化:为高频查询字段建立索引,避免全表扫描;复合索引遵循最左前缀原则;定期分析慢查询日志优化索引。
- 存储引擎选择:结构化数据使用 MySQL/PostgreSQL,半结构化数据使用 MongoDB,全文检索使用 Elasticsearch,时序数据使用 InfluxDB。
- 批量写入:避免逐条 INSERT,使用批量插入(如 MySQL 的
INSERT INTO ... VALUES (),(),())或消息队列异步写入,提升吞吐量。 - 冷热分离:近期数据存储在高性能 SSD,历史数据归档到廉价存储(如 OSS、HDFS),降低存储成本。
- 数据压缩:使用 Parquet、ORC 等列式存储格式,配合 Snappy 或 Zstd 压缩,减少存储空间和 I/O 开销。
关联知识点:数据库设计、索引优化、分库分表、列式存储
Q14. 爬虫开发中如何遵守 robots.txt 协议?有哪些法律和合规风险?
答案: robots.txt 遵守:
- 爬虫启动前先请求
https://目标域名/robots.txt,解析User-agent和Disallow规则,判断当前爬虫标识是否被禁止访问特定路径。 - Python 可使用
urllib.robotparser模块自动解析和验证。 - 尊重
Crawl-delay指令,控制请求间隔。
法律合规风险:
- 数据隐私:爬取个人信息(如手机号、邮箱)可能违反《个人信息保护法》和 GDPR,需确保数据脱敏或获得授权。
- 版权侵权:爬取受版权保护的内容(如文章、图片、视频)并用于商业用途可能构成侵权。
- 不正当竞争:爬取竞争对手核心数据用于自身产品可能违反《反不正当竞争法》。
- 系统干扰:高频爬取导致目标网站服务降级或瘫痪,可能构成破坏计算机信息系统罪。
- 合规建议:优先使用官方 API,控制爬取频率,不爬取敏感数据,保留爬取日志以备审计。
关联知识点:robots.txt、数据隐私法、版权法、合规爬虫
Q15. 设计一个完整的电商商品价格监控系统,需要考虑哪些关键点?
答案: 电商价格监控系统设计要点:
- 爬虫层:针对不同电商平台设计独立 Spider,处理各自的页面结构和反爬策略;使用代理池和 User-Agent 池应对封禁;设置合理的爬取频率避免对目标站点造成压力。
- 调度层:使用定时任务(如 Airflow 或 Cron)控制抓取周期,热门商品高频监控(每小时),长尾商品低频(每天);支持手动触发和增量更新。
- 数据层:原始数据存入 MongoDB 保留完整快照,结构化数据(商品 ID、价格、时间)存入 MySQL 便于查询;使用 Redis 缓存当前价格实现快速比对。
- 分析层:计算价格趋势、历史最低价、降价幅度;设置价格阈值触发告警(邮件、钉钉、企业微信)。
- 监控与告警:监控爬虫成功率、响应时间、数据质量;异常时自动告警并记录日志。
- 合规性:遵守各平台 robots.txt,不爬取用户评论等敏感数据,控制请求频率。
关联知识点:系统架构设计、定时任务、数据管道、监控告警