爬虫常问的题目
爬虫是后端开发中经常涉及的实践技能,用于获取接口数据或解析网页数据。面试中常考的不仅是工具使用,更关注合法性意识、反爬应对策略、异常处理能力和工程化思维。本文档系统梳理爬虫面试高频题目及参考答案。
一、爬虫合法性
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 接口爬虫
- 通过F12开发者工具或抓包工具(Charles/Fiddler)抓包,查看HTTP请求方法、请求头、请求体
- 模拟接口请求:用代码构造相同的HTTP参数,向API接口发送请求
- 拿到JSON数据后解析、存储
- 适用场景:前后端分离的SPA应用、移动端API
4.2 页面爬虫
- 获取页面对应的HTML代码
- 通过Jsoup等库解析HTML文档,提取数据
- 登录表单等操作通过Selenium模拟真实用户行为
- 适用场景:数据嵌入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
- 先切换进入iframe:driver.switch_to.frame(frame_element) 或 driver.switch_to.frame("iframe_id")
- 在iframe内定位元素并操作
- 切换回主页面:driver.switch_to.default_content()
iframe的应用场景
- 多前端项目集中到同一平台(如微前端架构)
- 嵌入第三方内容(广告、视频播放器、支付页面)
- iframe页面之间可通过postMessage进行跨域通信
- 也是一种反爬手段:iframe外无法直接定位内部元素
十、其他高频面试追问
Q:同步爬取和异步爬取的区别?什么时候用异步?
- 同步:一个请求完成后才发下一个。简单但效率低
- 异步:同时发多个请求,通过回调/asyncio处理结果。吞吐量高
- 选择:批量爬取大量数据用异步(aiohttp/httpx),简单脚本用同步
Q:如何避免爬虫被检测?
- 随机User-Agent轮换
- 随机请求间隔(1~3秒)+ 随机抖动
- 使用代理IP池(高匿代理)
- 携带完整的浏览器Headers(Accept/Accept-Language等)
- 模拟人类浏览行为(先访问首页→内页→详情页)
- 使用无头浏览器(Puppeteer/Playwright)实现JS渲染
Q:Scrapy框架的工作流程?
- Engine引擎协调 → Scheduler调度Request → Downloader下载 → Spider解析响应 → Item Pipeline存储
- 中间件层:DownloaderMiddleware(请求/响应拦截) + SpiderMiddleware(结果处理)
- 支持去重过滤器(RFPDupeFilter)、并发控制、自动限速
爬虫面试核心能力模型:
- 合法性意识:robots.txt + 频率控制 + 个人信息保护法(必问)
- HTTP协议理解:状态码含义、Headers作用、代理原理
- 反爬应对能力:UA伪装、IP代理池、验证码处理、JS逆向
- 工具熟练度:Selenium/Playwright、Jsoup、Scrapy框架
- 工程化思维:分布式爬虫、异步并发、异常重试、数据去重