跳转到内容

爬虫常问的题目

💡

爬虫是后端开发中经常涉及的实践技能,用于获取接口数据或解析网页数据。面试中常考的不仅是工具使用,更关注合法性意识、反爬应对策略、异常处理能力和工程化思维。本文档系统梳理爬虫面试高频题目及参考答案。


一、爬虫合法性

Q1:爬虫的合法性如何保证?

1.1 遵守robots.txt协议

📌

robots.txt是网站根目录下的爬虫权限声明文件,规定了哪些路径禁止爬取、爬虫频率限制、是否允许商业化使用等。

1.2 控制爬取频率

  • 避免高频率请求导致网站服务器过载,设置合理的请求间隔(随机延迟)
  • 遵守robots.txt中声明的Crawl-delay指令

1.3 遵守个人信息保护法

  • 爬取用户隐私数据必须符合个人信息保护法
  • 未经允许不得收集和滥用个人数据
  • 不得将爬取数据用于非法商业用途

二、HTTP状态码与爬虫处理

Q2:爬虫常见的HTTP协议状态码有哪些?如何处理?

状态码

类别

爬虫常见场景

处理方式

200

成功

正常爬取页面/接口,返回有效数据

✅ 直接解析响应内容

301

永久重定向

旧URL已废弃(如域名更换)

更新URL列表,后续直接请求新地址

302

临时重定向

未登录跳转登录页、地区IP跳转

跟随Location跳转,但保留原URL

304

缓存重定向

资源未修改,命中缓存

直接使用本地缓存,无需重新解析

400

客户端错误

请求参数格式错误

检查URL、参数、请求体结构

401

未认证

Cookie/Token过期或未携带

重新获取登录凭证,刷新Token

403

无权限

反爬拦截:IP被封、UA被识别、频率过高

换代理IP、模拟浏览器UA、降低频率

404

资源不存在

URL过时、分页超范围

记录无效URL并跳过

405

方法不允许

API方法用错(如登录用GET)

更换为正确的HTTP方法

429

限流

高并发下触发反爬限流

降低频率、代理池分散、按Retry-After重试

500

服务器错误

后端代码执行出错

稍后重试,多次失败则记录

502

网关错误

CDN/反向代理后上游服务故障

重试请求,短时间可能恢复

503

服务不可用

网站维护、服务器负载过高

按Retry-After延迟重试,避开高峰

504

网关超时

后端处理超时(复杂查询)

延长超时、分批次请求、重试

📌

核心总结:2xx → 直接处理数据;3xx → 处理重定向或利用缓存;4xx → 客户端问题,重点关注反爬(403/429)和认证(401);5xx → 服务器问题,以重试和规避为主。


三、反爬机制与应对

Q3:有哪些常见的反爬虫机制?如何应对?

3.1 请求头校验

检测方式

应对

User-Agent检测

设置常见浏览器UA(Chrome/Firefox),使用UA池轮换

Referer检测

添加合理Referer(如从首页跳转过来的)

Cookie验证

携带登录Cookie/临时会话Cookie,定时刷新

3.2 IP限流

  • IP封锁:使用代理IP池(付费如阿布云/快代理,免费如西刺代理)
  • 验证码:接入打码平台或使用机器学习识别
  • 动态频率检测:设置随机请求间隔(如1~3秒随机延迟),模拟人类行为

3.3 数据混淆

  • 动态渲染(JS异步加载):使用Selenium/Playwright/Puppeteer模拟浏览器执行JS
  • 数据加密:逆向JS找到加密算法,在本地模拟加密逻辑
  • 假数据干扰:利用XPath/CSS选择器精确过滤有效数据

3.4 高级追踪

  • Canvas指纹/设备指纹:使用指纹浏览器(如AdsPower)、更换浏览器环境参数
  • JavaScript挑战:分析挑战逻辑,用Python/Node实现对应算法
  • 动态URL/参数(签名/时间戳):逆向参数生成逻辑,实现签名算法

3.5 iframe反爬

页面通过iframe嵌入子页面,iframe外无法定位元素。解决:通过Selenium的switch_to.frame()进入iframe内部后再定位元素。


四、接口爬虫 vs 页面爬虫

Q4:你是如何实现爬虫的?接口爬虫和页面爬虫分别怎么做?

4.1 接口爬虫

  1. 通过F12开发者工具或抓包工具(Charles/Fiddler)抓包,查看HTTP请求方法、请求头、请求体
  2. 模拟接口请求:用代码构造相同的HTTP参数,向API接口发送请求
  3. 拿到JSON数据后解析、存储
  4. 适用场景:前后端分离的SPA应用、移动端API

4.2 页面爬虫

  1. 获取页面对应的HTML代码
  2. 通过Jsoup等库解析HTML文档,提取数据
  3. 登录表单等操作通过Selenium模拟真实用户行为
  4. 适用场景:数据嵌入HTML源码(服务端渲染)、接口加密难以逆向

选择策略:优先走接口(效率高、数据干净);接口搞不定(加密、反爬强)降级走页面爬取。


五、Selenium框架

Q5:Selenium框架讲一讲

📌

Selenium是一个Web应用程序自动化测试工具,核心能力是模拟真实用户在浏览器中的操作(点击、输入、跳转、截图等)。

三大核心架构

常用操作

  • 表单提交、页面跳转、元素点击、文本输入
  • 截图(用于验证码截取)
  • 获取页面元素、执行JavaScript代码
  • 等待策略:显式等待(WebDriverWait)、隐式等待(implicitly_wait)
  • 切换窗口/iframe:driver.switch_to.window() / driver.switch_to.frame()

六、HTTP vs HTTPS 爬取

Q6:对于HTTPS接口和HTTP接口爬取有啥区别?

📌

从爬虫角度看,几乎没有区别。Python的requests库和Selenium都自动处理TLS/SSL加密,不需要额外代码。区别在于:HTTPS需要证书验证,某些内网自签名证书的网站需要在请求中设置 verify=False 跳过证书验证。

相关高频面试追问

追问

要点

GET和POST怎么选?

GET参数在URL中,有长度限制,适合查询列表;POST参数在请求体中,适合提交表单/登录

哪些Headers最重要?

User-Agent(模拟浏览器)、Referer(伪装来源)、Cookie(登录状态)、Accept-Encoding(压缩)、Content-Type

如何应对IP封禁?

代理IP池(高匿>普匿>透明)、拨号VPS动态换IP、设置IP切换频率


七、爬虫实战困难

Q7:你在爬虫中遇到过哪些困难?

7.1 抓取速度慢

  • 场景:爬取大型网站(如B站视频评论),单台服务器速度太慢
  • 解决:使用分布式爬虫框架(Scrapy-Redis)、线程池/协程池提高并发效率

7.2 接口加密

  • 场景:登录接口密码被加密,直接明文提交会被拒绝
  • 解决:通过浏览器逆向调试找到JS加密算法 → 理解加密逻辑 → 在自己代码中实现相同加密 → 请求接口

7.3 验证码拦截

  • 图形验证码 → OCR识别(Tesseract)或打码平台
  • 滑块验证码 → Selenium模拟滑动轨迹
  • 点选验证码 → 目标检测模型(YOLO)识别

八、元素定位方法

Q8:有哪些定位网页元素的方法?

📌

优先级:ID > CSS选择器 > XPath > 其他。ID最精准且稳定;CSS选择器灵活高效;XPath万能但性能略低。

定位方式

代码示例

推荐度

ID定位

driver.find_element("id", "username")

✅ 最优先

CSS选择器

driver.find_element("css selector", "input[name='password']")

✅ 推荐

XPath

driver.find_element("xpath", "//button[contains(text(), '登录')]")

✅ 万能

Name属性

driver.find_element("name", "email")

可用

Class名称

driver.find_element("class name", "btn-submit")

注意重复

标签名

driver.find_element("tag name", "a")

范围大

链接文本

driver.find_element("link text", "忘记密码")

精确匹配

部分链接文本

driver.find_element("partial link text", "忘记")

模糊匹配


九、iframe

Q9:iframe是什么?爬虫如何处理?

📌

iframe(Inline Frame,内联框架)是HTML中的一个标签,用于在当前网页中嵌入另一个独立网页。被嵌入的页面拥有独立的DOM和JavaScript上下文。

爬虫处理iframe

  1. 先切换进入iframe:driver.switch_to.frame(frame_element) 或 driver.switch_to.frame("iframe_id")
  2. 在iframe内定位元素并操作
  3. 切换回主页面:driver.switch_to.default_content()

iframe的应用场景

  • 多前端项目集中到同一平台(如微前端架构)
  • 嵌入第三方内容(广告、视频播放器、支付页面)
  • iframe页面之间可通过postMessage进行跨域通信
  • 也是一种反爬手段:iframe外无法直接定位内部元素

十、其他高频面试追问

Q:同步爬取和异步爬取的区别?什么时候用异步?

  • 同步:一个请求完成后才发下一个。简单但效率低
  • 异步:同时发多个请求,通过回调/asyncio处理结果。吞吐量高
  • 选择:批量爬取大量数据用异步(aiohttp/httpx),简单脚本用同步

Q:如何避免爬虫被检测?

  1. 随机User-Agent轮换
  2. 随机请求间隔(1~3秒)+ 随机抖动
  3. 使用代理IP池(高匿代理)
  4. 携带完整的浏览器Headers(Accept/Accept-Language等)
  5. 模拟人类浏览行为(先访问首页→内页→详情页)
  6. 使用无头浏览器(Puppeteer/Playwright)实现JS渲染

Q:Scrapy框架的工作流程?

  • Engine引擎协调 → Scheduler调度Request → Downloader下载 → Spider解析响应 → Item Pipeline存储
  • 中间件层:DownloaderMiddleware(请求/响应拦截) + SpiderMiddleware(结果处理)
  • 支持去重过滤器(RFPDupeFilter)、并发控制、自动限速

爬虫面试核心能力模型:

  1. 合法性意识:robots.txt + 频率控制 + 个人信息保护法(必问)
  2. HTTP协议理解:状态码含义、Headers作用、代理原理
  3. 反爬应对能力:UA伪装、IP代理池、验证码处理、JS逆向
  4. 工具熟练度:Selenium/Playwright、Jsoup、Scrapy框架
  5. 工程化思维:分布式爬虫、异步并发、异常重试、数据去重