爬虫与数据处理 - 面试题库


一、基础题 ⭐

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 采用异步事件驱动架构,核心组件包括:

关联知识点: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. 常见的反爬策略有哪些?如何应对?

答案: 常见反爬策略及应对方法:

关联知识点:反爬机制、代理池、动态渲染、验证码识别


三、高级题 ⭐⭐⭐

Q8. 如何处理 Scrapy 中的动态加载页面(JavaScript 渲染)?

答案: 处理动态加载页面有三种主流方案:

  1. 逆向 API 接口:通过浏览器开发者工具 Network 面板分析 XHR/Fetch 请求,找到返回 JSON 数据的真实 API,直接请求该接口。这是最高效的方式,但部分网站会对 API 加密。
  2. Selenium/Playwright 集成:使用 scrapy-seleniumscrapy-playwright 中间件,在 Scrapy 中启动无头浏览器渲染页面,等待 JS 执行完成后获取完整 HTML。缺点是性能较低、资源消耗大。
  3. 中间件拦截:使用 scrapy-fake-useragent 配合自定义 Downloader Middleware,在请求前后注入 JS 执行逻辑。适用于需要部分渲染的场景。 推荐优先尝试逆向 API,若失败再使用浏览器自动化方案。

关联知识点:动态渲染、API 逆向、Selenium、Playwright


Q9. Scrapy 如何实现分布式爬虫?有哪些方案?

答案: Scrapy 分布式爬虫的核心是将请求调度和数据存储分布到多个节点。主流方案:

关联知识点:分布式系统、Redis、消息队列、容器化部署


Q10. 爬虫中如何处理登录和 Session 保持?

答案: 处理登录和 Session 保持的步骤:

  1. 分析登录流程:使用浏览器抓包工具(如 Chrome DevTools)查看登录请求的 URL、方法、参数和响应头。
  2. 获取 CSRF Token:部分网站在登录页面嵌入 CSRF Token,需先 GET 登录页提取该值,再随 POST 请求提交。
  3. 发送登录请求:携带用户名、密码、CSRF Token 等参数发送 POST 请求。
  4. 保存 Cookie/Session:登录成功后,服务器会在响应头中返回 Set-Cookie,爬虫需保存这些 Cookie 并在后续请求中携带。
  5. Session 过期处理:检测响应状态码或页面内容判断 Session 是否过期,过期后重新执行登录流程。 Scrapy 中可使用 CookieJar 或自定义 Middleware 自动管理 Cookie。对于复杂登录(如双因素认证),可考虑使用 Selenium 模拟操作。

关联知识点:Cookie/Session、CSRF、认证机制、状态管理


Q11. 如何设计一个高可用的代理 IP 池?

答案: 高可用代理 IP 池的设计要点:

关联知识点:代理机制、健康检查、Redis、高可用设计


Q12. 爬虫数据清洗和去重的常见方法有哪些?

答案: 数据清洗方法:

数据去重方法:

关联知识点:数据清洗、去重算法、SimHash、Bloom Filter


Q13. 如何处理大规模爬虫数据的存储和查询优化?

答案: 大规模数据存储和查询优化策略:

关联知识点:数据库设计、索引优化、分库分表、列式存储


Q14. 爬虫开发中如何遵守 robots.txt 协议?有哪些法律和合规风险?

答案robots.txt 遵守

法律合规风险

关联知识点:robots.txt、数据隐私法、版权法、合规爬虫


Q15. 设计一个完整的电商商品价格监控系统,需要考虑哪些关键点?

答案: 电商价格监控系统设计要点:

关联知识点:系统架构设计、定时任务、数据管道、监控告警